Compare commits
12 Commits
957a823d24
...
the_gate
| Author | SHA1 | Date | |
|---|---|---|---|
| 3317747bdd | |||
| 5e431e5a85 | |||
| 3cba52f4ae | |||
| 34230e18e5 | |||
| cc6619f9a0 | |||
| 3fcd960c9c | |||
| 96de65cde0 | |||
| f1343ea200 | |||
| cfd6c97f32 | |||
| 134a85111e | |||
| 47cb2c965f | |||
| 076ee0be68 |
292
.gitignore
vendored
Normal file
292
.gitignore
vendored
Normal file
@ -0,0 +1,292 @@
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
##
|
||||
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
||||
|
||||
# User-specific files
|
||||
*.suo
|
||||
*.user
|
||||
*.userosscache
|
||||
*.sln.docstates
|
||||
|
||||
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||
*.userprefs
|
||||
|
||||
# Build results
|
||||
[Dd]ebug/
|
||||
[Dd]ebugPublic/
|
||||
[Rr]elease/
|
||||
[Rr]eleases/
|
||||
x64/
|
||||
x86/
|
||||
bld/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
[Ll]og/
|
||||
|
||||
# Visual Studio 2015 cache/options directory
|
||||
.vs/
|
||||
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||
#wwwroot/
|
||||
|
||||
# MSTest test Results
|
||||
[Tt]est[Rr]esult*/
|
||||
[Bb]uild[Ll]og.*
|
||||
|
||||
# NUNIT
|
||||
*.VisualState.xml
|
||||
TestResult.xml
|
||||
|
||||
# Build Results of an ATL Project
|
||||
[Dd]ebugPS/
|
||||
[Rr]eleasePS/
|
||||
dlldata.c
|
||||
|
||||
# .NET Core
|
||||
project.lock.json
|
||||
project.fragment.lock.json
|
||||
artifacts/
|
||||
**/Properties/launchSettings.json
|
||||
|
||||
*_i.c
|
||||
*_p.c
|
||||
*_i.h
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.tmp_proj
|
||||
*.log
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
.builds
|
||||
*.pidb
|
||||
*.svclog
|
||||
*.scc
|
||||
|
||||
# Chutzpah Test files
|
||||
_Chutzpah*
|
||||
|
||||
# Visual C++ cache files
|
||||
ipch/
|
||||
*.aps
|
||||
*.ncb
|
||||
*.opendb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.cachefile
|
||||
*.VC.db
|
||||
*.VC.VC.opendb
|
||||
|
||||
# Visual Studio profiler
|
||||
*.psess
|
||||
*.vsp
|
||||
*.vspx
|
||||
*.sap
|
||||
|
||||
# TFS 2012 Local Workspace
|
||||
$tf/
|
||||
|
||||
# Guidance Automation Toolkit
|
||||
*.gpState
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
_ReSharper*/
|
||||
*.[Rr]e[Ss]harper
|
||||
*.DotSettings.user
|
||||
|
||||
# JustCode is a .NET coding add-in
|
||||
.JustCode
|
||||
|
||||
# TeamCity is a build add-in
|
||||
_TeamCity*
|
||||
|
||||
# DotCover is a Code Coverage Tool
|
||||
*.dotCover
|
||||
|
||||
# Visual Studio code coverage results
|
||||
*.coverage
|
||||
*.coveragexml
|
||||
|
||||
# NCrunch
|
||||
_NCrunch_*
|
||||
.*crunch*.local.xml
|
||||
nCrunchTemp_*
|
||||
|
||||
# MightyMoose
|
||||
*.mm.*
|
||||
AutoTest.Net/
|
||||
|
||||
# Web workbench (sass)
|
||||
.sass-cache/
|
||||
|
||||
# Installshield output folder
|
||||
[Ee]xpress/
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
DocProject/buildhelp/
|
||||
DocProject/Help/*.HxT
|
||||
DocProject/Help/*.HxC
|
||||
DocProject/Help/*.hhc
|
||||
DocProject/Help/*.hhk
|
||||
DocProject/Help/*.hhp
|
||||
DocProject/Help/Html2
|
||||
DocProject/Help/html
|
||||
|
||||
# Click-Once directory
|
||||
publish/
|
||||
|
||||
# Publish Web Output
|
||||
*.[Pp]ublish.xml
|
||||
*.azurePubxml
|
||||
# TODO: Comment the next line if you want to checkin your web deploy settings
|
||||
# but database connection strings (with potential passwords) will be unencrypted
|
||||
*.pubxml
|
||||
*.publishproj
|
||||
|
||||
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
||||
# checkin your Azure Web App publish settings, but sensitive information contained
|
||||
# in these scripts will be unencrypted
|
||||
PublishScripts/
|
||||
|
||||
# NuGet Packages
|
||||
*.nupkg
|
||||
# The packages folder can be ignored because of Package Restore
|
||||
**/packages/*
|
||||
# except build/, which is used as an MSBuild target.
|
||||
!**/packages/build/
|
||||
# Uncomment if necessary however generally it will be regenerated when needed
|
||||
#!**/packages/repositories.config
|
||||
# NuGet v3's project.json files produces more ignorable files
|
||||
*.nuget.props
|
||||
*.nuget.targets
|
||||
|
||||
# Microsoft Azure Build Output
|
||||
csx/
|
||||
*.build.csdef
|
||||
|
||||
# Microsoft Azure Emulator
|
||||
ecf/
|
||||
rcf/
|
||||
|
||||
# Windows Store app package directories and files
|
||||
AppPackages/
|
||||
BundleArtifacts/
|
||||
Package.StoreAssociation.xml
|
||||
_pkginfo.txt
|
||||
|
||||
# Visual Studio cache files
|
||||
# files ending in .cache can be ignored
|
||||
*.[Cc]ache
|
||||
# but keep track of directories ending in .cache
|
||||
!*.[Cc]ache/
|
||||
|
||||
# Others
|
||||
ClientBin/
|
||||
~$*
|
||||
*~
|
||||
*.dbmdl
|
||||
*.dbproj.schemaview
|
||||
*.jfm
|
||||
*.pfx
|
||||
*.publishsettings
|
||||
orleans.codegen.cs
|
||||
|
||||
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
||||
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
||||
#bower_components/
|
||||
|
||||
# RIA/Silverlight projects
|
||||
Generated_Code/
|
||||
|
||||
# Backup & report files from converting an old project file
|
||||
# to a newer Visual Studio version. Backup files are not needed,
|
||||
# because we have git ;-)
|
||||
_UpgradeReport_Files/
|
||||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
UpgradeLog*.htm
|
||||
|
||||
# SQL Server files
|
||||
*.mdf
|
||||
*.ldf
|
||||
*.ndf
|
||||
|
||||
# Business Intelligence projects
|
||||
*.rdl.data
|
||||
*.bim.layout
|
||||
*.bim_*.settings
|
||||
|
||||
# Microsoft Fakes
|
||||
FakesAssemblies/
|
||||
|
||||
# GhostDoc plugin setting file
|
||||
*.GhostDoc.xml
|
||||
|
||||
# Node.js Tools for Visual Studio
|
||||
.ntvs_analysis.dat
|
||||
node_modules/
|
||||
|
||||
# Typescript v1 declaration files
|
||||
typings/
|
||||
|
||||
# Visual Studio 6 build log
|
||||
*.plg
|
||||
|
||||
# Visual Studio 6 workspace options file
|
||||
*.opt
|
||||
|
||||
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
||||
*.vbw
|
||||
|
||||
# Visual Studio LightSwitch build output
|
||||
**/*.HTMLClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/ModelManifest.xml
|
||||
**/*.Server/GeneratedArtifacts
|
||||
**/*.Server/ModelManifest.xml
|
||||
_Pvt_Extensions
|
||||
|
||||
# Paket dependency manager
|
||||
.paket/paket.exe
|
||||
paket-files/
|
||||
|
||||
# FAKE - F# Make
|
||||
.fake/
|
||||
|
||||
# JetBrains Rider
|
||||
.idea/
|
||||
*.sln.iml
|
||||
|
||||
# CodeRush
|
||||
.cr/
|
||||
|
||||
# Python Tools for Visual Studio (PTVS)
|
||||
__pycache__/
|
||||
*.pyc
|
||||
|
||||
# Cake - Uncomment if you are using it
|
||||
# tools/**
|
||||
# !tools/packages.config
|
||||
|
||||
# Telerik's JustMock configuration file
|
||||
*.jmconfig
|
||||
|
||||
# BizTalk build output
|
||||
*.btp.cs
|
||||
*.btm.cs
|
||||
*.odx.cs
|
||||
*.xsd.cs
|
||||
|
||||
# Ignore output directories
|
||||
out/*.exe
|
||||
out.html
|
||||
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2017 Roope Mäkinen
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
72
README.md
72
README.md
@ -1,2 +1,72 @@
|
||||
# 4k_synthwave
|
||||
# Leviathan 2.0
|
||||
Leviathan is a simple "framework" for developing small (around 1-8 kilobyte) [Demoscene](https://en.wikipedia.org/wiki/Demoscene) productions. It is primarily developed for creating the [Prismbeings](https://www.pouet.net/groups.php?which=12646) 4k Intros. "Intro" is parlance for a size-wise small Demo.
|
||||
|
||||
## "Features"
|
||||
* Kept as simple as possible, made for productivity.
|
||||
* No external dependencies, instantly ready for development.
|
||||
* Readymade configurations for different use cases.
|
||||
* Automated shader minification upon compilation.
|
||||
* Simple unintrusive editor mode with seeking and hot reloading.
|
||||
* Easy to customize for your needs.
|
||||
|
||||
## Compatibility
|
||||
Current version intended to be used with Visual Studio 2017 (any version). Make sure you have a version with the latest Windows SDK installed (at least version 10.0.17134.0), or use version 8.1. With some extra configuration 2015 and 2013 should work as well. Leviathan is is very Windows-specific and isn't really sensibly portable anywhere else.
|
||||
|
||||
### Components
|
||||
Leviathan requires these componens to be installed with the Visual Studio configuration. Run the Visual Studio Installer to check you have at least these installed:
|
||||
* **VC++ 2017 version 15.9 v14.16 latest v141 tools**, or VC++ 2015.3 v14.00 (v140)
|
||||
* **Windows 10 SDK** (any version should be fine, Leviathan currently defaults to 10.0.17134.0, change as needed) or Windows 8.1 SDK
|
||||
* Windows Universal CRT SDK
|
||||
* Windows Universal C Runtime
|
||||
|
||||
## Configurations
|
||||
This section describes the different build configurations available from Visual Studio IDE
|
||||
### Heavy Release
|
||||
Uses heavier Crinkler settings to squeeze out maximum compression (note though that the /VERYSLOW flag could sometimes backfire and produce a larger executable). Also doesn't do shader minification since it assumes the user is performing hand minifications to the .inl source, which would be overwritten by the Shader Minifier.
|
||||
### Release
|
||||
Generally recommended for producing a final executable to be released. Uses moderate Crinkler settings.
|
||||
### Snapshot
|
||||
Use for general development. Only minimal crinklering but nothing extra included. Useful still for keeping track of relative size changes. This configuration overwrites Release configuration binaries, but doesn't generate and overwrite crinkler report.
|
||||
### Debug
|
||||
Deprecated, might work but currently not really useful and not updated. Editor covers everything in this configuration.
|
||||
### Editor
|
||||
Creates a bigger exe similar to Debug, but with keyboard controls for pausing and seeking around temporally. Requires a pre-rendered copy of the audio track used (well, not a must but...). Overwrites Debug configuration binaries.
|
||||
|
||||
## Build Flags
|
||||
This section describes the preprocessor definitions available for various features and size optimizations.
|
||||
### OPENGL_DEBUG
|
||||
Checks for shader compilation errors on initialization. Also enables to use the CHECK_ERRORS macro on debug.h. You want to leave this disabled in the final release obviously.
|
||||
### FULLSCREEN
|
||||
Changes the display mode to fullscreen instead of a static window. You want to use this in your final release but probably not while developing and debugging. Disabling this saves around 20 bytes.
|
||||
### DESPERATE
|
||||
Enabling this disables message handling, which isn't strictly necessary but makes running the intro much more reliable and compatible. Enabling this saves around 20 bytes.
|
||||
### BREAK_COMPATIBILITY
|
||||
Enabling this uses a pixel format descriptor that uses parameters that are mostly zeroes. This improves the compressability at the cost of violating the API specifications. You might be able to run your intro currently, but might break in the future or on other peoples' configurations right now. Enabling this saves around 5 bytes.
|
||||
### POST_PASS
|
||||
Enables using the OpenGL backbuffer as a framebuffer and texture to perform simple post processing or other functionality.
|
||||
### USE_MIPMAPS
|
||||
Generates mipmaps for the backbuffer texture.
|
||||
### USE_AUDIO
|
||||
Disabling this doesn't include or init 4klang at all.
|
||||
### NO_UNIFORMS
|
||||
Enables using the gl_Color vertex attribute to pass variables to the shader instead of the usual uniform uploading. This saves one function import and around 10 bytes.
|
||||
|
||||
## Contributing
|
||||
Fork your own and submit a pull request, ideas always welcome. Please don't add any additional dependencies unless it's a single-file-header library or something similar, and non-GPL licensed. Inclusion of CMake or other such tools is also not considered.
|
||||
|
||||
## TODO
|
||||
* Automatically render and dump audio in Editor mode if no .wav already exists.
|
||||
* Support for more softsynths?
|
||||
* Editor mode overlays (non-interactive seekbar, etc.).
|
||||
* More functionality to add further render passes easily.
|
||||
* Continue Structuring the code better so not everything is inlined in the main loop.
|
||||
* Write out a version in assembly to use in the Release configuration.
|
||||
|
||||
## Acknowledgements
|
||||
* Rimina for initial motivation and OpenGL debug functions.
|
||||
* LJ for giving suggestions for some nice hacks.
|
||||
* Fizzer for help with implementing some of said hacks.
|
||||
* iq for the original 4k intro framework.
|
||||
* Mentor and Blueberry for Crinkler.
|
||||
* LLB for Shader Minifier.
|
||||
* Numerous people for various resources and information: auld, ps, cce, msqrt, ferris, yzi, las to name a few.
|
||||
|
||||
381
_song.yml
Normal file
381
_song.yml
Normal file
@ -0,0 +1,381 @@
|
||||
bpm: 138
|
||||
rowsperbeat: 4
|
||||
score:
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
order: [-1, -1, -1, -1, 0, -1, 1, -1, 0, -1, 1, -1, 2, -1, 1, -1, 3, -1, 1, -1, 2, -1, 1, -1, 4, -1, 1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 2, -1, -1, -1, 2, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 4, -1, 2, -1, 0, -1, -1, -1, 4, -1, 2, -1, 0, -1, -1, -1, 0, -1, -1, -1, 2, -1, 2, -1, 3, 5, 2, 6, 0, -1, -1, -1, 0, -1, 1, -1, 0, -1, 1, -1, 0, -1, 1, -1]
|
||||
patterns: [[33, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [26, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 28, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 31, 1, 1, 1, 1, 1, 1, 1]]
|
||||
- numvoices: 1
|
||||
order: [-1, -1, -1, -1, 0, -1, 1, -1, 0, -1, 1, -1, 2, -1, 1, -1, 3, -1, 1, -1, 2, -1, 1, -1, 4, -1, 1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 2, -1, -1, -1, 2, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 4, -1, 2, -1, 0, -1, -1, -1, 4, -1, 2, -1, 0, -1, -1, -1, 0, -1, -1, -1, 5, -1, 5, -1, 6, 7, 5, 8, 9, -1, -1, -1, 9, -1, 1, -1, 9, -1, 1, -1, 0, -1, 1, -1]
|
||||
patterns: [[45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [38, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [43, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [53, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [50, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 52, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 55, 1, 1, 1, 1, 1, 1, 1], [57, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]
|
||||
- numvoices: 1
|
||||
order: [-1, -1, -1, -1, 0, -1, 1, -1, 2, -1, 1, -1, 3, -1, 1, -1, 4, -1, 1, -1, 3, -1, 1, -1, 5, -1, 1, -1, 6, 7, 6, 7, 6, 7, 6, 8, 6, 7, 6, 7, 6, 7, 6, 7, 9, 10, 9, 10, 9, 10, 9, 10, 6, 7, 6, 7, 6, 7, 6, 7, 6, 7, 6, 7, 5, -1, 3, -1, 6, 7, 6, 7, 11, 12, 9, 10, 6, 7, 6, 13, 6, 7, 6, 7, 9, 10, 9, 14, 15, 16, 9, 17, 6, 6, 6, 6, 0, -1, 1, -1, 0, -1, 1, -1, 2, -1, 1, -1]
|
||||
patterns: [[57, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [53, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [50, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [55, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [57, 0, 57, 0, 57, 0, 57, 0, 57, 0, 57, 0, 57, 0, 57, 0], [57, 0, 57, 0, 57, 0, 57, 0, 57, 0, 57, 0, 67, 0, 69, 0], [57, 0, 57, 0, 57, 0, 57, 0, 64, 1, 62, 1, 60, 1, 55, 1], [53, 0, 53, 0, 53, 0, 53, 0, 53, 0, 53, 0, 53, 0, 53, 0], [53, 0, 53, 0, 53, 0, 53, 0, 53, 0, 53, 0, 63, 0, 65, 0], [55, 0, 55, 0, 55, 0, 55, 0, 55, 0, 55, 0, 55, 0, 55, 0], [55, 0, 55, 0, 55, 0, 55, 0, 55, 0, 55, 0, 65, 0, 67, 0], [57, 0, 57, 0, 57, 0, 57, 0, 57, 0, 57, 0, 69, 0, 57, 0], [53, 0, 53, 0, 53, 0, 53, 0, 53, 0, 53, 0, 53, 0, 65, 0], [50, 0, 50, 0, 50, 0, 50, 0, 50, 0, 50, 0, 50, 0, 50, 0], [50, 0, 50, 0, 50, 0, 50, 0, 52, 0, 52, 0, 52, 0, 52, 0], [53, 0, 53, 0, 53, 0, 53, 0, 55, 0, 55, 0, 55, 0, 55, 0]]
|
||||
- numvoices: 1
|
||||
order: [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
|
||||
patterns: [[60, 1, 1, 1, 1, 1, 1, 1, 60, 1, 1, 1, 1, 1, 1, 1], [60, 1, 1, 1, 1, 1, 1, 1, 1, 1, 60, 1, 1, 1, 60, 1], [60, 1, 1, 1, 60, 1, 1, 1, 60, 1, 1, 1, 60, 1, 1, 1]]
|
||||
- numvoices: 1
|
||||
order: [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
|
||||
patterns: [[1, 1, 1, 1, 1, 1, 1, 1, 72, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 72, 1, 1, 1, 72, 1, 1, 1], [1, 1, 1, 1, 72, 1, 1, 1, 1, 1, 1, 1, 72, 1, 1, 1]]
|
||||
- numvoices: 1
|
||||
order: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 1, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, -1, 4, -1]
|
||||
patterns: [[88, 0, 83, 0, 84, 0, 81, 0, 88, 0, 83, 0, 84, 0, 81, 0], [91, 0, 83, 0, 84, 0, 81, 0, 91, 0, 83, 0, 84, 0, 81, 0], [89, 0, 83, 0, 84, 0, 81, 0, 89, 0, 83, 0, 84, 0, 81, 0], [45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]
|
||||
- numvoices: 1
|
||||
order: [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, -1, 2, 3, 4, 5, -1, 0, 6, -1, -1, 0, 6, -1, 7, 0, -1, -1, -1, 8, -1, -1, 9, -1, -1, -1, -1, 10, 7, 11, 12, 0, -1, -1, 13, 10, 7, 11, 7, 8, -1, 14, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
|
||||
patterns: [[83, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 84, 1, 81, 1], [1, 1, 1, 1, 1, 1, 1, 1, 72, 1, 74, 1, 76, 1, 1, 1], [71, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 72, 1, 1, 1], [69, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 84, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 86, 1, 1, 1, 1, 1, 1, 1], [81, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [88, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [84, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 83, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1]]
|
||||
- numvoices: 1
|
||||
order: [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1, 13, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
|
||||
patterns: [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 81, 83, 84, 86], [88, 83, 84, 81, 88, 83, 84, 81, 88, 83, 84, 81, 88, 83, 84, 81], [91, 83, 84, 81, 91, 83, 84, 81, 91, 83, 84, 81, 91, 83, 84, 81], [93, 83, 84, 81, 93, 83, 84, 81, 93, 83, 84, 81, 93, 83, 84, 81], [89, 81, 83, 84, 86, 88, 89, 91, 89, 81, 83, 84, 83, 84, 86, 88], [89, 79, 81, 83, 81, 83, 84, 86, 84, 86, 88, 89, 88, 84, 86, 83], [91, 88, 89, 86, 88, 84, 86, 83, 84, 81, 83, 79, 81, 77, 79, 76], [77, 74, 76, 72, 74, 71, 72, 69, 71, 67, 69, 65, 67, 69, 71, 74], [77, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 76, 1, 77, 76], [74, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 69, 71, 72, 76], [84, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 83, 1, 1, 1], [81, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 79, 1, 1, 1], [81, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]
|
||||
rowsperpattern: 16
|
||||
length: 108
|
||||
patch:
|
||||
- name: 80s lead
|
||||
numvoices: 2
|
||||
units:
|
||||
- type: oscillator
|
||||
id: 1089
|
||||
parameters: {color: 128, detune: 80, gain: 128, lfo: 0, phase: 0, shape: 64, stereo: 1, transpose: 76, type: 1, unison: 3}
|
||||
- type: oscillator
|
||||
id: 1090
|
||||
parameters: {color: 128, detune: 57, gain: 128, lfo: 0, phase: 0, shape: 64, stereo: 1, transpose: 64, type: 1, unison: 2}
|
||||
- type: addp
|
||||
id: 1091
|
||||
parameters: {stereo: 1}
|
||||
- type: envelope
|
||||
id: 1092
|
||||
parameters: {attack: 37, decay: 66, gain: 90, release: 54, stereo: 1, sustain: 81}
|
||||
- type: mulp
|
||||
id: 1098
|
||||
parameters: {stereo: 1}
|
||||
- type: pan
|
||||
id: 1096
|
||||
parameters: {panning: 60, stereo: 1}
|
||||
- type: filter
|
||||
id: 1108
|
||||
parameters: {bandpass: 0, frequency: 84, highpass: 0, lowpass: 1, negbandpass: 1, neghighpass: 0, resonance: 128, stereo: 1}
|
||||
- type: gain
|
||||
id: 1119
|
||||
parameters: {gain: 64, stereo: 1}
|
||||
- type: filter
|
||||
id: 1133
|
||||
parameters: {bandpass: 0, frequency: 10, highpass: 0, lowpass: 1, negbandpass: 0, neghighpass: 1, resonance: 88, stereo: 1}
|
||||
- type: sync
|
||||
id: 1141
|
||||
parameters: {}
|
||||
- type: outaux
|
||||
id: 1097
|
||||
parameters: {auxgain: 34, outgain: 34, stereo: 1}
|
||||
- name: 80s bass
|
||||
numvoices: 1
|
||||
units:
|
||||
- type: oscillator
|
||||
id: 3
|
||||
parameters: {color: 128, detune: 64, gain: 128, lfo: 0, phase: 64, shape: 64, stereo: 1, transpose: 64, type: 1, unison: 0}
|
||||
- type: oscillator
|
||||
id: 4
|
||||
parameters: {color: 128, detune: 76, gain: 128, lfo: 0, phase: 30, shape: 64, stereo: 1, transpose: 52, type: 1, unison: 1}
|
||||
- type: addp
|
||||
id: 1084
|
||||
parameters: {stereo: 1}
|
||||
- type: envelope
|
||||
id: 1085
|
||||
parameters: {attack: 0, decay: 69, gain: 100, release: 68, stereo: 1, sustain: 50}
|
||||
- type: send
|
||||
id: 1088
|
||||
parameters: {amount: 100, port: 0, sendpop: 0, stereo: 1, target: 1087, voice: 0}
|
||||
- type: mulp
|
||||
id: 1086
|
||||
parameters: {stereo: 1}
|
||||
- type: distort
|
||||
id: 1107
|
||||
parameters: {drive: 112, stereo: 1}
|
||||
- type: filter
|
||||
id: 1087
|
||||
parameters: {bandpass: 0, frequency: 30, highpass: 1, lowpass: 1, negbandpass: 1, neghighpass: 0, resonance: 40, stereo: 1}
|
||||
- type: pan
|
||||
id: 284
|
||||
parameters: {panning: 64, stereo: 1}
|
||||
- type: gain
|
||||
id: 1121
|
||||
parameters: {gain: 110, stereo: 1}
|
||||
- type: outaux
|
||||
id: 15
|
||||
parameters: {auxgain: 30, outgain: 30, stereo: 1}
|
||||
- name: Kick
|
||||
comment: 'Suggested note: C-3'
|
||||
numvoices: 1
|
||||
units:
|
||||
- type: envelope
|
||||
id: 261
|
||||
parameters: {attack: 0, decay: 49, gain: 128, release: 0, stereo: 0, sustain: 0}
|
||||
- type: noise
|
||||
id: 269
|
||||
parameters: {gain: 128, shape: 74, stereo: 0}
|
||||
- type: send
|
||||
id: 268
|
||||
parameters: {amount: 96, port: 0, sendpop: 1, stereo: 0, target: 262, voice: 0}
|
||||
- type: oscillator
|
||||
id: 262
|
||||
parameters: {color: 128, detune: 64, gain: 128, phase: 0, shape: 64, stereo: 0, transpose: 57, type: 0, unison: 0}
|
||||
- type: filter
|
||||
id: 281
|
||||
parameters: {bandpass: 0, frequency: 91, highpass: 0, lowpass: 0, negbandpass: 1, neghighpass: 1, resonance: 98, stereo: 0}
|
||||
- type: mulp
|
||||
id: 263
|
||||
parameters: {stereo: 0}
|
||||
- type: envelope
|
||||
id: 280
|
||||
parameters: {attack: 0, decay: 64, gain: 80, release: 64, stereo: 0, sustain: 0}
|
||||
- type: send
|
||||
id: 1110
|
||||
parameters: {amount: 75, port: 0, sendpop: 1, stereo: 0, target: 277, voice: 0}
|
||||
- type: noise
|
||||
id: 275
|
||||
parameters: {gain: 72, shape: 24, stereo: 0}
|
||||
- type: send
|
||||
id: 276
|
||||
parameters: {amount: 84, port: 0, sendpop: 1, stereo: 0, target: 277, voice: 0}
|
||||
- type: envelope
|
||||
id: 274
|
||||
parameters: {attack: 45, decay: 70, gain: 128, release: 0, stereo: 0, sustain: 0}
|
||||
- type: send
|
||||
id: 1118
|
||||
parameters: {amount: 0, port: 0, sendpop: 0, stereo: 0, target: 1119, voice: 0}
|
||||
- type: send
|
||||
id: 1122
|
||||
parameters: {amount: 0, port: 0, sendpop: 0, stereo: 0, target: 1121, voice: 0}
|
||||
- type: send
|
||||
id: 1124
|
||||
parameters: {amount: 32, port: 0, sendpop: 0, stereo: 0, target: 1123, voice: 0}
|
||||
- type: oscillator
|
||||
id: 277
|
||||
parameters: {color: 128, detune: 64, gain: 128, phase: 0, shape: 64, stereo: 0, transpose: 45, type: 0}
|
||||
- type: mulp
|
||||
id: 279
|
||||
parameters: {stereo: 0}
|
||||
- type: addp
|
||||
id: 271
|
||||
parameters: {stereo: 0}
|
||||
- type: pan
|
||||
id: 294
|
||||
parameters: {panning: 64, stereo: 0}
|
||||
- type: filter
|
||||
id: 1132
|
||||
parameters: {bandpass: 0, frequency: 11, highpass: 0, lowpass: 1, negbandpass: 0, neghighpass: 1, resonance: 128, stereo: 1}
|
||||
- type: outaux
|
||||
id: 266
|
||||
parameters: {auxgain: 14, outgain: 50, stereo: 1}
|
||||
- type: oscillator
|
||||
id: 1134
|
||||
parameters: {color: 64, detune: 64, gain: 128, lfo: 1, phase: 0, shape: 64, stereo: 0, transpose: 52, type: 0}
|
||||
- type: sync
|
||||
id: 1135
|
||||
parameters: {}
|
||||
- type: pop
|
||||
id: 1136
|
||||
parameters: {stereo: 0}
|
||||
- name: snare edm 3
|
||||
comment: 'Suggested range: E-4'
|
||||
numvoices: 1
|
||||
units:
|
||||
- type: envelope
|
||||
id: 217
|
||||
parameters: {attack: 0, decay: 67, gain: 29, release: 0, stereo: 0, sustain: 0}
|
||||
- type: oscillator
|
||||
id: 218
|
||||
parameters: {color: 128, detune: 64, gain: 80, lfo: 0, phase: 0, shape: 64, stereo: 0, transpose: 57, type: 0, unison: 0}
|
||||
- type: mulp
|
||||
id: 221
|
||||
parameters: {stereo: 0}
|
||||
- type: envelope
|
||||
id: 222
|
||||
parameters: {attack: 0, decay: 69, gain: 54, release: 0, stereo: 0, sustain: 0}
|
||||
- type: noise
|
||||
id: 223
|
||||
parameters: {gain: 31, shape: 14, stereo: 0}
|
||||
- type: mulp
|
||||
id: 224
|
||||
parameters: {stereo: 0}
|
||||
- type: filter
|
||||
id: 201
|
||||
parameters: {bandpass: 0, frequency: 78, highpass: 0, lowpass: 1, negbandpass: 0, neghighpass: 1, resonance: 127, stereo: 0}
|
||||
- type: filter
|
||||
id: 225
|
||||
parameters: {bandpass: 0, frequency: 122, highpass: 0, lowpass: 1, negbandpass: 0, neghighpass: 0, resonance: 112, stereo: 0}
|
||||
- type: addp
|
||||
id: 226
|
||||
parameters: {stereo: 0}
|
||||
- type: distort
|
||||
id: 338
|
||||
parameters: {drive: 108, stereo: 0}
|
||||
- type: pan
|
||||
id: 231
|
||||
parameters: {panning: 63, stereo: 0}
|
||||
- type: outaux
|
||||
id: 232
|
||||
parameters: {auxgain: 52, outgain: 58, stereo: 1}
|
||||
- type: envelope
|
||||
id: 233
|
||||
parameters: {attack: 37, decay: 47, gain: 128, release: 0, stereo: 0, sustain: 0}
|
||||
- type: send
|
||||
id: 234
|
||||
parameters: {amount: 69, port: 0, sendpop: 1, target: 218}
|
||||
- type: envelope
|
||||
id: 235
|
||||
parameters: {attack: 53, decay: 58, gain: 128, release: 0, stereo: 0, sustain: 0}
|
||||
- type: send
|
||||
id: 236
|
||||
parameters: {amount: 0, port: 0, sendpop: 1, target: 201}
|
||||
- type: envelope
|
||||
id: 237
|
||||
parameters: {attack: 53, decay: 73, gain: 128, release: 0, stereo: 0, sustain: 0}
|
||||
- type: send
|
||||
id: 238
|
||||
parameters: {amount: 32, port: 0, sendpop: 1, target: 202}
|
||||
- name: SuperSaw 4
|
||||
comment: Automate filter frequency for the classic trance sound
|
||||
numvoices: 1
|
||||
units:
|
||||
- type: envelope
|
||||
id: 1109
|
||||
parameters: {attack: 0, decay: 0, gain: 64, release: 64, stereo: 0, sustain: 85}
|
||||
- type: oscillator
|
||||
id: 1099
|
||||
parameters: {color: 128, detune: 96, gain: 64, phase: 64, shape: 64, stereo: 0, transpose: 64, type: 1, unison: 3}
|
||||
- type: oscillator
|
||||
id: 12
|
||||
parameters: {color: 128, detune: 77, gain: 80, lfo: 0, phase: 64, shape: 64, stereo: 0, transpose: 64, type: 1, unison: 3}
|
||||
- type: addp
|
||||
id: 13
|
||||
parameters: {stereo: 0}
|
||||
- type: mulp
|
||||
id: 16
|
||||
parameters: {stereo: 0}
|
||||
- type: envelope
|
||||
id: 17
|
||||
parameters: {attack: 18, decay: 67, gain: 64, release: 64, stereo: 0, sustain: 99}
|
||||
- type: oscillator
|
||||
id: 18
|
||||
parameters: {color: 128, detune: 46, gain: 81, phase: 64, shape: 64, stereo: 0, transpose: 64, type: 1, unison: 3}
|
||||
- type: oscillator
|
||||
id: 19
|
||||
parameters: {color: 128, detune: 38, gain: 76, lfo: 0, phase: 64, shape: 64, stereo: 0, transpose: 64, type: 1, unison: 3}
|
||||
- type: addp
|
||||
id: 20
|
||||
parameters: {stereo: 0}
|
||||
- type: mulp
|
||||
id: 23
|
||||
parameters: {stereo: 0}
|
||||
- type: gain
|
||||
id: 1123
|
||||
parameters: {gain: 120, stereo: 1}
|
||||
- type: delay
|
||||
id: 24
|
||||
parameters: {damp: 0, dry: 0, feedback: 0, notetracking: 0, pregain: 128, stereo: 0}
|
||||
varargs: [420]
|
||||
- type: delay
|
||||
id: 29
|
||||
parameters: {damp: 0, dry: 71, feedback: 32, notetracking: 2, pregain: 71, stereo: 1}
|
||||
varargs: [32, 36]
|
||||
- type: loadnote
|
||||
id: 1140
|
||||
parameters: {stereo: 0}
|
||||
- type: sync
|
||||
id: 1138
|
||||
parameters: {}
|
||||
- type: pop
|
||||
id: 1139
|
||||
parameters: {stereo: 0}
|
||||
- type: outaux
|
||||
id: 30
|
||||
parameters: {auxgain: 23, outgain: 25, stereo: 1}
|
||||
- name: pad
|
||||
numvoices: 1
|
||||
units:
|
||||
- type: envelope
|
||||
id: 1
|
||||
parameters: {attack: 72, decay: 96, gain: 128, release: 88, stereo: 0, sustain: 96}
|
||||
- type: send
|
||||
id: 2
|
||||
parameters: {amount: 64, port: 4, sendpop: 0, target: 1}
|
||||
- type: oscillator
|
||||
id: 1125
|
||||
parameters: {color: 80, detune: 60, gain: 128, lfo: 0, phase: 32, shape: 64, stereo: 0, transpose: 64, type: 2}
|
||||
- type: oscillator
|
||||
id: 1126
|
||||
parameters: {color: 96, detune: 72, gain: 128, lfo: 0, phase: 32, shape: 64, stereo: 0, transpose: 64, type: 1}
|
||||
- type: oscillator
|
||||
id: 5
|
||||
parameters: {color: 128, detune: 64, gain: 128, lfo: 1, phase: 0, shape: 90, stereo: 0, transpose: 32, type: 0}
|
||||
- type: send
|
||||
id: 6
|
||||
parameters: {amount: 68, port: 1, sendpop: 0, target: 1125}
|
||||
- type: send
|
||||
id: 78
|
||||
parameters: {amount: 61, port: 1, sendpop: 1, target: 1126}
|
||||
- type: addp
|
||||
id: 80
|
||||
parameters: {stereo: 0}
|
||||
- type: mulp
|
||||
id: 10
|
||||
parameters: {stereo: 0}
|
||||
- type: filter
|
||||
id: 11
|
||||
parameters: {bandpass: 0, frequency: 26, highpass: 0, lowpass: 1, negbandpass: 0, neghighpass: 1, resonance: 128, stereo: 0}
|
||||
- type: filter
|
||||
id: 1127
|
||||
parameters: {bandpass: 0, frequency: 64, highpass: 0, lowpass: 1, negbandpass: 0, neghighpass: 0, resonance: 64, stereo: 0}
|
||||
- type: distort
|
||||
id: 1128
|
||||
parameters: {drive: 109, stereo: 0}
|
||||
- type: pan
|
||||
id: 1129
|
||||
parameters: {panning: 64, stereo: 0}
|
||||
- type: delay
|
||||
id: 1130
|
||||
parameters: {damp: 64, dry: 128, feedback: 96, notetracking: 2, pregain: 96, stereo: 1}
|
||||
varargs: [24, 48]
|
||||
- type: outaux
|
||||
id: 1131
|
||||
parameters: {auxgain: 15, outgain: 15, stereo: 1}
|
||||
- name: HappyLead
|
||||
numvoices: 1
|
||||
units:
|
||||
- type: oscillator
|
||||
id: 164
|
||||
parameters: {color: 84, detune: 62, gain: 128, lfo: 0, phase: 0, shape: 64, stereo: 0, transpose: 64, type: 1, unison: 0}
|
||||
- type: oscillator
|
||||
id: 165
|
||||
parameters: {color: 128, detune: 62, gain: 92, lfo: 0, phase: 0, shape: 64, stereo: 0, transpose: 64, type: 1, unison: 2}
|
||||
- type: addp
|
||||
id: 166
|
||||
parameters: {stereo: 0}
|
||||
- type: envelope
|
||||
id: 163
|
||||
parameters: {attack: 44, decay: 64, gain: 72, release: 64, stereo: 0, sustain: 92}
|
||||
- type: mulp
|
||||
id: 167
|
||||
parameters: {stereo: 0}
|
||||
- type: pan
|
||||
id: 168
|
||||
parameters: {panning: 60, stereo: 0}
|
||||
- type: delay
|
||||
id: 169
|
||||
parameters: {damp: 0, dry: 64, feedback: 64, notetracking: 0, pregain: 54, stereo: 1}
|
||||
varargs: [12550, 24402, 21265, 32419]
|
||||
- type: outaux
|
||||
id: 172
|
||||
parameters: {auxgain: 64, outgain: 64, stereo: 1}
|
||||
- name: Global
|
||||
numvoices: 1
|
||||
units:
|
||||
- type: in
|
||||
id: 7
|
||||
parameters: {channel: 2, stereo: 1}
|
||||
- type: delay
|
||||
id: 8
|
||||
parameters: {damp: 25, dry: 0, feedback: 120, notetracking: 0, pregain: 40, stereo: 1}
|
||||
varargs: [1116, 1188, 1276, 1356, 1422, 1492, 1556, 1618, 1140, 1212, 1300, 1380, 1446, 1516, 1580, 1642]
|
||||
- type: out
|
||||
id: 9
|
||||
parameters: {gain: 64, stereo: 1}
|
||||
55
crinkler-license.txt
Normal file
55
crinkler-license.txt
Normal file
@ -0,0 +1,55 @@
|
||||
|
||||
Crinkler - compressing linker for Windows
|
||||
Copyright 2005-2019 Aske Simon Christensen and Rune L. H. Stubbe.
|
||||
|
||||
|
||||
DISTRIBUTION
|
||||
|
||||
Crinkler is freeware. You may distribute it freely, as long as the
|
||||
Crinkler executable and all accompanying documentation files are kept
|
||||
together and intact. You may not distribute modified versions or any
|
||||
kind of derived work based on Crinkler or its documentation.
|
||||
|
||||
USE AND AUTHOR RIGHTS
|
||||
|
||||
The output of Crinkler (executable files, HTML compression reports
|
||||
and other textual output) is to be considered the original works of
|
||||
you as a user of Crinkler. You may use Crinkler and its output for
|
||||
any legal purpose with the following restrictions:
|
||||
- You may not use Crinkler or its output for any commercial purpose.
|
||||
- You may not use Crinkler or its output in any setting where security
|
||||
is essential.
|
||||
- You may not use Crinkler or its output for any safety critical
|
||||
purpose.
|
||||
- You may not use Crinkler or its output in the production of any
|
||||
virus, worm, trojan, spyware or other malicious software.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
Crinkler comes with no warranties of any kind. Crinkler is
|
||||
experimental software that relies on many undocumented features of the
|
||||
Windows PE loader. It has been created with the sole purpose of
|
||||
producing tiny executable files that may or may not work as intended
|
||||
on current and/or future versions of Windows.
|
||||
|
||||
LICENSE OF DISTORM
|
||||
|
||||
Crinkler uses the BSD-licensed diStorm disassembler library for
|
||||
producing disassembly output of the compressed code. The license for
|
||||
diStorm requires that the license below is included with derivative
|
||||
works. The license below applies only to diStorm and not to Crinkler
|
||||
as a whole.
|
||||
|
||||
|
||||
:[diStorm64}:
|
||||
The ultimate disassembler library.
|
||||
Copyright (c) 2003,2004,2005,2006,2007,2008, Gil Dabah
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the diStorm nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
1229
crinkler-manual.txt
Normal file
1229
crinkler-manual.txt
Normal file
File diff suppressed because it is too large
Load Diff
644
leviathan.vcxproj
Normal file
644
leviathan.vcxproj
Normal file
@ -0,0 +1,644 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Editor|Win32">
|
||||
<Configuration>Editor</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Heavy Release|Win32">
|
||||
<Configuration>Heavy Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Snapshot|Win32">
|
||||
<Configuration>Snapshot</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{59C1D4F3-AE93-4A0A-B4FE-60841CA865E5}</ProjectGuid>
|
||||
<ProjectName>Leviathan 2.0</ProjectName>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<UseOfMfc>false</UseOfMfc>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Heavy Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<UseOfMfc>false</UseOfMfc>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Snapshot|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<UseOfMfc>false</UseOfMfc>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<UseOfMfc>false</UseOfMfc>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Editor|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<UseOfMfc>false</UseOfMfc>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
<Import Project="$(VCTargetsPath)\BuildCustomizations\masm.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Heavy Release|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Snapshot|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Editor|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup>
|
||||
<_ProjectFileVersion>12.0.30501.0</_ProjectFileVersion>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<OutDir>out\</OutDir>
|
||||
<IntDir>bin\debug\</IntDir>
|
||||
<LinkIncremental>
|
||||
</LinkIncremental>
|
||||
<ExecutablePath>$(SolutionDir);$(ExecutablePath)</ExecutablePath>
|
||||
<TargetName>leviathan-debug</TargetName>
|
||||
<GenerateManifest>false</GenerateManifest>
|
||||
<IgnoreImportLibrary>true</IgnoreImportLibrary>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Editor|Win32'">
|
||||
<OutDir>out\</OutDir>
|
||||
<IntDir>bin\debug\</IntDir>
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<ExecutablePath>$(SolutionDir);$(ExecutablePath)</ExecutablePath>
|
||||
<TargetName>leviathan-debug</TargetName>
|
||||
<GenerateManifest>false</GenerateManifest>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<OutDir>out\</OutDir>
|
||||
<IntDir>bin\release\</IntDir>
|
||||
<LinkIncremental>
|
||||
</LinkIncremental>
|
||||
<GenerateManifest>
|
||||
</GenerateManifest>
|
||||
<ExecutablePath>$(SolutionDir);$(ExecutablePath)</ExecutablePath>
|
||||
<TargetName>leviathan-release</TargetName>
|
||||
<IgnoreImportLibrary>false</IgnoreImportLibrary>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Heavy Release|Win32'">
|
||||
<OutDir>out\</OutDir>
|
||||
<IntDir>bin\release\</IntDir>
|
||||
<LinkIncremental>
|
||||
</LinkIncremental>
|
||||
<GenerateManifest>
|
||||
</GenerateManifest>
|
||||
<ExecutablePath>$(SolutionDir);$(ExecutablePath)</ExecutablePath>
|
||||
<TargetName>leviathan-release</TargetName>
|
||||
<PreBuildEventUseInBuild>false</PreBuildEventUseInBuild>
|
||||
<IgnoreImportLibrary>true</IgnoreImportLibrary>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Snapshot|Win32'">
|
||||
<OutDir>out\</OutDir>
|
||||
<IntDir>bin\release\</IntDir>
|
||||
<LinkIncremental>
|
||||
</LinkIncremental>
|
||||
<GenerateManifest>
|
||||
</GenerateManifest>
|
||||
<ExecutablePath>$(SolutionDir);$(ExecutablePath)</ExecutablePath>
|
||||
<TargetName>leviathan-snapshot</TargetName>
|
||||
<IgnoreImportLibrary>true</IgnoreImportLibrary>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Midl>
|
||||
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MkTypLibCompatible>true</MkTypLibCompatible>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<TargetEnvironment>Win32</TargetEnvironment>
|
||||
<TypeLibraryName>.\bin/Debug/Leviathan.tlb</TypeLibraryName>
|
||||
<HeaderFileName>
|
||||
</HeaderFileName>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<Optimization>MinSpace</Optimization>
|
||||
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>_DEBUG;WINDOWS;DEBUG;SIMD;A32BITS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<PrecompiledHeaderOutputFile>
|
||||
</PrecompiledHeaderOutputFile>
|
||||
<AssemblerListingLocation>bin\debug\</AssemblerListingLocation>
|
||||
<ObjectFileName>bin\debug\</ObjectFileName>
|
||||
<ProgramDataBaseFileName>bin\debug\</ProgramDataBaseFileName>
|
||||
<BrowseInformation>false</BrowseInformation>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<TreatWarningAsError>false</TreatWarningAsError>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<CompileAs>CompileAsCpp</CompileAs>
|
||||
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
|
||||
<OmitFramePointers>true</OmitFramePointers>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<BufferSecurityCheck>false</BufferSecurityCheck>
|
||||
<CallingConvention>StdCall</CallingConvention>
|
||||
<OmitDefaultLibName>true</OmitDefaultLibName>
|
||||
<LanguageStandard>
|
||||
</LanguageStandard>
|
||||
<EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
|
||||
<FloatingPointModel>Fast</FloatingPointModel>
|
||||
</ClCompile>
|
||||
<ResourceCompile>
|
||||
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<Culture>0x0409</Culture>
|
||||
</ResourceCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>opengl32.lib;dsound.lib;src/sointu/song.obj;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<OutputFile>out\leviathan-debug.exe</OutputFile>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<EntryPointSymbol>entrypoint</EntryPointSymbol>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<ProgramDatabaseFile>bin\debug\$(TargetName).pdb</ProgramDatabaseFile>
|
||||
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||
<DataExecutionPrevention />
|
||||
<TargetMachine>MachineX86</TargetMachine>
|
||||
<EntryPointSymbol>entrypoint</EntryPointSymbol>
|
||||
<AssemblyDebug>true</AssemblyDebug>
|
||||
<ProgramDatabaseFile>bin\release\$(TargetName).pdb</ProgramDatabaseFile>
|
||||
<ProfileGuidedDatabase>bin\debug\$(TargetName).pgd</ProfileGuidedDatabase>
|
||||
<ManifestFile />
|
||||
<ImageHasSafeExceptionHandlers />
|
||||
<EnableUAC />
|
||||
<LinkErrorReporting />
|
||||
<TypeLibraryResourceID />
|
||||
</Link>
|
||||
<Bscmake>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<OutputFile>.\bin/Release/Leviathan.bsc</OutputFile>
|
||||
</Bscmake>
|
||||
<ProjectReference>
|
||||
<LinkLibraryDependencies>false</LinkLibraryDependencies>
|
||||
</ProjectReference>
|
||||
<PreBuildEvent>
|
||||
<Command>shader_minifier.exe -v -o src\shaders\fragment.inl src\shaders\fragment.frag shader_minifier.exe -v -o src\shaders\post.inl src\shaders\post.frag</Command>
|
||||
<Message>Minify user-supplied shader files.</Message>
|
||||
</PreBuildEvent>
|
||||
<Bscmake>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<OutputFile>$(OutDir)Leviathan.bsc</OutputFile>
|
||||
</Bscmake>
|
||||
<ProjectReference>
|
||||
<LinkLibraryDependencies>false</LinkLibraryDependencies>
|
||||
</ProjectReference>
|
||||
<PreBuildEvent>
|
||||
<Command>shader_minifier.exe -v -o src\shaders\fragment.inl src\shaders\fragment.frag
|
||||
shader_minifier.exe -v -o src\shaders\post.inl src\shaders\post.frag</Command>
|
||||
<Message>Minify user-supplied shader files.</Message>
|
||||
</PreBuildEvent>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Editor|Win32'">
|
||||
<Midl>
|
||||
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MkTypLibCompatible>true</MkTypLibCompatible>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<TargetEnvironment>Win32</TargetEnvironment>
|
||||
<TypeLibraryName>.\bin/Debug/Leviathan.tlb</TypeLibraryName>
|
||||
<HeaderFileName>
|
||||
</HeaderFileName>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<Optimization>MinSpace</Optimization>
|
||||
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>EDITOR_CONTROLS;_DEBUG;WINDOWS;DEBUG;SIMD;A32BITS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<PrecompiledHeaderOutputFile>
|
||||
</PrecompiledHeaderOutputFile>
|
||||
<AssemblerListingLocation>bin\debug\</AssemblerListingLocation>
|
||||
<ObjectFileName>bin\debug\</ObjectFileName>
|
||||
<ProgramDataBaseFileName>bin\debug\</ProgramDataBaseFileName>
|
||||
<BrowseInformation>false</BrowseInformation>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<TreatWarningAsError>false</TreatWarningAsError>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<CompileAs>CompileAsCpp</CompileAs>
|
||||
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
|
||||
<OmitFramePointers>true</OmitFramePointers>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<BufferSecurityCheck>false</BufferSecurityCheck>
|
||||
<CallingConvention>StdCall</CallingConvention>
|
||||
<OmitDefaultLibName>false</OmitDefaultLibName>
|
||||
<LanguageStandard>
|
||||
</LanguageStandard>
|
||||
</ClCompile>
|
||||
<ResourceCompile>
|
||||
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<Culture>0x0409</Culture>
|
||||
</ResourceCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>dsound.lib;opengl32.lib;src/sointu/song.obj;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<OutputFile>out/leviathan-debug.exe</OutputFile>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<ProgramDatabaseFile>bin\debug\$(TargetName).pdb</ProgramDatabaseFile>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||
<DataExecutionPrevention>
|
||||
</DataExecutionPrevention>
|
||||
<TargetMachine>MachineX86</TargetMachine>
|
||||
<EntryPointSymbol>
|
||||
</EntryPointSymbol>
|
||||
<AssemblyDebug>true</AssemblyDebug>
|
||||
<ProfileGuidedDatabase>bin\debug\$(TargetName).pgd</ProfileGuidedDatabase>
|
||||
<IgnoreAllDefaultLibraries>
|
||||
</IgnoreAllDefaultLibraries>
|
||||
<ManifestFile />
|
||||
<ImageHasSafeExceptionHandlers>
|
||||
</ImageHasSafeExceptionHandlers>
|
||||
</Link>
|
||||
<Bscmake>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<OutputFile>$(OutDir)Leviathan.bsc</OutputFile>
|
||||
</Bscmake>
|
||||
<ProjectReference>
|
||||
<LinkLibraryDependencies>false</LinkLibraryDependencies>
|
||||
</ProjectReference>
|
||||
<PreBuildEvent>
|
||||
<Command>shader_minifier.exe -v -o src\shaders\fragment.inl src\shaders\fragment.frag
|
||||
shader_minifier.exe -v -o src\shaders\post.inl src\shaders\post.frag</Command>
|
||||
<Message>Minify user-supplied shader files.</Message>
|
||||
</PreBuildEvent>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Midl>
|
||||
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MkTypLibCompatible>true</MkTypLibCompatible>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<TargetEnvironment>Win32</TargetEnvironment>
|
||||
<TypeLibraryName>.\bin/Release/Leviathan.tlb</TypeLibraryName>
|
||||
<HeaderFileName />
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<Optimization>MinSpace</Optimization>
|
||||
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
|
||||
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WINDOWS;A32BITS;SIMD;NDEBUG;_CRT_SECURE_NO_WARNINGS;WINDOWS_IGNORE_PACKING_MISMATCH;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<StringPooling>false</StringPooling>
|
||||
<ExceptionHandling>false</ExceptionHandling>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<StructMemberAlignment>1Byte</StructMemberAlignment>
|
||||
<BufferSecurityCheck>false</BufferSecurityCheck>
|
||||
<FloatingPointModel>Fast</FloatingPointModel>
|
||||
<PrecompiledHeaderOutputFile>bin\Release\Leviathan.pch</PrecompiledHeaderOutputFile>
|
||||
<AssemblerOutput>AssemblyAndSourceCode</AssemblerOutput>
|
||||
<AssemblerListingLocation>bin\release\</AssemblerListingLocation>
|
||||
<ObjectFileName>bin\release\</ObjectFileName>
|
||||
<ProgramDataBaseFileName>bin\release\</ProgramDataBaseFileName>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<TreatWarningAsError>false</TreatWarningAsError>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<CallingConvention>StdCall</CallingConvention>
|
||||
<CompileAs>CompileAsCpp</CompileAs>
|
||||
<OmitFramePointers>true</OmitFramePointers>
|
||||
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||
<SmallerTypeCheck>false</SmallerTypeCheck>
|
||||
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
|
||||
<EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
|
||||
<OmitDefaultLibName>true</OmitDefaultLibName>
|
||||
<DisableLanguageExtensions>false</DisableLanguageExtensions>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<LanguageStandard>
|
||||
</LanguageStandard>
|
||||
<FloatingPointExceptions>false</FloatingPointExceptions>
|
||||
<AdditionalOptions>/GR- /EHa- %(AdditionalOptions)</AdditionalOptions>
|
||||
<ForceConformanceInForLoopScope />
|
||||
</ClCompile>
|
||||
<ResourceCompile>
|
||||
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<Culture>0x0409</Culture>
|
||||
</ResourceCompile>
|
||||
<Link>
|
||||
<AdditionalOptions>/CRINKLER /RANGE:opengl32 /HASHTRIES:500 /COMPMODE:SLOW /ORDERTRIES:9000 /REPORT:out.html /PROGRESSGUI /HASHSIZE:1000 /UNSAFEIMPORT /UNALIGNCODE /SATURATE /NOINITIALIZERS /TRANSFORM:CALLS /TRUNCATEFLOATS:32 %(AdditionalOptions)</AdditionalOptions>
|
||||
<AdditionalDependencies>opengl32.lib;dsound.lib;src/sointu/song.obj;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<OutputFile>out\leviathan-release.exe</OutputFile>
|
||||
<SuppressStartupBanner>
|
||||
</SuppressStartupBanner>
|
||||
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<EntryPointSymbol>entrypoint</EntryPointSymbol>
|
||||
<BaseAddress />
|
||||
<RandomizedBaseAddress>
|
||||
</RandomizedBaseAddress>
|
||||
<DataExecutionPrevention />
|
||||
<TargetMachine>
|
||||
</TargetMachine>
|
||||
<GenerateDebugInformation>
|
||||
</GenerateDebugInformation>
|
||||
<AssemblyDebug>
|
||||
</AssemblyDebug>
|
||||
<ProgramDatabaseFile>bin\release\$(TargetName).pdb</ProgramDatabaseFile>
|
||||
<ProfileGuidedDatabase>
|
||||
</ProfileGuidedDatabase>
|
||||
<ManifestFile />
|
||||
<ImageHasSafeExceptionHandlers />
|
||||
<EnableUAC />
|
||||
<LinkErrorReporting />
|
||||
<TypeLibraryResourceID />
|
||||
</Link>
|
||||
<Bscmake>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<OutputFile>.\bin/Release/Leviathan.bsc</OutputFile>
|
||||
</Bscmake>
|
||||
<ProjectReference>
|
||||
<LinkLibraryDependencies>false</LinkLibraryDependencies>
|
||||
</ProjectReference>
|
||||
<PreBuildEvent>
|
||||
<Command>shader_minifier.exe -v -o src\shaders\fragment.inl src\shaders\fragment.frag
|
||||
shader_minifier.exe -v -o src\shaders\post.inl src\shaders\post.frag</Command>
|
||||
<Message>Minify user-supplied shader files.</Message>
|
||||
</PreBuildEvent>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Heavy Release|Win32'">
|
||||
<Midl>
|
||||
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MkTypLibCompatible>true</MkTypLibCompatible>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<TargetEnvironment>Win32</TargetEnvironment>
|
||||
<TypeLibraryName>.\bin/Release/Leviathan.tlb</TypeLibraryName>
|
||||
<HeaderFileName>
|
||||
</HeaderFileName>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<AdditionalOptions>/GR- /EHa- %(AdditionalOptions)</AdditionalOptions>
|
||||
<Optimization>MinSpace</Optimization>
|
||||
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
|
||||
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WINDOWS;A32BITS;SIMD;NDEBUG;_CRT_SECURE_NO_WARNINGS;WINDOWS_IGNORE_PACKING_MISMATCH;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<StringPooling>false</StringPooling>
|
||||
<ExceptionHandling>false</ExceptionHandling>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<StructMemberAlignment>1Byte</StructMemberAlignment>
|
||||
<BufferSecurityCheck>false</BufferSecurityCheck>
|
||||
<FloatingPointModel>Fast</FloatingPointModel>
|
||||
<PrecompiledHeaderOutputFile>bin\Release\Leviathan.pch</PrecompiledHeaderOutputFile>
|
||||
<AssemblerOutput>AssemblyAndSourceCode</AssemblerOutput>
|
||||
<AssemblerListingLocation>bin\release\</AssemblerListingLocation>
|
||||
<ObjectFileName>bin\release\</ObjectFileName>
|
||||
<ProgramDataBaseFileName>bin\release\</ProgramDataBaseFileName>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<TreatWarningAsError>false</TreatWarningAsError>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<CallingConvention>StdCall</CallingConvention>
|
||||
<CompileAs>CompileAsCpp</CompileAs>
|
||||
<OmitFramePointers>true</OmitFramePointers>
|
||||
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||
<SmallerTypeCheck>false</SmallerTypeCheck>
|
||||
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
|
||||
<EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
|
||||
<OmitDefaultLibName>true</OmitDefaultLibName>
|
||||
<DisableLanguageExtensions>false</DisableLanguageExtensions>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<LanguageStandard>
|
||||
</LanguageStandard>
|
||||
<FloatingPointExceptions>false</FloatingPointExceptions>
|
||||
<ForceConformanceInForLoopScope />
|
||||
</ClCompile>
|
||||
<ResourceCompile>
|
||||
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<Culture>0x0409</Culture>
|
||||
</ResourceCompile>
|
||||
<Link>
|
||||
<AdditionalOptions>/CRINKLER /RANGE:opengl32 /HASHTRIES:1000 /COMPMODE:VERYSLOW /ORDERTRIES:30000 /REPORT:out.html /PROGRESSGUI /HASHSIZE:1000 /UNSAFEIMPORT /UNALIGNCODE /SATURATE /NOINITIALIZERS /TRANSFORM:CALLS %(AdditionalOptions)</AdditionalOptions>
|
||||
<AdditionalDependencies>opengl32.lib;dsound.lib;src/sointu/song.obj;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<OutputFile>out\leviathan-release.exe</OutputFile>
|
||||
<SuppressStartupBanner>
|
||||
</SuppressStartupBanner>
|
||||
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<EntryPointSymbol>entrypoint</EntryPointSymbol>
|
||||
<BaseAddress>
|
||||
</BaseAddress>
|
||||
<RandomizedBaseAddress>
|
||||
</RandomizedBaseAddress>
|
||||
<DataExecutionPrevention>
|
||||
</DataExecutionPrevention>
|
||||
<TargetMachine>
|
||||
</TargetMachine>
|
||||
<GenerateDebugInformation>
|
||||
</GenerateDebugInformation>
|
||||
<AssemblyDebug>
|
||||
</AssemblyDebug>
|
||||
<ProgramDatabaseFile>bin\release\$(TargetName).pdb</ProgramDatabaseFile>
|
||||
<ProfileGuidedDatabase>
|
||||
</ProfileGuidedDatabase>
|
||||
<ManifestFile />
|
||||
<ImageHasSafeExceptionHandlers />
|
||||
<EnableUAC />
|
||||
<LinkErrorReporting />
|
||||
<TypeLibraryResourceID />
|
||||
</Link>
|
||||
<Bscmake>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<OutputFile>.\bin/Release/Leviathan.bsc</OutputFile>
|
||||
</Bscmake>
|
||||
<ProjectReference>
|
||||
<LinkLibraryDependencies>false</LinkLibraryDependencies>
|
||||
</ProjectReference>
|
||||
<PreBuildEvent>
|
||||
<Command>shader_minifier.exe -v -o src\shaders\fragment.inl src\shaders\fragment.frag shader_minifier.exe -v -o src\shaders\post.inl src\shaders\post.frag</Command>
|
||||
<Message>Minify user-supplied shader files.</Message>
|
||||
</PreBuildEvent>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Snapshot|Win32'">
|
||||
<Midl>
|
||||
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MkTypLibCompatible>true</MkTypLibCompatible>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<TargetEnvironment>Win32</TargetEnvironment>
|
||||
<TypeLibraryName>.\bin/Release/Leviathan.tlb</TypeLibraryName>
|
||||
<HeaderFileName>
|
||||
</HeaderFileName>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<Optimization>MinSpace</Optimization>
|
||||
<InlineFunctionExpansion>Disabled</InlineFunctionExpansion>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
|
||||
<AdditionalIncludeDirectories>../;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WINDOWS;A32BITS;SIMD;NDEBUG;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<StringPooling>false</StringPooling>
|
||||
<ExceptionHandling>false</ExceptionHandling>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<StructMemberAlignment>1Byte</StructMemberAlignment>
|
||||
<BufferSecurityCheck>false</BufferSecurityCheck>
|
||||
<FloatingPointModel>Fast</FloatingPointModel>
|
||||
<PrecompiledHeaderOutputFile>bin\Release\Leviathan.pch</PrecompiledHeaderOutputFile>
|
||||
<AssemblerOutput>AssemblyAndSourceCode</AssemblerOutput>
|
||||
<AssemblerListingLocation>bin\release\</AssemblerListingLocation>
|
||||
<ObjectFileName>bin\release\</ObjectFileName>
|
||||
<ProgramDataBaseFileName>bin\release\</ProgramDataBaseFileName>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<TreatWarningAsError>false</TreatWarningAsError>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<CallingConvention>StdCall</CallingConvention>
|
||||
<CompileAs>CompileAsCpp</CompileAs>
|
||||
<OmitFramePointers>true</OmitFramePointers>
|
||||
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||
<SmallerTypeCheck>false</SmallerTypeCheck>
|
||||
<BasicRuntimeChecks>
|
||||
</BasicRuntimeChecks>
|
||||
<EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
|
||||
<OmitDefaultLibName>true</OmitDefaultLibName>
|
||||
<DisableLanguageExtensions>false</DisableLanguageExtensions>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<LanguageStandard>
|
||||
</LanguageStandard>
|
||||
<SDLCheck>
|
||||
</SDLCheck>
|
||||
<CompileAsWinRT>false</CompileAsWinRT>
|
||||
<AdditionalOptions>/GR- /EHa- %(AdditionalOptions)</AdditionalOptions>
|
||||
<FloatingPointExceptions>false</FloatingPointExceptions>
|
||||
<ForceConformanceInForLoopScope />
|
||||
</ClCompile>
|
||||
<ResourceCompile>
|
||||
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<Culture>0x0409</Culture>
|
||||
</ResourceCompile>
|
||||
<Link>
|
||||
<AdditionalOptions>/CRINKLER /RANGE:opengl32 /HASHTRIES:100 /COMPMODE:INSTANT /ORDERTRIES:2000 /PROGRESSGUI /HASHSIZE:100 /UNSAFEIMPORT /UNALIGNCODE /SATURATE /NOINITIALIZERS /TRANSFORM:CALLS %(AdditionalOptions)</AdditionalOptions>
|
||||
<AdditionalDependencies>opengl32.lib;dsound.lib;src/sointu/song.obj;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<OutputFile>out\leviathan-snapshot.exe</OutputFile>
|
||||
<SuppressStartupBanner>
|
||||
</SuppressStartupBanner>
|
||||
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<EntryPointSymbol>entrypoint</EntryPointSymbol>
|
||||
<BaseAddress>
|
||||
</BaseAddress>
|
||||
<RandomizedBaseAddress>
|
||||
</RandomizedBaseAddress>
|
||||
<DataExecutionPrevention>
|
||||
</DataExecutionPrevention>
|
||||
<TargetMachine>
|
||||
</TargetMachine>
|
||||
<GenerateDebugInformation>
|
||||
</GenerateDebugInformation>
|
||||
<AssemblyDebug>
|
||||
</AssemblyDebug>
|
||||
<ProgramDatabaseFile>bin\release\$(TargetName).pdb</ProgramDatabaseFile>
|
||||
<ProfileGuidedDatabase>
|
||||
</ProfileGuidedDatabase>
|
||||
<LinkTimeCodeGeneration>
|
||||
</LinkTimeCodeGeneration>
|
||||
<EnableUAC />
|
||||
<LinkErrorReporting />
|
||||
<ManifestFile />
|
||||
<ImageHasSafeExceptionHandlers />
|
||||
<TypeLibraryResourceID />
|
||||
</Link>
|
||||
<Bscmake>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<OutputFile>.\bin/Release/Leviathan.bsc</OutputFile>
|
||||
</Bscmake>
|
||||
<ProjectReference>
|
||||
<LinkLibraryDependencies>false</LinkLibraryDependencies>
|
||||
</ProjectReference>
|
||||
<PreBuildEvent>
|
||||
<Command>shader_minifier.exe -v -o src\shaders\fragment.inl src\shaders\fragment.frag shader_minifier.exe -v -o src\shaders\post.inl src\shaders\post.frag</Command>
|
||||
<Message>Minify user-supplied shader files.</Message>
|
||||
</PreBuildEvent>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="src\editor.h">
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Snapshot|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Heavy Release|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\debug.h">
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Heavy Release|Win32'">false</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Snapshot|Win32'">false</ExcludedFromBuild>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\definitions.h" />
|
||||
<ClInclude Include="src\fft.h" />
|
||||
<ClInclude Include="src\fp.h" />
|
||||
<ClInclude Include="src\glext.h" />
|
||||
<ClInclude Include="src\sointu\song.h" />
|
||||
<ClInclude Include="src\song.h">
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Editor|Win32'">false</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Snapshot|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Heavy Release|Win32'">true</ExcludedFromBuild>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="src\editor.cpp">
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="src\fft.cpp" />
|
||||
<ClCompile Include="src\main.cpp" />
|
||||
<ClCompile Include="src\song.cpp">
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Editor|Win32'">false</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Heavy Release|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Snapshot|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="src\shaders\fragment.frag">
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Editor|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Snapshot|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Heavy Release|Win32'">true</ExcludedFromBuild>
|
||||
</None>
|
||||
<None Include="src\shaders\fragment.inl" />
|
||||
<None Include="src\shaders\post.frag">
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Editor|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Snapshot|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Heavy Release|Win32'">true</ExcludedFromBuild>
|
||||
</None>
|
||||
<None Include="src\shaders\post.inl" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
</Project>
|
||||
45
leviathan.vcxproj.filters
Normal file
45
leviathan.vcxproj.filters
Normal file
@ -0,0 +1,45 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<ClCompile Include="src\main.cpp" />
|
||||
<ClCompile Include="src\song.cpp" />
|
||||
<ClCompile Include="src\editor.cpp" />
|
||||
<ClCompile Include="src\fft.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="src\debug.h" />
|
||||
<ClInclude Include="src\definitions.h" />
|
||||
<ClInclude Include="src\glext.h">
|
||||
<Filter>ext</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\fp.h">
|
||||
<Filter>ext</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\song.h" />
|
||||
<ClInclude Include="src\editor.h" />
|
||||
<ClInclude Include="src\sointu\song.h" />
|
||||
<ClInclude Include="src\fft.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="src\shaders\post.inl">
|
||||
<Filter>shaders</Filter>
|
||||
</None>
|
||||
<None Include="src\shaders\fragment.inl">
|
||||
<Filter>shaders</Filter>
|
||||
</None>
|
||||
<None Include="src\shaders\fragment.frag">
|
||||
<Filter>shaders</Filter>
|
||||
</None>
|
||||
<None Include="src\shaders\post.frag">
|
||||
<Filter>shaders</Filter>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Filter Include="ext">
|
||||
<UniqueIdentifier>{3ade9a72-96b0-4936-93c4-4926808a1ab2}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="shaders">
|
||||
<UniqueIdentifier>{84f225d6-acf8-4151-aab3-e246410cdeba}</UniqueIdentifier>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
BIN
out/audio.wav
Normal file
BIN
out/audio.wav
Normal file
Binary file not shown.
5
out/editor.txt
Normal file
5
out/editor.txt
Normal file
@ -0,0 +1,5 @@
|
||||
place your pre-rendered audio for the editor here
|
||||
it is by default loaded from file 'audio.wav'
|
||||
|
||||
you can download an example from
|
||||
http://noby.untergrund.net/misc/audio.wav
|
||||
34
pbr-leviathan-2.0.sln
Normal file
34
pbr-leviathan-2.0.sln
Normal file
@ -0,0 +1,34 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.14.36212.18 d17.14
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Leviathan 2.0", "leviathan.vcxproj", "{59C1D4F3-AE93-4A0A-B4FE-60841CA865E5}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Win32 = Debug|Win32
|
||||
Editor|Win32 = Editor|Win32
|
||||
Heavy Release|Win32 = Heavy Release|Win32
|
||||
Release|Win32 = Release|Win32
|
||||
Snapshot|Win32 = Snapshot|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{59C1D4F3-AE93-4A0A-B4FE-60841CA865E5}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{59C1D4F3-AE93-4A0A-B4FE-60841CA865E5}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{59C1D4F3-AE93-4A0A-B4FE-60841CA865E5}.Editor|Win32.ActiveCfg = Editor|Win32
|
||||
{59C1D4F3-AE93-4A0A-B4FE-60841CA865E5}.Editor|Win32.Build.0 = Editor|Win32
|
||||
{59C1D4F3-AE93-4A0A-B4FE-60841CA865E5}.Heavy Release|Win32.ActiveCfg = Heavy Release|Win32
|
||||
{59C1D4F3-AE93-4A0A-B4FE-60841CA865E5}.Heavy Release|Win32.Build.0 = Heavy Release|Win32
|
||||
{59C1D4F3-AE93-4A0A-B4FE-60841CA865E5}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{59C1D4F3-AE93-4A0A-B4FE-60841CA865E5}.Release|Win32.Build.0 = Release|Win32
|
||||
{59C1D4F3-AE93-4A0A-B4FE-60841CA865E5}.Snapshot|Win32.ActiveCfg = Snapshot|Win32
|
||||
{59C1D4F3-AE93-4A0A-B4FE-60841CA865E5}.Snapshot|Win32.Build.0 = Snapshot|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {BFFCE7AC-AF44-47A1-9B82-AB82AB604DD0}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
7
prepare_music.bat
Normal file
7
prepare_music.bat
Normal file
@ -0,0 +1,7 @@
|
||||
sointu-compile -o . -arch=386 song.yml
|
||||
nasm -f win32 song.asm
|
||||
del song.inc
|
||||
del song.asm
|
||||
move song.obj src\sointu\
|
||||
move song.h src\sointu\
|
||||
|
||||
BIN
shader_minifier.exe
Normal file
BIN
shader_minifier.exe
Normal file
Binary file not shown.
BIN
sointu-compile.exe
Normal file
BIN
sointu-compile.exe
Normal file
Binary file not shown.
378
song.yml
Normal file
378
song.yml
Normal file
@ -0,0 +1,378 @@
|
||||
bpm: 138
|
||||
rowsperbeat: 4
|
||||
score:
|
||||
tracks:
|
||||
- numvoices: 2
|
||||
order: [-1, -1, -1, -1, 0, -1, 1, -1, 0, -1, 1, -1, 2, -1, 1, -1, 3, -1, 1, -1, 2, -1, 1, -1, 4, -1, 1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 2, -1, -1, -1, 2, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 4, -1, 2, -1, 0, -1, -1, -1, 4, -1, 2, -1, 0, -1, -1, -1, 0, -1, -1, -1, 2, -1, 2, -1, 3, 5, 2, 6, 0, -1, -1, -1, 0, -1, 1, -1, 0, -1, 1, -1, 0, -1, 1, -1]
|
||||
patterns: [[33, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [26, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 28, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 31, 1, 1, 1, 1, 1, 1, 1]]
|
||||
- numvoices: 2
|
||||
order: [-1, -1, -1, -1, 0, -1, 1, -1, 0, -1, 1, -1, 2, -1, 1, -1, 3, -1, 1, -1, 2, -1, 1, -1, 4, -1, 1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 2, -1, -1, -1, 2, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 4, -1, 2, -1, 0, -1, -1, -1, 4, -1, 2, -1, 0, -1, -1, -1, 0, -1, -1, -1, 5, -1, 5, -1, 6, 7, 5, 8, 9, -1, -1, -1, 9, -1, 1, -1, 9, -1, 1, -1, 0, -1, 1, -1]
|
||||
patterns: [[45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [38, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [43, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [53, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [50, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 52, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 55, 1, 1, 1, 1, 1, 1, 1], [57, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]
|
||||
- numvoices: 1
|
||||
order: [-1, -1, -1, -1, 0, -1, 1, -1, 2, -1, 1, -1, 3, -1, 1, -1, 4, -1, 1, -1, 3, -1, 1, -1, 5, -1, 1, -1, 6, 7, 6, 7, 6, 7, 6, 8, 6, 7, 6, 7, 6, 7, 6, 7, 9, 10, 9, 10, 9, 10, 9, 10, 6, 7, 6, 7, 6, 7, 6, 7, 6, 7, 6, 7, 5, -1, 3, -1, 6, 7, 6, 7, 11, 12, 9, 10, 6, 7, 6, 13, 6, 7, 6, 7, 9, 10, 9, 14, 15, 16, 9, 17, 6, 6, 6, 6, 0, -1, 1, -1, 0, -1, 1, -1, 2, -1, 1, -1]
|
||||
patterns: [[57, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [53, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [50, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [55, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [57, 0, 57, 0, 57, 0, 57, 0, 57, 0, 57, 0, 57, 0, 57, 0], [57, 0, 57, 0, 57, 0, 57, 0, 57, 0, 57, 0, 67, 0, 69, 0], [57, 0, 57, 0, 57, 0, 57, 0, 64, 1, 62, 1, 60, 1, 55, 1], [53, 0, 53, 0, 53, 0, 53, 0, 53, 0, 53, 0, 53, 0, 53, 0], [53, 0, 53, 0, 53, 0, 53, 0, 53, 0, 53, 0, 63, 0, 65, 0], [55, 0, 55, 0, 55, 0, 55, 0, 55, 0, 55, 0, 55, 0, 55, 0], [55, 0, 55, 0, 55, 0, 55, 0, 55, 0, 55, 0, 65, 0, 67, 0], [57, 0, 57, 0, 57, 0, 57, 0, 57, 0, 57, 0, 69, 0, 57, 0], [53, 0, 53, 0, 53, 0, 53, 0, 53, 0, 53, 0, 53, 0, 65, 0], [50, 0, 50, 0, 50, 0, 50, 0, 50, 0, 50, 0, 50, 0, 50, 0], [50, 0, 50, 0, 50, 0, 50, 0, 52, 0, 52, 0, 52, 0, 52, 0], [53, 0, 53, 0, 53, 0, 53, 0, 55, 0, 55, 0, 55, 0, 55, 0]]
|
||||
- numvoices: 1
|
||||
order: [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
|
||||
patterns: [[60, 1, 1, 1, 1, 1, 1, 1, 60, 1, 1, 1, 1, 1, 1, 1], [60, 1, 1, 1, 1, 1, 1, 1, 1, 1, 60, 1, 1, 1, 60, 1], [60, 1, 1, 1, 60, 1, 1, 1, 60, 1, 1, 1, 60, 1, 1, 1]]
|
||||
- numvoices: 1
|
||||
order: [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
|
||||
patterns: [[1, 1, 1, 1, 1, 1, 1, 1, 72, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 72, 1, 1, 1, 72, 1, 1, 1], [1, 1, 1, 1, 72, 1, 1, 1, 1, 1, 1, 1, 72, 1, 1, 1]]
|
||||
- numvoices: 1
|
||||
order: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 1, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, -1, 4, -1]
|
||||
patterns: [[88, 0, 83, 0, 84, 0, 81, 0, 88, 0, 83, 0, 84, 0, 81, 0], [91, 0, 83, 0, 84, 0, 81, 0, 91, 0, 83, 0, 84, 0, 81, 0], [89, 0, 83, 0, 84, 0, 81, 0, 89, 0, 83, 0, 84, 0, 81, 0], [45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]
|
||||
- numvoices: 1
|
||||
order: [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, -1, 2, 3, 4, 5, -1, 0, 6, -1, -1, 0, 6, -1, 7, 0, -1, -1, -1, 8, -1, -1, 9, -1, -1, -1, -1, 10, 7, 11, 12, 0, -1, -1, 13, 10, 7, 11, 7, 8, -1, 14, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
|
||||
patterns: [[83, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 84, 1, 81, 1], [1, 1, 1, 1, 1, 1, 1, 1, 72, 1, 74, 1, 76, 1, 1, 1], [71, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 72, 1, 1, 1], [69, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 84, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 86, 1, 1, 1, 1, 1, 1, 1], [81, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [88, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [84, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 83, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1]]
|
||||
- numvoices: 4
|
||||
order: [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1, 13, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
|
||||
patterns: [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 81, 83, 84, 86], [88, 83, 84, 81, 88, 83, 84, 81, 88, 83, 84, 81, 88, 83, 84, 81], [91, 83, 84, 81, 91, 83, 84, 81, 91, 83, 84, 81, 91, 83, 84, 81], [93, 83, 84, 81, 93, 83, 84, 81, 93, 83, 84, 81, 93, 83, 84, 81], [89, 81, 83, 84, 86, 88, 89, 91, 89, 81, 83, 84, 83, 84, 86, 88], [89, 79, 81, 83, 81, 83, 84, 86, 84, 86, 88, 89, 88, 84, 86, 83], [91, 88, 89, 86, 88, 84, 86, 83, 84, 81, 83, 79, 81, 77, 79, 76], [77, 74, 76, 72, 74, 71, 72, 69, 71, 67, 69, 65, 67, 69, 71, 74], [77, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 76, 1, 77, 76], [74, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 69, 71, 72, 76], [84, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 83, 1, 1, 1], [81, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 79, 1, 1, 1], [81, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]
|
||||
rowsperpattern: 16
|
||||
length: 108
|
||||
patch:
|
||||
- name: 80s lead
|
||||
numvoices: 4
|
||||
units:
|
||||
- type: oscillator
|
||||
id: 1089
|
||||
parameters: {color: 128, detune: 80, gain: 128, lfo: 0, phase: 0, shape: 64, stereo: 1, transpose: 76, type: 1, unison: 3}
|
||||
- type: oscillator
|
||||
id: 1090
|
||||
parameters: {color: 128, detune: 57, gain: 128, lfo: 0, phase: 0, shape: 64, stereo: 1, transpose: 64, type: 1, unison: 2}
|
||||
- type: addp
|
||||
id: 1091
|
||||
parameters: {stereo: 1}
|
||||
- type: envelope
|
||||
id: 1092
|
||||
parameters: {attack: 37, decay: 66, gain: 90, release: 54, stereo: 1, sustain: 81}
|
||||
- type: mulp
|
||||
id: 1098
|
||||
parameters: {stereo: 1}
|
||||
- type: pan
|
||||
id: 1096
|
||||
parameters: {panning: 60, stereo: 1}
|
||||
- type: filter
|
||||
id: 1108
|
||||
parameters: {bandpass: 0, frequency: 84, highpass: 0, lowpass: 1, negbandpass: 1, neghighpass: 0, resonance: 128, stereo: 1}
|
||||
- type: gain
|
||||
id: 1119
|
||||
parameters: {gain: 64, stereo: 1}
|
||||
- type: filter
|
||||
id: 1133
|
||||
parameters: {bandpass: 0, frequency: 10, highpass: 0, lowpass: 1, negbandpass: 0, neghighpass: 1, resonance: 88, stereo: 1}
|
||||
- type: outaux
|
||||
id: 1097
|
||||
parameters: {auxgain: 34, outgain: 34, stereo: 1}
|
||||
- name: 80s bass
|
||||
numvoices: 1
|
||||
units:
|
||||
- type: oscillator
|
||||
id: 3
|
||||
parameters: {color: 128, detune: 64, gain: 128, lfo: 0, phase: 64, shape: 64, stereo: 1, transpose: 64, type: 1, unison: 0}
|
||||
- type: oscillator
|
||||
id: 4
|
||||
parameters: {color: 128, detune: 76, gain: 128, lfo: 0, phase: 30, shape: 64, stereo: 1, transpose: 52, type: 1, unison: 1}
|
||||
- type: addp
|
||||
id: 1084
|
||||
parameters: {stereo: 1}
|
||||
- type: envelope
|
||||
id: 1085
|
||||
parameters: {attack: 0, decay: 69, gain: 100, release: 68, stereo: 1, sustain: 50}
|
||||
- type: send
|
||||
id: 1088
|
||||
parameters: {amount: 100, port: 0, sendpop: 0, stereo: 1, target: 1087, voice: 0}
|
||||
- type: mulp
|
||||
id: 1086
|
||||
parameters: {stereo: 1}
|
||||
- type: distort
|
||||
id: 1107
|
||||
parameters: {drive: 112, stereo: 1}
|
||||
- type: filter
|
||||
id: 1087
|
||||
parameters: {bandpass: 0, frequency: 30, highpass: 1, lowpass: 1, negbandpass: 1, neghighpass: 0, resonance: 40, stereo: 1}
|
||||
- type: pan
|
||||
id: 284
|
||||
parameters: {panning: 64, stereo: 1}
|
||||
- type: gain
|
||||
id: 1121
|
||||
parameters: {gain: 110, stereo: 1}
|
||||
- type: outaux
|
||||
id: 15
|
||||
parameters: {auxgain: 30, outgain: 30, stereo: 1}
|
||||
- name: Kick
|
||||
comment: 'Suggested note: C-3'
|
||||
numvoices: 1
|
||||
units:
|
||||
- type: envelope
|
||||
id: 261
|
||||
parameters: {attack: 0, decay: 49, gain: 128, release: 0, stereo: 0, sustain: 0}
|
||||
- type: noise
|
||||
id: 269
|
||||
parameters: {gain: 128, shape: 74, stereo: 0}
|
||||
- type: send
|
||||
id: 268
|
||||
parameters: {amount: 96, port: 0, sendpop: 1, stereo: 0, target: 262, voice: 0}
|
||||
- type: oscillator
|
||||
id: 262
|
||||
parameters: {color: 128, detune: 64, gain: 128, phase: 0, shape: 64, stereo: 0, transpose: 57, type: 0, unison: 0}
|
||||
- type: filter
|
||||
id: 281
|
||||
parameters: {bandpass: 0, frequency: 91, highpass: 0, lowpass: 0, negbandpass: 1, neghighpass: 1, resonance: 98, stereo: 0}
|
||||
- type: mulp
|
||||
id: 263
|
||||
parameters: {stereo: 0}
|
||||
- type: envelope
|
||||
id: 280
|
||||
parameters: {attack: 0, decay: 64, gain: 80, release: 64, stereo: 0, sustain: 0}
|
||||
- type: send
|
||||
id: 1110
|
||||
parameters: {amount: 75, port: 0, sendpop: 1, stereo: 0, target: 277, voice: 0}
|
||||
- type: noise
|
||||
id: 275
|
||||
parameters: {gain: 72, shape: 24, stereo: 0}
|
||||
- type: send
|
||||
id: 276
|
||||
parameters: {amount: 84, port: 0, sendpop: 1, stereo: 0, target: 277, voice: 0}
|
||||
- type: envelope
|
||||
id: 274
|
||||
parameters: {attack: 45, decay: 70, gain: 128, release: 0, stereo: 0, sustain: 0}
|
||||
- type: send
|
||||
id: 1118
|
||||
parameters: {amount: 0, port: 0, sendpop: 0, stereo: 0, target: 1119, voice: 0}
|
||||
- type: send
|
||||
id: 1122
|
||||
parameters: {amount: 0, port: 0, sendpop: 0, stereo: 0, target: 1121, voice: 0}
|
||||
- type: send
|
||||
id: 1124
|
||||
parameters: {amount: 32, port: 0, sendpop: 0, stereo: 0, target: 1123, voice: 0}
|
||||
- type: oscillator
|
||||
id: 277
|
||||
parameters: {color: 128, detune: 64, gain: 128, phase: 0, shape: 64, stereo: 0, transpose: 45, type: 0}
|
||||
- type: mulp
|
||||
id: 279
|
||||
parameters: {stereo: 0}
|
||||
- type: addp
|
||||
id: 271
|
||||
parameters: {stereo: 0}
|
||||
- type: pan
|
||||
id: 294
|
||||
parameters: {panning: 64, stereo: 0}
|
||||
- type: filter
|
||||
id: 1132
|
||||
parameters: {bandpass: 0, frequency: 11, highpass: 0, lowpass: 1, negbandpass: 0, neghighpass: 1, resonance: 128, stereo: 1}
|
||||
- type: outaux
|
||||
id: 266
|
||||
parameters: {auxgain: 14, outgain: 50, stereo: 1}
|
||||
- type: oscillator
|
||||
id: 1134
|
||||
parameters: {color: 64, detune: 64, gain: 128, lfo: 1, phase: 0, shape: 64, stereo: 0, transpose: 52, type: 0}
|
||||
- type: sync
|
||||
id: 1135
|
||||
parameters: {}
|
||||
- type: pop
|
||||
id: 1136
|
||||
parameters: {stereo: 0}
|
||||
- name: snare edm 3
|
||||
comment: 'Suggested range: E-4'
|
||||
numvoices: 1
|
||||
units:
|
||||
- type: envelope
|
||||
id: 217
|
||||
parameters: {attack: 0, decay: 67, gain: 29, release: 0, stereo: 0, sustain: 0}
|
||||
- type: oscillator
|
||||
id: 218
|
||||
parameters: {color: 128, detune: 64, gain: 80, lfo: 0, phase: 0, shape: 64, stereo: 0, transpose: 57, type: 0, unison: 0}
|
||||
- type: mulp
|
||||
id: 221
|
||||
parameters: {stereo: 0}
|
||||
- type: envelope
|
||||
id: 222
|
||||
parameters: {attack: 0, decay: 69, gain: 54, release: 0, stereo: 0, sustain: 0}
|
||||
- type: noise
|
||||
id: 223
|
||||
parameters: {gain: 31, shape: 14, stereo: 0}
|
||||
- type: mulp
|
||||
id: 224
|
||||
parameters: {stereo: 0}
|
||||
- type: filter
|
||||
id: 201
|
||||
parameters: {bandpass: 0, frequency: 78, highpass: 0, lowpass: 1, negbandpass: 0, neghighpass: 1, resonance: 127, stereo: 0}
|
||||
- type: filter
|
||||
id: 225
|
||||
parameters: {bandpass: 0, frequency: 122, highpass: 0, lowpass: 1, negbandpass: 0, neghighpass: 0, resonance: 112, stereo: 0}
|
||||
- type: addp
|
||||
id: 226
|
||||
parameters: {stereo: 0}
|
||||
- type: distort
|
||||
id: 338
|
||||
parameters: {drive: 108, stereo: 0}
|
||||
- type: pan
|
||||
id: 231
|
||||
parameters: {panning: 63, stereo: 0}
|
||||
- type: outaux
|
||||
id: 232
|
||||
parameters: {auxgain: 52, outgain: 58, stereo: 1}
|
||||
- type: envelope
|
||||
id: 233
|
||||
parameters: {attack: 37, decay: 47, gain: 128, release: 0, stereo: 0, sustain: 0}
|
||||
- type: send
|
||||
id: 234
|
||||
parameters: {amount: 69, port: 0, sendpop: 1, target: 218}
|
||||
- type: envelope
|
||||
id: 235
|
||||
parameters: {attack: 53, decay: 58, gain: 128, release: 0, stereo: 0, sustain: 0}
|
||||
- type: send
|
||||
id: 236
|
||||
parameters: {amount: 0, port: 0, sendpop: 1, target: 201}
|
||||
- type: envelope
|
||||
id: 237
|
||||
parameters: {attack: 53, decay: 73, gain: 128, release: 0, stereo: 0, sustain: 0}
|
||||
- type: send
|
||||
id: 238
|
||||
parameters: {amount: 32, port: 0, sendpop: 1, target: 202}
|
||||
- name: SuperSaw 4
|
||||
comment: Automate filter frequency for the classic trance sound
|
||||
numvoices: 1
|
||||
units:
|
||||
- type: envelope
|
||||
id: 1109
|
||||
parameters: {attack: 0, decay: 0, gain: 64, release: 64, stereo: 0, sustain: 85}
|
||||
- type: oscillator
|
||||
id: 1099
|
||||
parameters: {color: 128, detune: 96, gain: 64, phase: 64, shape: 64, stereo: 0, transpose: 64, type: 1, unison: 3}
|
||||
- type: oscillator
|
||||
id: 12
|
||||
parameters: {color: 128, detune: 77, gain: 80, lfo: 0, phase: 64, shape: 64, stereo: 0, transpose: 64, type: 1, unison: 3}
|
||||
- type: addp
|
||||
id: 13
|
||||
parameters: {stereo: 0}
|
||||
- type: mulp
|
||||
id: 16
|
||||
parameters: {stereo: 0}
|
||||
- type: envelope
|
||||
id: 17
|
||||
parameters: {attack: 18, decay: 67, gain: 64, release: 64, stereo: 0, sustain: 99}
|
||||
- type: oscillator
|
||||
id: 18
|
||||
parameters: {color: 128, detune: 46, gain: 81, phase: 64, shape: 64, stereo: 0, transpose: 64, type: 1, unison: 3}
|
||||
- type: oscillator
|
||||
id: 19
|
||||
parameters: {color: 128, detune: 38, gain: 76, lfo: 0, phase: 64, shape: 64, stereo: 0, transpose: 64, type: 1, unison: 3}
|
||||
- type: addp
|
||||
id: 20
|
||||
parameters: {stereo: 0}
|
||||
- type: mulp
|
||||
id: 23
|
||||
parameters: {stereo: 0}
|
||||
- type: gain
|
||||
id: 1123
|
||||
parameters: {gain: 120, stereo: 1}
|
||||
- type: delay
|
||||
id: 24
|
||||
parameters: {damp: 0, dry: 0, feedback: 0, notetracking: 0, pregain: 128, stereo: 0}
|
||||
varargs: [420]
|
||||
- type: delay
|
||||
id: 29
|
||||
parameters: {damp: 0, dry: 71, feedback: 32, notetracking: 2, pregain: 71, stereo: 1}
|
||||
varargs: [32, 36]
|
||||
- type: loadnote
|
||||
id: 1140
|
||||
parameters: {stereo: 0}
|
||||
- type: sync
|
||||
id: 1138
|
||||
parameters: {}
|
||||
- type: pop
|
||||
id: 1139
|
||||
parameters: {stereo: 0}
|
||||
- type: outaux
|
||||
id: 30
|
||||
parameters: {auxgain: 23, outgain: 25, stereo: 1}
|
||||
- name: pad
|
||||
numvoices: 1
|
||||
units:
|
||||
- type: envelope
|
||||
id: 1
|
||||
parameters: {attack: 72, decay: 96, gain: 128, release: 88, stereo: 0, sustain: 96}
|
||||
- type: send
|
||||
id: 2
|
||||
parameters: {amount: 64, port: 4, sendpop: 0, target: 1}
|
||||
- type: oscillator
|
||||
id: 1125
|
||||
parameters: {color: 80, detune: 60, gain: 128, lfo: 0, phase: 32, shape: 64, stereo: 0, transpose: 64, type: 2}
|
||||
- type: oscillator
|
||||
id: 1126
|
||||
parameters: {color: 96, detune: 72, gain: 128, lfo: 0, phase: 32, shape: 64, stereo: 0, transpose: 64, type: 1}
|
||||
- type: oscillator
|
||||
id: 5
|
||||
parameters: {color: 128, detune: 64, gain: 128, lfo: 1, phase: 0, shape: 90, stereo: 0, transpose: 32, type: 0}
|
||||
- type: send
|
||||
id: 6
|
||||
parameters: {amount: 68, port: 1, sendpop: 0, target: 1125}
|
||||
- type: send
|
||||
id: 78
|
||||
parameters: {amount: 61, port: 1, sendpop: 1, target: 1126}
|
||||
- type: addp
|
||||
id: 80
|
||||
parameters: {stereo: 0}
|
||||
- type: mulp
|
||||
id: 10
|
||||
parameters: {stereo: 0}
|
||||
- type: filter
|
||||
id: 11
|
||||
parameters: {bandpass: 0, frequency: 26, highpass: 0, lowpass: 1, negbandpass: 0, neghighpass: 1, resonance: 128, stereo: 0}
|
||||
- type: filter
|
||||
id: 1127
|
||||
parameters: {bandpass: 0, frequency: 64, highpass: 0, lowpass: 1, negbandpass: 0, neghighpass: 0, resonance: 64, stereo: 0}
|
||||
- type: distort
|
||||
id: 1128
|
||||
parameters: {drive: 109, stereo: 0}
|
||||
- type: pan
|
||||
id: 1129
|
||||
parameters: {panning: 64, stereo: 0}
|
||||
- type: delay
|
||||
id: 1130
|
||||
parameters: {damp: 64, dry: 128, feedback: 96, notetracking: 2, pregain: 96, stereo: 1}
|
||||
varargs: [24, 48]
|
||||
- type: outaux
|
||||
id: 1131
|
||||
parameters: {auxgain: 15, outgain: 15, stereo: 1}
|
||||
- name: HappyLead
|
||||
numvoices: 4
|
||||
units:
|
||||
- type: oscillator
|
||||
id: 164
|
||||
parameters: {color: 84, detune: 62, gain: 128, lfo: 0, phase: 0, shape: 64, stereo: 0, transpose: 64, type: 1, unison: 0}
|
||||
- type: oscillator
|
||||
id: 165
|
||||
parameters: {color: 128, detune: 62, gain: 92, lfo: 0, phase: 0, shape: 64, stereo: 0, transpose: 64, type: 1, unison: 2}
|
||||
- type: addp
|
||||
id: 166
|
||||
parameters: {stereo: 0}
|
||||
- type: envelope
|
||||
id: 163
|
||||
parameters: {attack: 44, decay: 64, gain: 72, release: 64, stereo: 0, sustain: 92}
|
||||
- type: mulp
|
||||
id: 167
|
||||
parameters: {stereo: 0}
|
||||
- type: pan
|
||||
id: 168
|
||||
parameters: {panning: 60, stereo: 0}
|
||||
- type: delay
|
||||
id: 169
|
||||
parameters: {damp: 0, dry: 64, feedback: 64, notetracking: 0, pregain: 54, stereo: 1}
|
||||
varargs: [12550, 24402, 21265, 32419]
|
||||
- type: outaux
|
||||
id: 172
|
||||
parameters: {auxgain: 64, outgain: 64, stereo: 1}
|
||||
- name: Global
|
||||
numvoices: 1
|
||||
units:
|
||||
- type: in
|
||||
id: 7
|
||||
parameters: {channel: 2, stereo: 1}
|
||||
- type: delay
|
||||
id: 8
|
||||
parameters: {damp: 25, dry: 0, feedback: 120, notetracking: 0, pregain: 40, stereo: 1}
|
||||
varargs: [1116, 1188, 1276, 1356, 1422, 1492, 1556, 1618, 1140, 1212, 1300, 1380, 1446, 1516, 1580, 1642]
|
||||
- type: out
|
||||
id: 9
|
||||
parameters: {gain: 64, stereo: 1}
|
||||
381
song_og.yml
Normal file
381
song_og.yml
Normal file
@ -0,0 +1,381 @@
|
||||
bpm: 138
|
||||
rowsperbeat: 4
|
||||
score:
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
order: [-1, -1, -1, -1, 0, -1, 1, -1, 0, -1, 1, -1, 2, -1, 1, -1, 3, -1, 1, -1, 2, -1, 1, -1, 4, -1, 1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 2, -1, -1, -1, 2, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 4, -1, 2, -1, 0, -1, -1, -1, 4, -1, 2, -1, 0, -1, -1, -1, 0, -1, -1, -1, 2, -1, 2, -1, 3, 5, 2, 6, 0, -1, -1, -1, 0, -1, 1, -1, 0, -1, 1, -1, 0, -1, 1, -1]
|
||||
patterns: [[33, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [26, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 28, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 31, 1, 1, 1, 1, 1, 1, 1]]
|
||||
- numvoices: 1
|
||||
order: [-1, -1, -1, -1, 0, -1, 1, -1, 0, -1, 1, -1, 2, -1, 1, -1, 3, -1, 1, -1, 2, -1, 1, -1, 4, -1, 1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 2, -1, -1, -1, 2, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 4, -1, 2, -1, 0, -1, -1, -1, 4, -1, 2, -1, 0, -1, -1, -1, 0, -1, -1, -1, 5, -1, 5, -1, 6, 7, 5, 8, 9, -1, -1, -1, 9, -1, 1, -1, 9, -1, 1, -1, 0, -1, 1, -1]
|
||||
patterns: [[45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [38, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [43, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [53, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [50, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 52, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 55, 1, 1, 1, 1, 1, 1, 1], [57, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]
|
||||
- numvoices: 1
|
||||
order: [-1, -1, -1, -1, 0, -1, 1, -1, 2, -1, 1, -1, 3, -1, 1, -1, 4, -1, 1, -1, 3, -1, 1, -1, 5, -1, 1, -1, 6, 7, 6, 7, 6, 7, 6, 8, 6, 7, 6, 7, 6, 7, 6, 7, 9, 10, 9, 10, 9, 10, 9, 10, 6, 7, 6, 7, 6, 7, 6, 7, 6, 7, 6, 7, 5, -1, 3, -1, 6, 7, 6, 7, 11, 12, 9, 10, 6, 7, 6, 13, 6, 7, 6, 7, 9, 10, 9, 14, 15, 16, 9, 17, 6, 6, 6, 6, 0, -1, 1, -1, 0, -1, 1, -1, 2, -1, 1, -1]
|
||||
patterns: [[57, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [53, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [50, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [55, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [57, 0, 57, 0, 57, 0, 57, 0, 57, 0, 57, 0, 57, 0, 57, 0], [57, 0, 57, 0, 57, 0, 57, 0, 57, 0, 57, 0, 67, 0, 69, 0], [57, 0, 57, 0, 57, 0, 57, 0, 64, 1, 62, 1, 60, 1, 55, 1], [53, 0, 53, 0, 53, 0, 53, 0, 53, 0, 53, 0, 53, 0, 53, 0], [53, 0, 53, 0, 53, 0, 53, 0, 53, 0, 53, 0, 63, 0, 65, 0], [55, 0, 55, 0, 55, 0, 55, 0, 55, 0, 55, 0, 55, 0, 55, 0], [55, 0, 55, 0, 55, 0, 55, 0, 55, 0, 55, 0, 65, 0, 67, 0], [57, 0, 57, 0, 57, 0, 57, 0, 57, 0, 57, 0, 69, 0, 57, 0], [53, 0, 53, 0, 53, 0, 53, 0, 53, 0, 53, 0, 53, 0, 65, 0], [50, 0, 50, 0, 50, 0, 50, 0, 50, 0, 50, 0, 50, 0, 50, 0], [50, 0, 50, 0, 50, 0, 50, 0, 52, 0, 52, 0, 52, 0, 52, 0], [53, 0, 53, 0, 53, 0, 53, 0, 55, 0, 55, 0, 55, 0, 55, 0]]
|
||||
- numvoices: 1
|
||||
order: [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
|
||||
patterns: [[60, 1, 1, 1, 1, 1, 1, 1, 60, 1, 1, 1, 1, 1, 1, 1], [60, 1, 1, 1, 1, 1, 1, 1, 1, 1, 60, 1, 1, 1, 60, 1], [60, 1, 1, 1, 60, 1, 1, 1, 60, 1, 1, 1, 60, 1, 1, 1]]
|
||||
- numvoices: 1
|
||||
order: [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
|
||||
patterns: [[1, 1, 1, 1, 1, 1, 1, 1, 72, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 72, 1, 1, 1, 72, 1, 1, 1], [1, 1, 1, 1, 72, 1, 1, 1, 1, 1, 1, 1, 72, 1, 1, 1]]
|
||||
- numvoices: 1
|
||||
order: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 1, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, -1, 4, -1]
|
||||
patterns: [[88, 0, 83, 0, 84, 0, 81, 0, 88, 0, 83, 0, 84, 0, 81, 0], [91, 0, 83, 0, 84, 0, 81, 0, 91, 0, 83, 0, 84, 0, 81, 0], [89, 0, 83, 0, 84, 0, 81, 0, 89, 0, 83, 0, 84, 0, 81, 0], [45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]
|
||||
- numvoices: 1
|
||||
order: [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, -1, 2, 3, 4, 5, -1, 0, 6, -1, -1, 0, 6, -1, 7, 0, -1, -1, -1, 8, -1, -1, 9, -1, -1, -1, -1, 10, 7, 11, 12, 0, -1, -1, 13, 10, 7, 11, 7, 8, -1, 14, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
|
||||
patterns: [[83, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 84, 1, 81, 1], [1, 1, 1, 1, 1, 1, 1, 1, 72, 1, 74, 1, 76, 1, 1, 1], [71, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 72, 1, 1, 1], [69, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 84, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 86, 1, 1, 1, 1, 1, 1, 1], [81, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [88, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [84, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 83, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1]]
|
||||
- numvoices: 1
|
||||
order: [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1, 13, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
|
||||
patterns: [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 81, 83, 84, 86], [88, 83, 84, 81, 88, 83, 84, 81, 88, 83, 84, 81, 88, 83, 84, 81], [91, 83, 84, 81, 91, 83, 84, 81, 91, 83, 84, 81, 91, 83, 84, 81], [93, 83, 84, 81, 93, 83, 84, 81, 93, 83, 84, 81, 93, 83, 84, 81], [89, 81, 83, 84, 86, 88, 89, 91, 89, 81, 83, 84, 83, 84, 86, 88], [89, 79, 81, 83, 81, 83, 84, 86, 84, 86, 88, 89, 88, 84, 86, 83], [91, 88, 89, 86, 88, 84, 86, 83, 84, 81, 83, 79, 81, 77, 79, 76], [77, 74, 76, 72, 74, 71, 72, 69, 71, 67, 69, 65, 67, 69, 71, 74], [77, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 76, 1, 77, 76], [74, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 69, 71, 72, 76], [84, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 83, 1, 1, 1], [81, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 79, 1, 1, 1], [81, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]
|
||||
rowsperpattern: 16
|
||||
length: 108
|
||||
patch:
|
||||
- name: 80s lead
|
||||
numvoices: 2
|
||||
units:
|
||||
- type: oscillator
|
||||
id: 1089
|
||||
parameters: {color: 128, detune: 80, gain: 128, lfo: 0, phase: 0, shape: 64, stereo: 1, transpose: 76, type: 1, unison: 3}
|
||||
- type: oscillator
|
||||
id: 1090
|
||||
parameters: {color: 128, detune: 57, gain: 128, lfo: 0, phase: 0, shape: 64, stereo: 1, transpose: 64, type: 1, unison: 2}
|
||||
- type: addp
|
||||
id: 1091
|
||||
parameters: {stereo: 1}
|
||||
- type: envelope
|
||||
id: 1092
|
||||
parameters: {attack: 37, decay: 66, gain: 90, release: 54, stereo: 1, sustain: 81}
|
||||
- type: mulp
|
||||
id: 1098
|
||||
parameters: {stereo: 1}
|
||||
- type: pan
|
||||
id: 1096
|
||||
parameters: {panning: 60, stereo: 1}
|
||||
- type: filter
|
||||
id: 1108
|
||||
parameters: {bandpass: 0, frequency: 84, highpass: 0, lowpass: 1, negbandpass: 1, neghighpass: 0, resonance: 128, stereo: 1}
|
||||
- type: gain
|
||||
id: 1119
|
||||
parameters: {gain: 64, stereo: 1}
|
||||
- type: filter
|
||||
id: 1133
|
||||
parameters: {bandpass: 0, frequency: 10, highpass: 0, lowpass: 1, negbandpass: 0, neghighpass: 1, resonance: 88, stereo: 1}
|
||||
- type: sync
|
||||
id: 1141
|
||||
parameters: {}
|
||||
- type: outaux
|
||||
id: 1097
|
||||
parameters: {auxgain: 34, outgain: 34, stereo: 1}
|
||||
- name: 80s bass
|
||||
numvoices: 1
|
||||
units:
|
||||
- type: oscillator
|
||||
id: 3
|
||||
parameters: {color: 128, detune: 64, gain: 128, lfo: 0, phase: 64, shape: 64, stereo: 1, transpose: 64, type: 1, unison: 0}
|
||||
- type: oscillator
|
||||
id: 4
|
||||
parameters: {color: 128, detune: 76, gain: 128, lfo: 0, phase: 30, shape: 64, stereo: 1, transpose: 52, type: 1, unison: 1}
|
||||
- type: addp
|
||||
id: 1084
|
||||
parameters: {stereo: 1}
|
||||
- type: envelope
|
||||
id: 1085
|
||||
parameters: {attack: 0, decay: 69, gain: 100, release: 68, stereo: 1, sustain: 50}
|
||||
- type: send
|
||||
id: 1088
|
||||
parameters: {amount: 100, port: 0, sendpop: 0, stereo: 1, target: 1087, voice: 0}
|
||||
- type: mulp
|
||||
id: 1086
|
||||
parameters: {stereo: 1}
|
||||
- type: distort
|
||||
id: 1107
|
||||
parameters: {drive: 112, stereo: 1}
|
||||
- type: filter
|
||||
id: 1087
|
||||
parameters: {bandpass: 0, frequency: 30, highpass: 1, lowpass: 1, negbandpass: 1, neghighpass: 0, resonance: 40, stereo: 1}
|
||||
- type: pan
|
||||
id: 284
|
||||
parameters: {panning: 64, stereo: 1}
|
||||
- type: gain
|
||||
id: 1121
|
||||
parameters: {gain: 110, stereo: 1}
|
||||
- type: outaux
|
||||
id: 15
|
||||
parameters: {auxgain: 30, outgain: 30, stereo: 1}
|
||||
- name: Kick
|
||||
comment: 'Suggested note: C-3'
|
||||
numvoices: 1
|
||||
units:
|
||||
- type: envelope
|
||||
id: 261
|
||||
parameters: {attack: 0, decay: 49, gain: 128, release: 0, stereo: 0, sustain: 0}
|
||||
- type: noise
|
||||
id: 269
|
||||
parameters: {gain: 128, shape: 74, stereo: 0}
|
||||
- type: send
|
||||
id: 268
|
||||
parameters: {amount: 96, port: 0, sendpop: 1, stereo: 0, target: 262, voice: 0}
|
||||
- type: oscillator
|
||||
id: 262
|
||||
parameters: {color: 128, detune: 64, gain: 128, phase: 0, shape: 64, stereo: 0, transpose: 57, type: 0, unison: 0}
|
||||
- type: filter
|
||||
id: 281
|
||||
parameters: {bandpass: 0, frequency: 91, highpass: 0, lowpass: 0, negbandpass: 1, neghighpass: 1, resonance: 98, stereo: 0}
|
||||
- type: mulp
|
||||
id: 263
|
||||
parameters: {stereo: 0}
|
||||
- type: envelope
|
||||
id: 280
|
||||
parameters: {attack: 0, decay: 64, gain: 80, release: 64, stereo: 0, sustain: 0}
|
||||
- type: send
|
||||
id: 1110
|
||||
parameters: {amount: 75, port: 0, sendpop: 1, stereo: 0, target: 277, voice: 0}
|
||||
- type: noise
|
||||
id: 275
|
||||
parameters: {gain: 72, shape: 24, stereo: 0}
|
||||
- type: send
|
||||
id: 276
|
||||
parameters: {amount: 84, port: 0, sendpop: 1, stereo: 0, target: 277, voice: 0}
|
||||
- type: envelope
|
||||
id: 274
|
||||
parameters: {attack: 45, decay: 70, gain: 128, release: 0, stereo: 0, sustain: 0}
|
||||
- type: send
|
||||
id: 1118
|
||||
parameters: {amount: 0, port: 0, sendpop: 0, stereo: 0, target: 1119, voice: 0}
|
||||
- type: send
|
||||
id: 1122
|
||||
parameters: {amount: 0, port: 0, sendpop: 0, stereo: 0, target: 1121, voice: 0}
|
||||
- type: send
|
||||
id: 1124
|
||||
parameters: {amount: 32, port: 0, sendpop: 0, stereo: 0, target: 1123, voice: 0}
|
||||
- type: oscillator
|
||||
id: 277
|
||||
parameters: {color: 128, detune: 64, gain: 128, phase: 0, shape: 64, stereo: 0, transpose: 45, type: 0}
|
||||
- type: mulp
|
||||
id: 279
|
||||
parameters: {stereo: 0}
|
||||
- type: addp
|
||||
id: 271
|
||||
parameters: {stereo: 0}
|
||||
- type: pan
|
||||
id: 294
|
||||
parameters: {panning: 64, stereo: 0}
|
||||
- type: filter
|
||||
id: 1132
|
||||
parameters: {bandpass: 0, frequency: 11, highpass: 0, lowpass: 1, negbandpass: 0, neghighpass: 1, resonance: 128, stereo: 1}
|
||||
- type: outaux
|
||||
id: 266
|
||||
parameters: {auxgain: 14, outgain: 50, stereo: 1}
|
||||
- type: oscillator
|
||||
id: 1134
|
||||
parameters: {color: 64, detune: 64, gain: 128, lfo: 1, phase: 0, shape: 64, stereo: 0, transpose: 52, type: 0}
|
||||
- type: sync
|
||||
id: 1135
|
||||
parameters: {}
|
||||
- type: pop
|
||||
id: 1136
|
||||
parameters: {stereo: 0}
|
||||
- name: snare edm 3
|
||||
comment: 'Suggested range: E-4'
|
||||
numvoices: 1
|
||||
units:
|
||||
- type: envelope
|
||||
id: 217
|
||||
parameters: {attack: 0, decay: 67, gain: 29, release: 0, stereo: 0, sustain: 0}
|
||||
- type: oscillator
|
||||
id: 218
|
||||
parameters: {color: 128, detune: 64, gain: 80, lfo: 0, phase: 0, shape: 64, stereo: 0, transpose: 57, type: 0, unison: 0}
|
||||
- type: mulp
|
||||
id: 221
|
||||
parameters: {stereo: 0}
|
||||
- type: envelope
|
||||
id: 222
|
||||
parameters: {attack: 0, decay: 69, gain: 54, release: 0, stereo: 0, sustain: 0}
|
||||
- type: noise
|
||||
id: 223
|
||||
parameters: {gain: 31, shape: 14, stereo: 0}
|
||||
- type: mulp
|
||||
id: 224
|
||||
parameters: {stereo: 0}
|
||||
- type: filter
|
||||
id: 201
|
||||
parameters: {bandpass: 0, frequency: 78, highpass: 0, lowpass: 1, negbandpass: 0, neghighpass: 1, resonance: 127, stereo: 0}
|
||||
- type: filter
|
||||
id: 225
|
||||
parameters: {bandpass: 0, frequency: 122, highpass: 0, lowpass: 1, negbandpass: 0, neghighpass: 0, resonance: 112, stereo: 0}
|
||||
- type: addp
|
||||
id: 226
|
||||
parameters: {stereo: 0}
|
||||
- type: distort
|
||||
id: 338
|
||||
parameters: {drive: 108, stereo: 0}
|
||||
- type: pan
|
||||
id: 231
|
||||
parameters: {panning: 63, stereo: 0}
|
||||
- type: outaux
|
||||
id: 232
|
||||
parameters: {auxgain: 52, outgain: 58, stereo: 1}
|
||||
- type: envelope
|
||||
id: 233
|
||||
parameters: {attack: 37, decay: 47, gain: 128, release: 0, stereo: 0, sustain: 0}
|
||||
- type: send
|
||||
id: 234
|
||||
parameters: {amount: 69, port: 0, sendpop: 1, target: 218}
|
||||
- type: envelope
|
||||
id: 235
|
||||
parameters: {attack: 53, decay: 58, gain: 128, release: 0, stereo: 0, sustain: 0}
|
||||
- type: send
|
||||
id: 236
|
||||
parameters: {amount: 0, port: 0, sendpop: 1, target: 201}
|
||||
- type: envelope
|
||||
id: 237
|
||||
parameters: {attack: 53, decay: 73, gain: 128, release: 0, stereo: 0, sustain: 0}
|
||||
- type: send
|
||||
id: 238
|
||||
parameters: {amount: 32, port: 0, sendpop: 1, target: 202}
|
||||
- name: SuperSaw 4
|
||||
comment: Automate filter frequency for the classic trance sound
|
||||
numvoices: 1
|
||||
units:
|
||||
- type: envelope
|
||||
id: 1109
|
||||
parameters: {attack: 0, decay: 0, gain: 64, release: 64, stereo: 0, sustain: 85}
|
||||
- type: oscillator
|
||||
id: 1099
|
||||
parameters: {color: 128, detune: 96, gain: 64, phase: 64, shape: 64, stereo: 0, transpose: 64, type: 1, unison: 3}
|
||||
- type: oscillator
|
||||
id: 12
|
||||
parameters: {color: 128, detune: 77, gain: 80, lfo: 0, phase: 64, shape: 64, stereo: 0, transpose: 64, type: 1, unison: 3}
|
||||
- type: addp
|
||||
id: 13
|
||||
parameters: {stereo: 0}
|
||||
- type: mulp
|
||||
id: 16
|
||||
parameters: {stereo: 0}
|
||||
- type: envelope
|
||||
id: 17
|
||||
parameters: {attack: 18, decay: 67, gain: 64, release: 64, stereo: 0, sustain: 99}
|
||||
- type: oscillator
|
||||
id: 18
|
||||
parameters: {color: 128, detune: 46, gain: 81, phase: 64, shape: 64, stereo: 0, transpose: 64, type: 1, unison: 3}
|
||||
- type: oscillator
|
||||
id: 19
|
||||
parameters: {color: 128, detune: 38, gain: 76, lfo: 0, phase: 64, shape: 64, stereo: 0, transpose: 64, type: 1, unison: 3}
|
||||
- type: addp
|
||||
id: 20
|
||||
parameters: {stereo: 0}
|
||||
- type: mulp
|
||||
id: 23
|
||||
parameters: {stereo: 0}
|
||||
- type: gain
|
||||
id: 1123
|
||||
parameters: {gain: 120, stereo: 1}
|
||||
- type: delay
|
||||
id: 24
|
||||
parameters: {damp: 0, dry: 0, feedback: 0, notetracking: 0, pregain: 128, stereo: 0}
|
||||
varargs: [420]
|
||||
- type: delay
|
||||
id: 29
|
||||
parameters: {damp: 0, dry: 71, feedback: 32, notetracking: 2, pregain: 71, stereo: 1}
|
||||
varargs: [32, 36]
|
||||
- type: loadnote
|
||||
id: 1140
|
||||
parameters: {stereo: 0}
|
||||
- type: sync
|
||||
id: 1138
|
||||
parameters: {}
|
||||
- type: pop
|
||||
id: 1139
|
||||
parameters: {stereo: 0}
|
||||
- type: outaux
|
||||
id: 30
|
||||
parameters: {auxgain: 23, outgain: 25, stereo: 1}
|
||||
- name: pad
|
||||
numvoices: 1
|
||||
units:
|
||||
- type: envelope
|
||||
id: 1
|
||||
parameters: {attack: 72, decay: 96, gain: 128, release: 88, stereo: 0, sustain: 96}
|
||||
- type: send
|
||||
id: 2
|
||||
parameters: {amount: 64, port: 4, sendpop: 0, target: 1}
|
||||
- type: oscillator
|
||||
id: 1125
|
||||
parameters: {color: 80, detune: 60, gain: 128, lfo: 0, phase: 32, shape: 64, stereo: 0, transpose: 64, type: 2}
|
||||
- type: oscillator
|
||||
id: 1126
|
||||
parameters: {color: 96, detune: 72, gain: 128, lfo: 0, phase: 32, shape: 64, stereo: 0, transpose: 64, type: 1}
|
||||
- type: oscillator
|
||||
id: 5
|
||||
parameters: {color: 128, detune: 64, gain: 128, lfo: 1, phase: 0, shape: 90, stereo: 0, transpose: 32, type: 0}
|
||||
- type: send
|
||||
id: 6
|
||||
parameters: {amount: 68, port: 1, sendpop: 0, target: 1125}
|
||||
- type: send
|
||||
id: 78
|
||||
parameters: {amount: 61, port: 1, sendpop: 1, target: 1126}
|
||||
- type: addp
|
||||
id: 80
|
||||
parameters: {stereo: 0}
|
||||
- type: mulp
|
||||
id: 10
|
||||
parameters: {stereo: 0}
|
||||
- type: filter
|
||||
id: 11
|
||||
parameters: {bandpass: 0, frequency: 26, highpass: 0, lowpass: 1, negbandpass: 0, neghighpass: 1, resonance: 128, stereo: 0}
|
||||
- type: filter
|
||||
id: 1127
|
||||
parameters: {bandpass: 0, frequency: 64, highpass: 0, lowpass: 1, negbandpass: 0, neghighpass: 0, resonance: 64, stereo: 0}
|
||||
- type: distort
|
||||
id: 1128
|
||||
parameters: {drive: 109, stereo: 0}
|
||||
- type: pan
|
||||
id: 1129
|
||||
parameters: {panning: 64, stereo: 0}
|
||||
- type: delay
|
||||
id: 1130
|
||||
parameters: {damp: 64, dry: 128, feedback: 96, notetracking: 2, pregain: 96, stereo: 1}
|
||||
varargs: [24, 48]
|
||||
- type: outaux
|
||||
id: 1131
|
||||
parameters: {auxgain: 15, outgain: 15, stereo: 1}
|
||||
- name: HappyLead
|
||||
numvoices: 1
|
||||
units:
|
||||
- type: oscillator
|
||||
id: 164
|
||||
parameters: {color: 84, detune: 62, gain: 128, lfo: 0, phase: 0, shape: 64, stereo: 0, transpose: 64, type: 1, unison: 0}
|
||||
- type: oscillator
|
||||
id: 165
|
||||
parameters: {color: 128, detune: 62, gain: 92, lfo: 0, phase: 0, shape: 64, stereo: 0, transpose: 64, type: 1, unison: 2}
|
||||
- type: addp
|
||||
id: 166
|
||||
parameters: {stereo: 0}
|
||||
- type: envelope
|
||||
id: 163
|
||||
parameters: {attack: 44, decay: 64, gain: 72, release: 64, stereo: 0, sustain: 92}
|
||||
- type: mulp
|
||||
id: 167
|
||||
parameters: {stereo: 0}
|
||||
- type: pan
|
||||
id: 168
|
||||
parameters: {panning: 60, stereo: 0}
|
||||
- type: delay
|
||||
id: 169
|
||||
parameters: {damp: 0, dry: 64, feedback: 64, notetracking: 0, pregain: 54, stereo: 1}
|
||||
varargs: [12550, 24402, 21265, 32419]
|
||||
- type: outaux
|
||||
id: 172
|
||||
parameters: {auxgain: 64, outgain: 64, stereo: 1}
|
||||
- name: Global
|
||||
numvoices: 1
|
||||
units:
|
||||
- type: in
|
||||
id: 7
|
||||
parameters: {channel: 2, stereo: 1}
|
||||
- type: delay
|
||||
id: 8
|
||||
parameters: {damp: 25, dry: 0, feedback: 120, notetracking: 0, pregain: 40, stereo: 1}
|
||||
varargs: [1116, 1188, 1276, 1356, 1422, 1492, 1556, 1618, 1140, 1212, 1300, 1380, 1446, 1516, 1580, 1642]
|
||||
- type: out
|
||||
id: 9
|
||||
parameters: {gain: 64, stereo: 1}
|
||||
48
src/debug.h
Normal file
48
src/debug.h
Normal file
@ -0,0 +1,48 @@
|
||||
// This header contains some useful functions for debugging OpenGL.
|
||||
// Remember to disable them when building your final releases.
|
||||
|
||||
#include <windows.h>
|
||||
#include <GL/gl.h>
|
||||
#include "glext.h"
|
||||
|
||||
#define STRINGIFY2(x) #x // Thanks sooda!
|
||||
#define STRINGIFY(x) STRINGIFY2(x)
|
||||
#define CHECK_ERRORS() assertGlError(STRINGIFY(__LINE__))
|
||||
|
||||
static GLchar* getErrorString(GLenum errorCode)
|
||||
{
|
||||
if (errorCode == GL_NO_ERROR) {
|
||||
return (GLchar*) "No error";
|
||||
}
|
||||
else if (errorCode == GL_INVALID_VALUE) {
|
||||
return (GLchar*) "Invalid value";
|
||||
}
|
||||
else if (errorCode == GL_INVALID_ENUM) {
|
||||
return (GLchar*) "Invalid enum";
|
||||
}
|
||||
else if (errorCode == GL_INVALID_OPERATION) {
|
||||
return (GLchar*) "Invalid operation";
|
||||
}
|
||||
else if (errorCode == GL_STACK_OVERFLOW) {
|
||||
return (GLchar*) "Stack overflow";
|
||||
}
|
||||
else if (errorCode == GL_STACK_UNDERFLOW) {
|
||||
return (GLchar*) "Stack underflow";
|
||||
}
|
||||
else if (errorCode == GL_OUT_OF_MEMORY) {
|
||||
return (GLchar*) "Out of memory";
|
||||
}
|
||||
return (GLchar*) "Unknown";
|
||||
}
|
||||
|
||||
static void assertGlError(const char* error_message)
|
||||
{
|
||||
const GLenum ErrorValue = glGetError();
|
||||
if (ErrorValue == GL_NO_ERROR) return;
|
||||
|
||||
const char* APPEND_DETAIL_STRING = ": %s\n";
|
||||
const size_t APPEND_LENGTH = strlen(APPEND_DETAIL_STRING) + 1;
|
||||
const size_t message_length = strlen(error_message);
|
||||
MessageBox(NULL, error_message, getErrorString(ErrorValue), 0x00000000L);
|
||||
ExitProcess(0);
|
||||
}
|
||||
99
src/definitions.h
Normal file
99
src/definitions.h
Normal file
@ -0,0 +1,99 @@
|
||||
// This header contains necessary structures for setting up correct screen modes,
|
||||
// pixel formats, audio formats, and so on.
|
||||
|
||||
// minify windows.h
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_EXTRA_LEAN
|
||||
#define VC_LEANMEAN
|
||||
#define VC_EXTRALEAN
|
||||
|
||||
#pragma pack(push, 8)
|
||||
#include <windows.h>
|
||||
#pragma pack(pop)
|
||||
|
||||
#include <GL/gl.h>
|
||||
|
||||
// global resolution
|
||||
#define XRES 1920
|
||||
#define YRES 1080
|
||||
|
||||
// declare this symbol if your code uses floating point types
|
||||
// extern "C" int _fltused;
|
||||
|
||||
#pragma data_seg(".pixelfmt")
|
||||
static const PIXELFORMATDESCRIPTOR pfd = {
|
||||
#if BREAK_COMPATIBILITY
|
||||
#if POST_PASS
|
||||
0, 0, PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER, PFD_TYPE_RGBA,
|
||||
0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0
|
||||
#else
|
||||
0, 0, PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER, PFD_TYPE_RGBA,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0
|
||||
#endif
|
||||
#else
|
||||
sizeof(pfd), 1, PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER, PFD_TYPE_RGBA,
|
||||
32, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 32, 0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0
|
||||
#endif
|
||||
};
|
||||
|
||||
#pragma data_seg(".screensettings")
|
||||
static DEVMODE screenSettings = {
|
||||
{0}, 0, 0, sizeof(screenSettings), 0, DM_PELSWIDTH|DM_PELSHEIGHT,
|
||||
{0}, 0, 0, 0, 0, 0, {0}, 0, 0, XRES, YRES, 0, 0,
|
||||
#if(WINVER >= 0x0400)
|
||||
0, 0, 0, 0, 0, 0,
|
||||
#if (WINVER >= 0x0500) || (_WIN32_WINNT >= 0x0400)
|
||||
0, 0
|
||||
#endif
|
||||
#endif
|
||||
};
|
||||
|
||||
#if USE_AUDIO
|
||||
// this file is auto generated by sointu
|
||||
#include "sointu/song.h"
|
||||
#ifndef DSBCAPS_TRUEPLAYPOSITION // Not defined in MinGW dsound headers, so let's add it
|
||||
#define DSBCAPS_TRUEPLAYPOSITION 0x00080000
|
||||
#endif
|
||||
#include <mmreg.h>
|
||||
#include <dsound.h>
|
||||
|
||||
|
||||
SUsample sound_buffer[SU_LENGTH_IN_SAMPLES * SU_CHANNEL_COUNT];
|
||||
WAVEFORMATEX wave_format = {
|
||||
#ifdef SU_SAMPLE_FLOAT
|
||||
WAVE_FORMAT_IEEE_FLOAT,
|
||||
#else
|
||||
WAVE_FORMAT_PCM,
|
||||
#endif
|
||||
SU_CHANNEL_COUNT,
|
||||
SU_SAMPLE_RATE,
|
||||
SU_SAMPLE_RATE * SU_SAMPLE_SIZE * SU_CHANNEL_COUNT,
|
||||
SU_SAMPLE_SIZE * SU_CHANNEL_COUNT,
|
||||
SU_SAMPLE_SIZE * 8,
|
||||
0
|
||||
};
|
||||
#pragma data_seg(".descfmt")
|
||||
DSBUFFERDESC buffer_description = {
|
||||
sizeof(DSBUFFERDESC),
|
||||
DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_GLOBALFOCUS | DSBCAPS_TRUEPLAYPOSITION,
|
||||
SU_LENGTH_IN_SAMPLES * SU_SAMPLE_SIZE * SU_CHANNEL_COUNT,
|
||||
0,
|
||||
&wave_format,
|
||||
0
|
||||
};
|
||||
|
||||
#pragma bss_seg(".syncbuf")
|
||||
extern "C" {
|
||||
int _fltused = 1;
|
||||
float syncBuf[SU_SYNCBUFFER_LENGTH+1];
|
||||
}
|
||||
#endif
|
||||
|
||||
// currently unused definitions
|
||||
#ifdef EDITOR_CONTROLS
|
||||
#define FAIL_KILL false
|
||||
#define PID_QUALIFIER
|
||||
#else
|
||||
#define FAIL_KILL true
|
||||
#define PID_QUALIFIER const
|
||||
#endif
|
||||
185
src/editor.cpp
Normal file
185
src/editor.cpp
Normal file
@ -0,0 +1,185 @@
|
||||
#include "editor.h"
|
||||
#include "song.h"
|
||||
|
||||
#include "stdio.h"
|
||||
#include "windows.h"
|
||||
#include "GL/gl.h"
|
||||
#include "glext.h"
|
||||
|
||||
using namespace Leviathan;
|
||||
|
||||
#define USE_MESSAGEBOX 0
|
||||
|
||||
Editor::Editor() : lastFrameStart(0), lastFrameStop(0), trackPosition(0.0), trackEnd(0.0), state(Playing)
|
||||
{
|
||||
printf("Editor opened...\n");
|
||||
}
|
||||
|
||||
void Editor::beginFrame(const unsigned long time)
|
||||
{
|
||||
lastFrameStart = time;
|
||||
}
|
||||
|
||||
void Editor::endFrame(const unsigned long time)
|
||||
{
|
||||
lastFrameStop = time;
|
||||
}
|
||||
|
||||
void Editor::printFrameStatistics()
|
||||
{
|
||||
const int frameTime = lastFrameStop - lastFrameStart;
|
||||
|
||||
// calculate average fps over 'windowSize' of frames
|
||||
float fps = 0.0f;
|
||||
for (int i = 0; i < windowSize - 1; ++i)
|
||||
{
|
||||
timeHistory[i] = timeHistory[i + 1];
|
||||
fps += 1.0f / static_cast<float>(timeHistory[i]);
|
||||
}
|
||||
timeHistory[windowSize - 1] = frameTime;
|
||||
fps += 1.0f / static_cast<float>(frameTime);
|
||||
fps *= 1000.0f / static_cast<float>(windowSize);
|
||||
|
||||
printf("%s: %0.2i:%0.2i (%i%%), frame duration: %i ms (running fps average: %2.2f) \r",
|
||||
state == Playing ? "Playing" : " Paused",
|
||||
// assuming y'all won't be making intros more than an hour long
|
||||
int(trackPosition/60.0), int(trackPosition) % 60, int(100.0f*trackPosition/trackEnd),
|
||||
frameTime, fps);
|
||||
}
|
||||
|
||||
double Editor::handleEvents(Leviathan::Song* track, double position)
|
||||
{
|
||||
if (GetAsyncKeyState(VK_MENU))
|
||||
{
|
||||
double seek = 0.0;
|
||||
if (GetAsyncKeyState(VK_DOWN))
|
||||
{
|
||||
state = Paused;
|
||||
track->pause();
|
||||
}
|
||||
if (GetAsyncKeyState(VK_UP))
|
||||
{
|
||||
state = Playing;
|
||||
track->play();
|
||||
}
|
||||
if (GetAsyncKeyState(VK_RIGHT) && !GetAsyncKeyState(VK_SHIFT)) seek += 1.0;
|
||||
if (GetAsyncKeyState(VK_LEFT) && !GetAsyncKeyState(VK_SHIFT)) seek -= 1.0;
|
||||
if (GetAsyncKeyState(VK_RIGHT) && GetAsyncKeyState(VK_SHIFT)) seek += 0.1;
|
||||
if (GetAsyncKeyState(VK_LEFT) && GetAsyncKeyState(VK_SHIFT)) seek -= 0.1;
|
||||
if (position + seek != position)
|
||||
{
|
||||
position += seek;
|
||||
track->seek(position);
|
||||
}
|
||||
}
|
||||
|
||||
if (GetAsyncKeyState(VK_CONTROL) && GetAsyncKeyState('S'))
|
||||
shaderUpdatePending = true;
|
||||
|
||||
trackPosition = position;
|
||||
trackEnd = track->getLength();
|
||||
|
||||
return position;
|
||||
}
|
||||
|
||||
void Editor::updateShaders(int* mainShaderPID, int* postShaderPID, bool force_update)
|
||||
{
|
||||
if (shaderUpdatePending || force_update)
|
||||
{
|
||||
// make sure the file has finished writing to disk
|
||||
if (timeGetTime() - previousUpdateTime > 200)
|
||||
{
|
||||
// only way i can think of to clear the line without "status line" residue
|
||||
printf("Refreshing shaders... \n");
|
||||
|
||||
Sleep(100);
|
||||
int newPID = reloadShaderSource("../src/shaders/fragment.frag");
|
||||
if (newPID > 0)
|
||||
*mainShaderPID = newPID;
|
||||
|
||||
newPID = reloadShaderSource("../src/shaders/post.frag");
|
||||
if (newPID > 0)
|
||||
*postShaderPID = newPID;
|
||||
}
|
||||
|
||||
previousUpdateTime = timeGetTime();
|
||||
shaderUpdatePending = false;
|
||||
}
|
||||
}
|
||||
|
||||
int Editor::reloadShaderSource(const char* filename)
|
||||
{
|
||||
long inputSize = 0;
|
||||
// we're of course opening a text file, but should be opened in binary ('b')
|
||||
// longer shaders are known to cause problems by producing garbage input when read
|
||||
FILE* file = fopen(filename, "rb");
|
||||
|
||||
if (file)
|
||||
{
|
||||
fseek(file, 0, SEEK_END);
|
||||
inputSize = ftell(file);
|
||||
rewind(file);
|
||||
|
||||
char* shaderString = static_cast<char*>(calloc(inputSize + 1, sizeof(char)));
|
||||
fread(shaderString, sizeof(char), inputSize, file);
|
||||
fclose(file);
|
||||
|
||||
// just to be sure...
|
||||
shaderString[inputSize] = '\0';
|
||||
|
||||
if (!compileAndDebugShader(shaderString, filename, false))
|
||||
{
|
||||
free(shaderString);
|
||||
// return an invalid PID value if compilation fails
|
||||
return -1;
|
||||
}
|
||||
|
||||
int pid = ((PFNGLCREATESHADERPROGRAMVPROC)wglGetProcAddress("glCreateShaderProgramv"))(GL_FRAGMENT_SHADER, 1, &shaderString);
|
||||
free(shaderString);
|
||||
|
||||
printf("Loaded shader from \"%s\"\n", filename);
|
||||
return pid;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Input shader file at \"%s\" not found, shader not reloaded\n", filename);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
bool Editor::compileAndDebugShader(const char* shader, const char* filename, bool kill_on_failure)
|
||||
{
|
||||
// try and compile the shader
|
||||
int result = 0;
|
||||
const int debugid = ((PFNGLCREATESHADERPROC)wglGetProcAddress("glCreateShader"))(GL_FRAGMENT_SHADER);
|
||||
((PFNGLSHADERSOURCEPROC)wglGetProcAddress("glShaderSource"))(debugid, 1, &shader, 0);
|
||||
((PFNGLCOMPILESHADERPROC)wglGetProcAddress("glCompileShader"))(debugid);
|
||||
|
||||
// get compile result
|
||||
((PFNGLGETSHADERIVPROC)wglGetProcAddress("glGetShaderiv"))(debugid, GL_COMPILE_STATUS, &result);
|
||||
if (result == GL_FALSE)
|
||||
{
|
||||
// display compile log on failure
|
||||
static char errorBuffer[shaderErrorBufferLength];
|
||||
((PFNGLGETSHADERINFOLOGPROC)wglGetProcAddress("glGetShaderInfoLog"))(debugid, shaderErrorBufferLength-1, NULL, static_cast<char*>(errorBuffer));
|
||||
|
||||
#if USE_MESSAGEBOX
|
||||
MessageBox(NULL, errorBuffer, "", 0x00000000L);
|
||||
#endif
|
||||
printf("Compilation errors in %s:\n\n %s\n", filename, errorBuffer);
|
||||
|
||||
if (kill_on_failure)
|
||||
{
|
||||
ExitProcess(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
((PFNGLDELETESHADERPROC)wglGetProcAddress("glDeleteShader"))(debugid);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
46
src/editor.h
Normal file
46
src/editor.h
Normal file
@ -0,0 +1,46 @@
|
||||
namespace Leviathan
|
||||
{
|
||||
// forward declaration
|
||||
class Song;
|
||||
}
|
||||
|
||||
namespace Leviathan
|
||||
{
|
||||
// simpler wrapper class for the editor functionality
|
||||
class Editor
|
||||
{
|
||||
public:
|
||||
Editor();
|
||||
|
||||
void beginFrame(const unsigned long time);
|
||||
|
||||
void endFrame(const unsigned long time);
|
||||
|
||||
void printFrameStatistics();
|
||||
|
||||
double handleEvents(Song* track, double position);
|
||||
|
||||
void updateShaders(int* mainShaderPID, int* postShaderPID, bool force_update = false);
|
||||
|
||||
private:
|
||||
int reloadShaderSource(const char* filename);
|
||||
|
||||
bool compileAndDebugShader(const char* shader, const char* filename, bool kill_on_failure = true);
|
||||
|
||||
enum PlayState {Playing, Paused};
|
||||
PlayState state;
|
||||
|
||||
unsigned long lastFrameStart;
|
||||
unsigned long lastFrameStop;
|
||||
|
||||
static const int shaderErrorBufferLength = 4096;
|
||||
static const int windowSize = 10;
|
||||
int timeHistory[windowSize] = {};
|
||||
|
||||
bool shaderUpdatePending = false;
|
||||
int previousUpdateTime;
|
||||
|
||||
double trackPosition;
|
||||
double trackEnd;
|
||||
};
|
||||
}
|
||||
78
src/fft.cpp
Normal file
78
src/fft.cpp
Normal file
@ -0,0 +1,78 @@
|
||||
#include "fft.h"
|
||||
#include <math.h>
|
||||
|
||||
static float window[FFT_SIZE];
|
||||
|
||||
constexpr float M_PI = 3.14159;
|
||||
|
||||
|
||||
// Call once before use
|
||||
void init_hamming_window() {
|
||||
for (int i = 0; i < FFT_SIZE; i++) {
|
||||
window[i] = 0.54f - 0.46f * cosf(2.0f * (float)M_PI * i / (FFT_SIZE - 1));
|
||||
}
|
||||
}
|
||||
|
||||
static unsigned int bit_reverse(unsigned int x, int log2n) {
|
||||
unsigned int n = 0;
|
||||
for (int i = 0; i < log2n; i++) {
|
||||
n <<= 1;
|
||||
n |= (x & 1);
|
||||
x >>= 1;
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
void compute_fft(float* time_data, float* freq_out) {
|
||||
static float real[FFT_SIZE];
|
||||
static float imag[FFT_SIZE];
|
||||
|
||||
int log2n = 0;
|
||||
for (int t = FFT_SIZE; t > 1; t >>= 1) ++log2n;
|
||||
|
||||
// Apply Hamming window
|
||||
for (int i = 0; i < FFT_SIZE; i++) {
|
||||
real[i] = time_data[i] * window[i];
|
||||
imag[i] = 0.0f;
|
||||
}
|
||||
|
||||
// Bit reversal
|
||||
for (int i = 0; i < FFT_SIZE; ++i) {
|
||||
int j = bit_reverse(i, log2n);
|
||||
if (j > i) {
|
||||
float tmp_re = real[i], tmp_im = imag[i];
|
||||
real[i] = real[j]; imag[i] = imag[j];
|
||||
real[j] = tmp_re; imag[j] = tmp_im;
|
||||
}
|
||||
}
|
||||
|
||||
// Cooley-Tukey FFT
|
||||
for (int s = 1; s <= log2n; ++s) {
|
||||
int m = 1 << s;
|
||||
for (int k = 0; k < FFT_SIZE; k += m) {
|
||||
for (int j = 0; j < m / 2; ++j) {
|
||||
int t = k + j;
|
||||
int u = t + m / 2;
|
||||
|
||||
float angle = -2.0f * (float)M_PI * j / m;
|
||||
float w_real = cosf(angle);
|
||||
float w_imag = sinf(angle);
|
||||
|
||||
float re = w_real * real[u] - w_imag * imag[u];
|
||||
float im = w_real * imag[u] + w_imag * real[u];
|
||||
|
||||
real[u] = real[t] - re;
|
||||
imag[u] = imag[t] - im;
|
||||
real[t] += re;
|
||||
imag[t] += im;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < FFT_SIZE / 2; ++i) {
|
||||
float mag = sqrtf(real[i] * real[i] + imag[i] * imag[i]) / FFT_SIZE;
|
||||
//float db = 20.0f * log10f(mag + 1e-6f); // Decibels
|
||||
//float normalized = (db + 60.0f) / 60.0f; // [0,1]
|
||||
freq_out[i] = mag;
|
||||
}
|
||||
}
|
||||
7
src/fft.h
Normal file
7
src/fft.h
Normal file
@ -0,0 +1,7 @@
|
||||
#pragma once
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
|
||||
#define FFT_SIZE 2048
|
||||
void init_hamming_window();
|
||||
void compute_fft(float* time_data, float* freq_out);
|
||||
209
src/fp.h
Normal file
209
src/fp.h
Normal file
@ -0,0 +1,209 @@
|
||||
// This header is by iq of RGBA and includes some float constants.
|
||||
// I've never used these myself but I guess they're useful???
|
||||
|
||||
#ifndef _FPCONSTANTS_H_
|
||||
#define _FPCONSTANTS_H_
|
||||
#define p0d00 0.0000000000f // 0.00f 0x00000000
|
||||
#define p0d01 0.0100097656f // 0.01f 0x3c240000
|
||||
#define p0d02 0.0200195313f // 0.02f 0x3ca40000
|
||||
#define p0d03 0.0300292969f // 0.03f 0x3cf60000
|
||||
#define p0d04 0.0400390625f // 0.04f 0x3d240000
|
||||
#define p0d05 0.0500488281f // 0.05f 0x3d4d0000
|
||||
#define p0d06 0.0600585938f // 0.06f 0x3d760000
|
||||
#define p0d07 0.0698242188f // 0.07f 0x3d8f0000
|
||||
#define p0d08 0.0800781250f // 0.08f 0x3da40000
|
||||
#define p0d09 0.0898437500f // 0.09f 0x3db80000
|
||||
#define p0d10 0.1000976563f // 0.10f 0x3dcd0000
|
||||
#define p0d11 0.1098632813f // 0.11f 0x3de10000
|
||||
#define p0d12 0.1201171875f // 0.12f 0x3df60000
|
||||
#define p0d13 0.1298828125f // 0.13f 0x3e050000
|
||||
#define p0d14 0.1396484375f // 0.14f 0x3e0f0000
|
||||
#define p0d15 0.1503906250f // 0.15f 0x3e1a0000
|
||||
#define p0d16 0.1601562500f // 0.16f 0x3e240000
|
||||
#define p0d17 0.1699218750f // 0.17f 0x3e2e0000
|
||||
#define p0d18 0.1796875000f // 0.18f 0x3e380000
|
||||
#define p0d19 0.1904296875f // 0.19f 0x3e430000
|
||||
#define p0d20 0.2001953125f // 0.20f 0x3e4d0000
|
||||
#define p0d21 0.2099609375f // 0.21f 0x3e570000
|
||||
#define p0d22 0.2197265625f // 0.22f 0x3e610000
|
||||
#define p0d23 0.2304687500f // 0.23f 0x3e6c0000
|
||||
#define p0d24 0.2402343750f // 0.24f 0x3e760000
|
||||
#define p0d25 0.2500000000f // 0.25f 0x3e800000
|
||||
#define p0d26 0.2597656250f // 0.26f 0x3e850000
|
||||
#define p0d27 0.2695312500f // 0.27f 0x3e8a0000
|
||||
#define p0d28 0.2792968750f // 0.28f 0x3e8f0000
|
||||
#define p0d29 0.2890625000f // 0.29f 0x3e940000
|
||||
#define p0d30 0.3007812500f // 0.30f 0x3e9a0000
|
||||
#define p0d31 0.3105468750f // 0.31f 0x3e9f0000
|
||||
#define p0d32 0.3203125000f // 0.32f 0x3ea40000
|
||||
#define p0d33 0.3300781250f // 0.33f 0x3ea90000
|
||||
#define p0d34 0.3398437500f // 0.34f 0x3eae0000
|
||||
#define p0d35 0.3496093750f // 0.35f 0x3eb30000
|
||||
#define p0d36 0.3593750000f // 0.36f 0x3eb80000
|
||||
#define p0d37 0.3691406250f // 0.37f 0x3ebd0000
|
||||
#define p0d38 0.3808593750f // 0.38f 0x3ec30000
|
||||
#define p0d39 0.3906250000f // 0.39f 0x3ec80000
|
||||
#define p0d40 0.4003906250f // 0.40f 0x3ecd0000
|
||||
#define p0d41 0.4101562500f // 0.41f 0x3ed20000
|
||||
#define p0d42 0.4199218750f // 0.42f 0x3ed70000
|
||||
#define p0d43 0.4296875000f // 0.43f 0x3edc0000
|
||||
#define p0d44 0.4394531250f // 0.44f 0x3ee10000
|
||||
#define p0d45 0.4492187500f // 0.45f 0x3ee60000
|
||||
#define p0d46 0.4609375000f // 0.46f 0x3eec0000
|
||||
#define p0d47 0.4707031250f // 0.47f 0x3ef10000
|
||||
#define p0d48 0.4804687500f // 0.48f 0x3ef60000
|
||||
#define p0d49 0.4902343750f // 0.49f 0x3efb0000
|
||||
#define p0d50 0.5000000000f // 0.50f 0x3f000000
|
||||
#define p0d51 0.5117187500f // 0.51f 0x3f030000
|
||||
#define p0d52 0.5195312500f // 0.52f 0x3f050000
|
||||
#define p0d53 0.5312500000f // 0.53f 0x3f080000
|
||||
#define p0d54 0.5390625000f // 0.54f 0x3f0a0000
|
||||
#define p0d55 0.5507812500f // 0.55f 0x3f0d0000
|
||||
#define p0d56 0.5585937500f // 0.56f 0x3f0f0000
|
||||
#define p0d57 0.5703125000f // 0.57f 0x3f120000
|
||||
#define p0d58 0.5781250000f // 0.58f 0x3f140000
|
||||
#define p0d59 0.5898437500f // 0.59f 0x3f170000
|
||||
#define p0d60 0.6015625000f // 0.60f 0x3f1a0000
|
||||
#define p0d61 0.6093750000f // 0.61f 0x3f1c0000
|
||||
#define p0d62 0.6210937500f // 0.62f 0x3f1f0000
|
||||
#define p0d63 0.6289062500f // 0.63f 0x3f210000
|
||||
#define p0d64 0.6406250000f // 0.64f 0x3f240000
|
||||
#define p0d65 0.6484375000f // 0.65f 0x3f260000
|
||||
#define p0d66 0.6601562500f // 0.66f 0x3f290000
|
||||
#define p0d67 0.6718750000f // 0.67f 0x3f2c0000
|
||||
#define p0d68 0.6796875000f // 0.68f 0x3f2e0000
|
||||
#define p0d69 0.6914062500f // 0.69f 0x3f310000
|
||||
#define p0d70 0.6992187500f // 0.70f 0x3f330000
|
||||
#define p0d71 0.7109375000f // 0.71f 0x3f360000
|
||||
#define p0d72 0.7187500000f // 0.72f 0x3f380000
|
||||
#define p0d73 0.7304687500f // 0.73f 0x3f3b0000
|
||||
#define p0d74 0.7382812500f // 0.74f 0x3f3d0000
|
||||
#define p0d75 0.7500000000f // 0.75f 0x3f400000
|
||||
#define p0d76 0.7617187500f // 0.76f 0x3f430000
|
||||
#define p0d77 0.7695312500f // 0.77f 0x3f450000
|
||||
#define p0d78 0.7812500000f // 0.78f 0x3f480000
|
||||
#define p0d79 0.7890625000f // 0.79f 0x3f4a0000
|
||||
#define p0d80 0.8007812500f // 0.80f 0x3f4d0000
|
||||
#define p0d81 0.8085937500f // 0.81f 0x3f4f0000
|
||||
#define p0d82 0.8203125000f // 0.82f 0x3f520000
|
||||
#define p0d83 0.8281250000f // 0.83f 0x3f540000
|
||||
#define p0d84 0.8398437500f // 0.84f 0x3f570000
|
||||
#define p0d85 0.8515625000f // 0.85f 0x3f5a0000
|
||||
#define p0d86 0.8593750000f // 0.86f 0x3f5c0000
|
||||
#define p0d87 0.8710937500f // 0.87f 0x3f5f0000
|
||||
#define p0d88 0.8789062500f // 0.88f 0x3f610000
|
||||
#define p0d89 0.8906250000f // 0.89f 0x3f640000
|
||||
#define p0d90 0.8984375000f // 0.90f 0x3f660000
|
||||
#define p0d91 0.9101562500f // 0.91f 0x3f690000
|
||||
#define p0d92 0.9218750000f // 0.92f 0x3f6c0000
|
||||
#define p0d93 0.9296875000f // 0.93f 0x3f6e0000
|
||||
#define p0d94 0.9414062500f // 0.94f 0x3f710000
|
||||
#define p0d95 0.9492187500f // 0.95f 0x3f730000
|
||||
#define p0d96 0.9609375000f // 0.96f 0x3f760000
|
||||
#define p0d97 0.9687500000f // 0.97f 0x3f780000
|
||||
#define p0d98 0.9804687500f // 0.98f 0x3f7b0000
|
||||
#define p0d99 0.9882812500f // 0.99f 0x3f7d0000
|
||||
#define p1d00 1.0000000000f // 1.00f 0x3f800000
|
||||
#define p1d01 1.0078125000f // 1.01f 0x3f810000
|
||||
#define p1d02 1.0234375000f // 1.02f 0x3f830000
|
||||
#define p1d03 1.0312500000f // 1.03f 0x3f840000
|
||||
#define p1d04 1.0390625000f // 1.04f 0x3f850000
|
||||
#define p1d05 1.0468750000f // 1.05f 0x3f860000
|
||||
#define p1d06 1.0625000000f // 1.06f 0x3f880000
|
||||
#define p1d07 1.0703125000f // 1.07f 0x3f890000
|
||||
#define p1d08 1.0781250000f // 1.08f 0x3f8a0000
|
||||
#define p1d09 1.0937500000f // 1.09f 0x3f8c0000
|
||||
#define p1d10 1.1015625000f // 1.10f 0x3f8d0000
|
||||
#define p1d11 1.1093750000f // 1.11f 0x3f8e0000
|
||||
#define p1d12 1.1171875000f // 1.12f 0x3f8f0000
|
||||
#define p1d13 1.1328125000f // 1.13f 0x3f910000
|
||||
#define p1d14 1.1406250000f // 1.14f 0x3f920000
|
||||
#define p1d15 1.1484375000f // 1.15f 0x3f930000
|
||||
#define p1d16 1.1562500000f // 1.16f 0x3f940000
|
||||
#define p1d17 1.1718750000f // 1.17f 0x3f960000
|
||||
#define p1d18 1.1796875000f // 1.18f 0x3f970000
|
||||
#define p1d19 1.1875000000f // 1.19f 0x3f980000
|
||||
#define p1d20 1.2031250000f // 1.20f 0x3f9a0000
|
||||
#define p1d21 1.2109375000f // 1.21f 0x3f9b0000
|
||||
#define p1d22 1.2187500000f // 1.22f 0x3f9c0000
|
||||
#define p1d23 1.2265625000f // 1.23f 0x3f9d0000
|
||||
#define p1d24 1.2421875000f // 1.24f 0x3f9f0000
|
||||
#define p1d25 1.2500000000f // 1.25f 0x3fa00000
|
||||
#define p1d26 1.2578125000f // 1.26f 0x3fa10000
|
||||
#define p1d27 1.2734375000f // 1.27f 0x3fa30000
|
||||
#define p1d28 1.2812500000f // 1.28f 0x3fa40000
|
||||
#define p1d29 1.2890625000f // 1.29f 0x3fa50000
|
||||
#define p1d30 1.2968750000f // 1.30f 0x3fa60000
|
||||
#define p1d31 1.3125000000f // 1.31f 0x3fa80000
|
||||
#define p1d32 1.3203125000f // 1.32f 0x3fa90000
|
||||
#define p1d33 1.3281250000f // 1.33f 0x3faa0000
|
||||
#define p1d34 1.3437500000f // 1.34f 0x3fac0000
|
||||
#define p1d35 1.3515625000f // 1.35f 0x3fad0000
|
||||
#define p1d36 1.3593750000f // 1.36f 0x3fae0000
|
||||
#define p1d37 1.3671875000f // 1.37f 0x3faf0000
|
||||
#define p1d38 1.3828125000f // 1.38f 0x3fb10000
|
||||
#define p1d39 1.3906250000f // 1.39f 0x3fb20000
|
||||
#define p1d40 1.3984375000f // 1.40f 0x3fb30000
|
||||
#define p1d41 1.4062500000f // 1.41f 0x3fb40000
|
||||
#define p1d42 1.4218750000f // 1.42f 0x3fb60000
|
||||
#define p1d43 1.4296875000f // 1.43f 0x3fb70000
|
||||
#define p1d44 1.4375000000f // 1.44f 0x3fb80000
|
||||
#define p1d45 1.4531250000f // 1.45f 0x3fba0000
|
||||
#define p1d46 1.4609375000f // 1.46f 0x3fbb0000
|
||||
#define p1d47 1.4687500000f // 1.47f 0x3fbc0000
|
||||
#define p1d48 1.4765625000f // 1.48f 0x3fbd0000
|
||||
#define p1d49 1.4921875000f // 1.49f 0x3fbf0000
|
||||
#define p1d50 1.5000000000f // 1.50f 0x3fc00000
|
||||
#define p1d51 1.5078125000f // 1.51f 0x3fc10000
|
||||
#define p1d52 1.5234375000f // 1.52f 0x3fc30000
|
||||
#define p1d53 1.5312500000f // 1.53f 0x3fc40000
|
||||
#define p1d54 1.5390625000f // 1.54f 0x3fc50000
|
||||
#define p1d55 1.5468750000f // 1.55f 0x3fc60000
|
||||
#define p1d56 1.5625000000f // 1.56f 0x3fc80000
|
||||
#define p1d57 1.5703125000f // 1.57f 0x3fc90000
|
||||
#define p1d58 1.5781250000f // 1.58f 0x3fca0000
|
||||
#define p1d59 1.5937500000f // 1.59f 0x3fcc0000
|
||||
#define p1d60 1.6015625000f // 1.60f 0x3fcd0000
|
||||
#define p1d61 1.6093750000f // 1.61f 0x3fce0000
|
||||
#define p1d62 1.6171875000f // 1.62f 0x3fcf0000
|
||||
#define p1d63 1.6328125000f // 1.63f 0x3fd10000
|
||||
#define p1d64 1.6406250000f // 1.64f 0x3fd20000
|
||||
#define p1d65 1.6484375000f // 1.65f 0x3fd30000
|
||||
#define p1d66 1.6562500000f // 1.66f 0x3fd40000
|
||||
#define p1d67 1.6718750000f // 1.67f 0x3fd60000
|
||||
#define p1d68 1.6796875000f // 1.68f 0x3fd70000
|
||||
#define p1d69 1.6875000000f // 1.69f 0x3fd80000
|
||||
#define p1d70 1.7031250000f // 1.70f 0x3fda0000
|
||||
#define p1d71 1.7109375000f // 1.71f 0x3fdb0000
|
||||
#define p1d72 1.7187500000f // 1.72f 0x3fdc0000
|
||||
#define p1d73 1.7265625000f // 1.73f 0x3fdd0000
|
||||
#define p1d74 1.7421875000f // 1.74f 0x3fdf0000
|
||||
#define p1d75 1.7500000000f // 1.75f 0x3fe00000
|
||||
#define p1d76 1.7578125000f // 1.76f 0x3fe10000
|
||||
#define p1d77 1.7734375000f // 1.77f 0x3fe30000
|
||||
#define p1d78 1.7812500000f // 1.78f 0x3fe40000
|
||||
#define p1d79 1.7890625000f // 1.79f 0x3fe50000
|
||||
#define p1d80 1.7968750000f // 1.80f 0x3fe60000
|
||||
#define p1d81 1.8125000000f // 1.81f 0x3fe80000
|
||||
#define p1d82 1.8203125000f // 1.82f 0x3fe90000
|
||||
#define p1d83 1.8281250000f // 1.83f 0x3fea0000
|
||||
#define p1d84 1.8437500000f // 1.84f 0x3fec0000
|
||||
#define p1d85 1.8515625000f // 1.85f 0x3fed0000
|
||||
#define p1d86 1.8593750000f // 1.86f 0x3fee0000
|
||||
#define p1d87 1.8671875000f // 1.87f 0x3fef0000
|
||||
#define p1d88 1.8828125000f // 1.88f 0x3ff10000
|
||||
#define p1d89 1.8906250000f // 1.89f 0x3ff20000
|
||||
#define p1d90 1.8984375000f // 1.90f 0x3ff30000
|
||||
#define p1d91 1.9062500000f // 1.91f 0x3ff40000
|
||||
#define p1d92 1.9218750000f // 1.92f 0x3ff60000
|
||||
#define p1d93 1.9296875000f // 1.93f 0x3ff70000
|
||||
#define p1d94 1.9375000000f // 1.94f 0x3ff80000
|
||||
#define p1d95 1.9531250000f // 1.95f 0x3ffa0000
|
||||
#define p1d96 1.9609375000f // 1.96f 0x3ffb0000
|
||||
#define p1d97 1.9687500000f // 1.97f 0x3ffc0000
|
||||
#define p1d98 1.9765625000f // 1.98f 0x3ffd0000
|
||||
#define p1d99 1.9921875000f // 1.99f 0x3fff0000
|
||||
#define p2d00 2.0000000000f
|
||||
#define p2d10 2.0937500000f
|
||||
|
||||
#endif
|
||||
12416
src/glext.h
Normal file
12416
src/glext.h
Normal file
File diff suppressed because it is too large
Load Diff
247
src/main.cpp
Normal file
247
src/main.cpp
Normal file
@ -0,0 +1,247 @@
|
||||
// custom build and feature flags
|
||||
#ifdef DEBUG
|
||||
#define OPENGL_DEBUG 0
|
||||
#define FULLSCREEN 0
|
||||
#define DESPERATE 0
|
||||
#define BREAK_COMPATIBILITY 0
|
||||
#else
|
||||
#define OPENGL_DEBUG 0
|
||||
#define FULLSCREEN 0
|
||||
#define DESPERATE 0
|
||||
#define BREAK_COMPATIBILITY 0
|
||||
#endif
|
||||
|
||||
#define POST_PASS 0
|
||||
#define USE_MIPMAPS 1
|
||||
#define USE_AUDIO 1
|
||||
#define NO_UNIFORMS 0
|
||||
|
||||
#include "definitions.h"
|
||||
#if OPENGL_DEBUG
|
||||
#include "debug.h"
|
||||
#endif
|
||||
|
||||
#include "glext.h"
|
||||
#pragma data_seg(".shader")
|
||||
#include "shaders/fragment.inl"
|
||||
#if POST_PASS
|
||||
#pragma data_seg(".shader")
|
||||
#include "shaders/post.inl"
|
||||
#endif
|
||||
|
||||
#include "fft.h"
|
||||
|
||||
#pragma data_seg(".pids")
|
||||
// static allocation saves a few bytes
|
||||
static int pidMain;
|
||||
static int pidPost;
|
||||
// static HDC hDC;
|
||||
|
||||
#ifndef EDITOR_CONTROLS
|
||||
#pragma code_seg(".main")
|
||||
void entrypoint(void)
|
||||
#else
|
||||
#include "editor.h"
|
||||
|
||||
int __cdecl main(int argc, char* argv[])
|
||||
#endif
|
||||
|
||||
{
|
||||
// initialize window
|
||||
#if FULLSCREEN
|
||||
ChangeDisplaySettings(&screenSettings, CDS_FULLSCREEN);
|
||||
ShowCursor(0);
|
||||
HWND window = CreateWindow((LPCSTR)0xC018, 0, WS_POPUP | WS_VISIBLE | WS_MAXIMIZE, 0, 0, 0, 0, 0, 0, 0, 0);
|
||||
const HDC hDC = GetDC(window);
|
||||
#else
|
||||
#ifdef EDITOR_CONTROLS
|
||||
HWND window = CreateWindow("static", 0, WS_POPUP | WS_VISIBLE, 0, 0, XRES, YRES, 0, 0, 0, 0);
|
||||
HDC hDC = GetDC(window);
|
||||
#else
|
||||
// you can create a pseudo fullscreen window by similarly enabling the WS_MAXIMIZE flag as above
|
||||
// in which case you can replace the resolution parameters with 0s and save a couple bytes
|
||||
// this only works if the resolution is set to the display device's native resolution
|
||||
HWND window = CreateWindow((LPCSTR)0xC018, 0, WS_POPUP | WS_VISIBLE, 0, 0, XRES, YRES, 0, 0, 0, 0);
|
||||
HDC hDC = GetDC(window);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// initalize opengl context
|
||||
SetPixelFormat(hDC, ChoosePixelFormat(hDC, &pfd), &pfd);
|
||||
wglMakeCurrent(hDC, wglCreateContext(hDC));
|
||||
|
||||
// create and compile shader programs
|
||||
pidMain = ((PFNGLCREATESHADERPROGRAMVPROC)wglGetProcAddress("glCreateShaderProgramv"))(GL_FRAGMENT_SHADER, 1, &fragment_frag);
|
||||
#if POST_PASS
|
||||
pidPost = ((PFNGLCREATESHADERPROGRAMVPROC)wglGetProcAddress("glCreateShaderProgramv"))(GL_FRAGMENT_SHADER, 1, &post_frag);
|
||||
#endif
|
||||
|
||||
#ifdef SU_LOAD_GMDLS
|
||||
su_load_gmdls();
|
||||
#endif // SU_LOAD_GMDLS
|
||||
// initialize sound
|
||||
#ifndef EDITOR_CONTROLS
|
||||
#if USE_AUDIO
|
||||
LPDIRECTSOUND direct_sound;
|
||||
LPDIRECTSOUNDBUFFER direct_sound_buffer;
|
||||
DirectSoundCreate(0, &direct_sound, 0);
|
||||
|
||||
IDirectSound_SetCooperativeLevel(direct_sound, window, DSSCL_PRIORITY);
|
||||
IDirectSound_CreateSoundBuffer(direct_sound, &buffer_description, &direct_sound_buffer, NULL);
|
||||
|
||||
LPVOID p1;
|
||||
DWORD l1;
|
||||
IDirectSoundBuffer_Lock(direct_sound_buffer, 0, SU_LENGTH_IN_SAMPLES * SU_CHANNEL_COUNT * SU_SAMPLE_SIZE, &p1, &l1, NULL, NULL, 0);
|
||||
|
||||
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)su_render_song, p1, 0, 0);
|
||||
|
||||
#endif
|
||||
|
||||
#else
|
||||
Leviathan::Editor editor = Leviathan::Editor();
|
||||
editor.updateShaders(&pidMain, &pidPost, true);
|
||||
|
||||
// absolute path always works here
|
||||
// relative path works only when not ran from visual studio directly
|
||||
Leviathan::Song track(L"audio.wav");
|
||||
track.play();
|
||||
double position = 0.0;
|
||||
#endif
|
||||
|
||||
long playCursor = 0;
|
||||
long lastPlayCursor = -1;
|
||||
volatile float maximum = 0.0; // Helper variable to calculate maximum fft output for normalization
|
||||
|
||||
// Unlock buffer for next use
|
||||
IDirectSoundBuffer_Unlock(direct_sound_buffer, p1, SU_LENGTH_IN_SAMPLES * SU_CHANNEL_COUNT * SU_SAMPLE_SIZE, NULL, NULL);
|
||||
|
||||
// Play sound
|
||||
direct_sound_buffer->Play(0, 0, 0);
|
||||
|
||||
static float syncs[1 + SU_NUMSYNCS];
|
||||
|
||||
// Init FFT
|
||||
init_hamming_window();
|
||||
// FFT buffers
|
||||
static float fft_input[FFT_SIZE];
|
||||
static float fft_output[FFT_SIZE / 2]; // Magnitudes
|
||||
static float fft_uniform[FFT_SIZE / 4];
|
||||
|
||||
do
|
||||
{
|
||||
direct_sound_buffer->GetCurrentPosition((DWORD*)&playCursor, NULL);
|
||||
|
||||
#if !(DESPERATE)
|
||||
// do minimal message handling so windows doesn't kill your application
|
||||
// not always strictly necessary but increases compatibility and reliability a lot
|
||||
// normally you'd pass an msg struct as the first argument but it's just an
|
||||
// output parameter and the implementation presumably does a NULL check
|
||||
PeekMessage(0, 0, 0, 0, PM_REMOVE);
|
||||
#endif
|
||||
|
||||
// render with the primary shader
|
||||
((PFNGLUSEPROGRAMPROC)wglGetProcAddress("glUseProgram"))(pidMain);
|
||||
#ifndef EDITOR_CONTROLS
|
||||
// if you don't have an audio system figure some other way to pass time to your shader
|
||||
#if USE_AUDIO
|
||||
|
||||
// it is possible to upload your vars as vertex color attribute (gl_Color) to save one function import
|
||||
#if NO_UNIFORMS
|
||||
glColor3ui(MMTime.u.sample, 0, 0);
|
||||
#else
|
||||
// remember to divide your shader time variable with the SAMPLE_RATE (44100 with 4klang)
|
||||
//((PFNGLUNIFORM1IPROC)wglGetProcAddress("glUniform1i"))(0, MMTime.u.sample);
|
||||
#endif
|
||||
#endif
|
||||
#else
|
||||
position = track.getTime();
|
||||
((PFNGLUNIFORM1IPROC)wglGetProcAddress("glUniform1i"))(0, (static_cast<int>(position*44100.0)));
|
||||
|
||||
#endif
|
||||
|
||||
/******************
|
||||
* FFT
|
||||
*******************/
|
||||
LPVOID audio_ptr = NULL;
|
||||
DWORD audio_size = 0;
|
||||
|
||||
// Read audio
|
||||
HRESULT hr = IDirectSoundBuffer_Lock(direct_sound_buffer, 0, FFT_SIZE * sizeof(SUsample), &audio_ptr, &audio_size, NULL, NULL, DSBLOCK_FROMWRITECURSOR);
|
||||
|
||||
if (SUCCEEDED(hr) && audio_ptr) {
|
||||
if (playCursor < ((SU_LENGTH_IN_SAMPLES * SU_CHANNEL_COUNT * SU_SAMPLE_SIZE) - (FFT_SIZE* SU_CHANNEL_COUNT * SU_SAMPLE_SIZE)))
|
||||
{
|
||||
SUsample* samples = (SUsample*)audio_ptr;
|
||||
for (int i = 0; i < FFT_SIZE; ++i) {
|
||||
fft_input[i] = (float)samples[i];
|
||||
}
|
||||
}
|
||||
|
||||
IDirectSoundBuffer_Unlock(direct_sound_buffer, audio_ptr, audio_size, NULL, 0);
|
||||
}
|
||||
|
||||
// Calculate FFT
|
||||
compute_fft(fft_input, fft_output);
|
||||
|
||||
// Normalize output
|
||||
for (int i = 0; i < (FFT_SIZE / 4); i++)
|
||||
{
|
||||
float gain = 50.0f;
|
||||
float alpha = 0.15f; // "Hidastaa" FFT:n piikkej<65>
|
||||
float threshhold = 0.05f; // Alin arvo mik<69> p<><70>stet<65><74>n shaderille (v<>hent<6E><74> "noisea")
|
||||
float x_t = fft_output[i] * gain;
|
||||
// Exponential smoothing kaava
|
||||
// s(t) = alpha*x(t)+(1-alpha)*s(t-1)
|
||||
fft_uniform[i] = (x_t < threshhold) ? 0.f : alpha*(x_t) + (1-alpha)*fft_uniform[i];
|
||||
}
|
||||
|
||||
syncs[0] = (float)playCursor / (SU_SAMPLE_RATE * SU_CHANNEL_COUNT * SU_SAMPLE_SIZE); // Aika sekunteina.
|
||||
|
||||
for (int i = 0; i < SU_NUMSYNCS; ++i)
|
||||
{
|
||||
syncs[i + 1] = syncBuf[(playCursor / (2 * sizeof(SUsample)) >> 8) * SU_NUMSYNCS + i];
|
||||
}
|
||||
|
||||
PFNGLUNIFORM1FVPROC glUniform1fvProc = ((PFNGLUNIFORM1FVPROC)wglGetProcAddress("glUniform1fv"));
|
||||
glUniform1fvProc(0, SU_NUMSYNCS + 1, syncs);
|
||||
glUniform1fvProc(8, FFT_SIZE / 4, fft_uniform);
|
||||
|
||||
glRects(-1, -1, 1, 1);
|
||||
|
||||
//syncs[0] = -syncs[0];
|
||||
//glUniform1fvProc(0, SU_NUMSYNCS + 1, syncs);
|
||||
|
||||
// render "post process" using the opengl backbuffer
|
||||
#if POST_PASS
|
||||
glBindTexture(GL_TEXTURE_2D, 1);
|
||||
#if USE_MIPMAPS
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
|
||||
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 0, 0, XRES, YRES, 0);
|
||||
((PFNGLGENERATEMIPMAPPROC)wglGetProcAddress("glGenerateMipmap"))(GL_TEXTURE_2D);
|
||||
#else
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 0, 0, XRES, YRES, 0);
|
||||
#endif
|
||||
((PFNGLACTIVETEXTUREPROC)wglGetProcAddress("glActiveTexture"))(GL_TEXTURE0);
|
||||
((PFNGLUSEPROGRAMPROC)wglGetProcAddress("glUseProgram"))(pidPost);
|
||||
((PFNGLUNIFORM1IPROC)wglGetProcAddress("glUniform1i"))(0, 0);
|
||||
glRects(-1, -1, 1, 1);
|
||||
#endif
|
||||
|
||||
SwapBuffers(hDC);
|
||||
|
||||
// handle functionality of the editor
|
||||
#ifdef EDITOR_CONTROLS
|
||||
editor.endFrame(timeGetTime());
|
||||
position = editor.handleEvents(&track, position);
|
||||
editor.printFrameStatistics();
|
||||
editor.updateShaders(&pidMain, &pidPost);
|
||||
#endif
|
||||
if (playCursor < lastPlayCursor) {
|
||||
break;
|
||||
}
|
||||
lastPlayCursor = playCursor;
|
||||
} while(!GetAsyncKeyState(VK_ESCAPE));
|
||||
|
||||
ExitProcess(0);
|
||||
}
|
||||
439
src/shaders/_fragment.frag
Normal file
439
src/shaders/_fragment.frag
Normal file
@ -0,0 +1,439 @@
|
||||
/* uses some snippets from:
|
||||
* "Seascape" by Alexander Alekseev aka TDM - 2014
|
||||
* License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
|
||||
* Contact: tdmaav@gmail.com
|
||||
*/
|
||||
|
||||
//precision mediump float;
|
||||
#version 460
|
||||
uniform int m;
|
||||
out vec4 o;
|
||||
float u_time = m/float(44100);
|
||||
const float PI = 22./7.;
|
||||
|
||||
vec3 no(vec3 v) { return normalize(v); }
|
||||
float cl(float a, float b, float c) { return clamp(a,b,c); }
|
||||
|
||||
// Rotate
|
||||
mat2 rot2D(float angle) {
|
||||
float s = sin(angle), c = cos(angle);
|
||||
return mat2(c, -s, s, c);
|
||||
}
|
||||
|
||||
float smax( float a, float b, float k )
|
||||
{
|
||||
float h = max(k-abs(a-b),0.0);
|
||||
return max(a, b) + h*h*0.25/k;
|
||||
}
|
||||
|
||||
float hash(vec2 p, int algo)
|
||||
{
|
||||
if (algo == 1) {
|
||||
float h = dot(p,vec2(127.1,311.7));
|
||||
return fract(sin(h)*43758.5453123);
|
||||
}
|
||||
p = 50. * fract( p*0.3183099);
|
||||
return fract( p.x*p.y*(p.x+p.y) );
|
||||
}
|
||||
|
||||
float noise(vec2 p, float scale, int a)
|
||||
{
|
||||
vec2 i = floor( p ),
|
||||
f = fract( p ),
|
||||
u = f*f*(3.-2.*f);
|
||||
float sc = scale;
|
||||
if (a == 1) sc = 2.;
|
||||
return -scale+sc*mix( mix( hash( i + vec2(0.), a),
|
||||
hash( i + vec2(1.0,0.0), a ), u.x),
|
||||
mix( hash( i + vec2(0.0,1.0), a),
|
||||
hash( i + vec2(1.), a), u.x), u.y);
|
||||
}
|
||||
|
||||
/////////////////
|
||||
// GEOMETRY //
|
||||
/////////////////
|
||||
/*float sdSphere(vec3 p, float r) {
|
||||
return length(p)-r;
|
||||
}*/
|
||||
|
||||
float sdCappedCylinder( vec3 p, float h, float r )
|
||||
{
|
||||
vec2 d = abs(vec2(length(p.xy),p.z)) - vec2(r,h);
|
||||
return min(max(d.x,d.y),0.0) + length(max(d,0.0));
|
||||
}
|
||||
|
||||
float sdBox2(vec3 p, vec3 b) {
|
||||
vec3 q = abs(p) - b;
|
||||
return length(max(q,0.)) + min(max(q.x,max(q.y,q.z)),0.);
|
||||
}
|
||||
|
||||
float sdTriPrism( vec3 p, vec2 h, float rot )
|
||||
{
|
||||
p.xy *= rot2D(rot);
|
||||
vec3 q = abs(p);
|
||||
return max(q.z-h.y,max(q.x*.866025+p.y*.5,-p.y)-h.x*.5);
|
||||
}
|
||||
|
||||
float sdPyramid( vec3 p, float s)
|
||||
{
|
||||
p = abs(p);
|
||||
return (p.x+p.y+p.z-s)*0.577;// 35027;
|
||||
}
|
||||
|
||||
//////////////////
|
||||
// ANIMATION //
|
||||
//////////////////
|
||||
|
||||
// POSITIONS
|
||||
//const vec3 glyph1Pos = vec3(1.7,-1.1,0.0);
|
||||
//const vec3 glyph2Pos = vec3(2.0,0.0,0.0);
|
||||
|
||||
//const vec3 glyph4Pos = vec3(0.0,2.0,0.0)
|
||||
//const vec3 glyph6Pos = vec3(1.5 * -1.,1.4,0.0);
|
||||
//const vec3 glyph7Pos = vec3(1.7 * -1.,-1.1,0.0);
|
||||
|
||||
// DELAYS
|
||||
float STARTDELAY = 9., glow = 0.;
|
||||
|
||||
// POSITIONS
|
||||
|
||||
|
||||
// COLORS
|
||||
vec3 chevronColor = vec3(0.36, 0.9, 0.0);
|
||||
|
||||
// with duration d, startTime s and speed up with timeFact
|
||||
float timedSine(vec3 i) {
|
||||
return min((u_time - i.y)*i.z, i.x*PI);
|
||||
}
|
||||
|
||||
float calcFactor (float startTime)
|
||||
{
|
||||
return STARTDELAY + STARTDELAY*cl(sin(timedSine(vec3(1.5, startTime, 4.)) * 0.06), -.9, .9);
|
||||
}
|
||||
|
||||
// Animate ring movements
|
||||
vec3 ringAnim(vec3 p) {
|
||||
for (float i = 0.; i < 7.; i++) {
|
||||
float rotateDelay = STARTDELAY + (i * 3.), o=1.;
|
||||
if(u_time > rotateDelay) {
|
||||
if(mod(i,2.) >= 1.) o = -1.;
|
||||
p.xy *= rot2D(calcFactor(rotateDelay)*o);
|
||||
}
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
// Animate prism movements
|
||||
float prismAnim(vec2 i) {
|
||||
if(u_time >= i.y) {
|
||||
i.x += (.045*cl(sin((timedSine(vec3(3., i.y, 40.)) * .4)),-.8, .8));
|
||||
}
|
||||
return i.x;
|
||||
}
|
||||
|
||||
//////////////
|
||||
// SCENE //
|
||||
//////////////
|
||||
float sea_octave(vec2 uv, float choppy) {
|
||||
uv += noise(uv, 1., 1);
|
||||
vec2 wv = 1.0-abs(sin(uv));
|
||||
wv = mix(wv, abs(cos(uv)),wv);
|
||||
return pow(1.0-pow(wv.x * wv.y,0.65),choppy);
|
||||
}
|
||||
|
||||
vec3 map(vec3 p, int displace)
|
||||
{
|
||||
float mat = 0., glo = 1e3,
|
||||
// Ring boxes
|
||||
an = PI/12.,
|
||||
step,
|
||||
anRot = floor(atan(p.y,p.x)/an + .5)*an;
|
||||
vec3 q = p;
|
||||
q.xy = rot2D(anRot)*q.xy;
|
||||
float d = length(max(abs(q.xy - vec2(1.8,0.))-vec2(0.24,0.14),0.)) - .02,
|
||||
|
||||
// Main ring
|
||||
d2 = abs(length(p.xy) - 1.8) - .2;
|
||||
d = min(d,d2);
|
||||
|
||||
// Inner ring
|
||||
d2 = smax( abs(length(p.xy) - 1.75) - .08, abs(p.z - .1)-.04, .005 );
|
||||
d = max(-d2,d);
|
||||
|
||||
// Depth slice rings
|
||||
d = smax( d, abs(p.z)-.1, .02 );
|
||||
|
||||
//Rotating glyphs
|
||||
vec3 p2 = ringAnim(p), q2=p2;
|
||||
an = PI/16.;
|
||||
q2.xy = rot2D(floor((atan(p2.y,p2.x)/an) + .5)*an)*q2.xy;
|
||||
d2 = sdBox2( q2.xyz - vec3(1.75,0.,0.), vec3(.04, .14, .05) ) - .02 + noise(p.xy*100.,1e-3,0);
|
||||
d = min(d, d2);
|
||||
if (d==d2) mat = 6.;
|
||||
|
||||
// Gate Base
|
||||
d2 = 1e3;
|
||||
float stepDist = 1.5, h = 0.0, d3, choppy=4., freq=0.6, amp=.2;
|
||||
for(int i = 0; i < 4; i++) {
|
||||
step = sdBox2(vec3(p.x,p.y+stepDist+0.05,p.z), vec3(2., .2,stepDist)) - .05;
|
||||
d2 = min(d2, step);
|
||||
stepDist += .2;
|
||||
}
|
||||
d2 += noise(p.xz * 50.+200., .007, 0);
|
||||
d = min(d, d2);
|
||||
if (d==d2) mat = 2.0;
|
||||
|
||||
if (displace == 1) {
|
||||
vec2 uv = p.xy;
|
||||
for(int i = 0; i < 4; i++) {
|
||||
d3 = sea_octave((uv+u_time)*freq,choppy);
|
||||
d3 += sea_octave((uv-u_time)*freq,choppy);
|
||||
h += d3 * amp;
|
||||
uv *= mat2(1.6,1.2,-1.2,1.6); freq *= 1.9; amp *= 0.22;
|
||||
choppy = mix(choppy,1.0,0.4);
|
||||
}
|
||||
}
|
||||
d2 = max(-sdCappedCylinder(p, 2.0, min((1.7 - (u_time - 28.9)*2.5),2.3)), sdCappedCylinder(p, .025, 1.6) - h*0.15);
|
||||
d2 = max(d2, sdCappedCylinder ( p, 0.3, 1.7));
|
||||
d = min(d, d2);
|
||||
if (d==d2) {
|
||||
mat = 1.0;
|
||||
}
|
||||
|
||||
// sand
|
||||
d2 = (p.y +3.7) + noise((vec2((p.x),(p.z*.44-40.))*.04)+100., 20., 0) + .25*sin(p.z*.5+u_time);
|
||||
d = min(d,d2);
|
||||
if (d==d2) mat = 3.0;
|
||||
|
||||
// pyradmid
|
||||
d2 = sdPyramid(p+vec3(-75., 0., 100.), 60.);
|
||||
d = min(d, d2);
|
||||
if (d==d2) mat=3.;
|
||||
// Prisms
|
||||
for(float i = 0.; i < 8.; i++ ) {
|
||||
q = p;
|
||||
anRot = 24.67 / (PI * 2.) + (i+1.) * PI / 4.;
|
||||
|
||||
// Nudge first and the last prism out of the ground
|
||||
if (i == 1.) anRot += .2;
|
||||
if (i == 7.) anRot -= .2;
|
||||
q.xy = rot2D(anRot) * q.xy;
|
||||
float rotateDelay = STARTDELAY + (i - 1.) * 3. + 1.5;
|
||||
// We can now call each prism by it's index
|
||||
// draw all except the middle bottom prism
|
||||
if (i > 0.) {
|
||||
q.x -= 1.95;
|
||||
vec3 q2 = q; // new point for movable parts
|
||||
if(u_time > rotateDelay) q2.x = prismAnim(vec2(q2.x, rotateDelay));
|
||||
float prismTop = sdTriPrism(vec3(q.x - .06, q.y, q.z), vec2(.1,.15), .5) -.01;
|
||||
d2 = max(-sdTriPrism(vec3(q2.x - .14, q2.y - 0. , q2.z), vec2(.22), .5) - .01 , sdTriPrism(vec3(q2.x, q2.y, q2.z ), vec2(.2,.12), .5) - .02);
|
||||
d2 = min(d2, prismTop);
|
||||
d = min(d, d2);
|
||||
// glyph locking thing material
|
||||
if (d == d2) mat = 4.;
|
||||
// glyph locking prism material
|
||||
if( d == prismTop) if(u_time > rotateDelay + .2) {
|
||||
mat = 5.;
|
||||
glo = min(d2, prismTop);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return vec3( d, mat, glo);
|
||||
}
|
||||
|
||||
////////////////
|
||||
// DRAWING //
|
||||
////////////////
|
||||
|
||||
float rayMarch(vec3 ro, vec3 rd, int a) {
|
||||
vec3 d;
|
||||
float t = 0.; // total distance travelled
|
||||
// Raymarching
|
||||
for (int i = 0; i < 100; i++) {
|
||||
d = map(ro + rd * t, 0); // Get distance to objects
|
||||
if (a==0&&d.z<0.3) glow += pow(0.01/d.z,0.8)*0.6;
|
||||
t += d.x; // "march" the ray
|
||||
if (d.x < 1e-3 || t > 500.) break;
|
||||
}
|
||||
return t;
|
||||
}
|
||||
|
||||
vec3 getNormal(vec3 p) {
|
||||
vec2 e = vec2(.01, 0.);
|
||||
vec3 n = map(p, 1).x - vec3(
|
||||
map(p-e.xyy,1).x,
|
||||
map(p-e.yxy,1).x,
|
||||
map(p-e.yyx,1).x);
|
||||
return no(n);
|
||||
}
|
||||
|
||||
float getLight(vec3 p, vec3 lightPos, float intensity, float shadow, vec3 n, float atte) {
|
||||
vec3 l = no(lightPos - p);
|
||||
float len = length( lightPos - p ); // Distance from the light to the surface point.
|
||||
float dif = cl(dot(n, l)*intensity, 0., intensity) * 1.0 / (1.0 + atte*len),
|
||||
d = rayMarch(p+n*.0025, l, 1);
|
||||
if(d<length(lightPos-p)) dif *= shadow;
|
||||
return dif;
|
||||
}
|
||||
|
||||
// lighting
|
||||
float diffuse(vec3 n,vec3 l,float p) {
|
||||
return pow(dot(n,l) * 0.4 + 0.6,p);
|
||||
}
|
||||
|
||||
float specular(vec3 normal,vec3 lightPos,vec3 rayOrigin,float specular) {
|
||||
float nrm = (specular + 8.0) / (PI * 8.0);
|
||||
return pow(max(dot(reflect(rayOrigin,normal),lightPos),0.0),specular) * nrm;
|
||||
}
|
||||
|
||||
vec3 getSeaColor(vec3 p, vec3 n, vec3 l, vec3 eye) {
|
||||
|
||||
vec3 color = vec3(0.0, 0.1, 0.3) + diffuse(n,l,60.0) * vec3(0.11, 0.16, 0.18) * 0.3;
|
||||
color -= vec3(0.73, 0.15, 0.66) * pow(cl(1.-dot(n, -eye), 0., 1.), .7);
|
||||
color += vec3(specular(n,l,eye,60.0))*0.2;
|
||||
return color;
|
||||
}
|
||||
|
||||
|
||||
vec3 applyFog(vec3 col, float t, vec3 rd, vec3 lightDir, float b ) {
|
||||
vec3 fogColor = mix( vec3(0.34, 0.11, 0.34), // blue
|
||||
vec3(0.93, 0.37, 0.16), // yellow
|
||||
pow(max( dot(rd, lightDir), 0.) ,8.));
|
||||
return mix( col, fogColor, 1.0 - exp(-t*b) );
|
||||
}
|
||||
|
||||
vec3 getCameraRayDir(vec2 uv, vec3 p, vec3 l, float z)
|
||||
{
|
||||
vec3 f = no(l-p),
|
||||
r = no(cross(vec3(0.,1.,0.), f)),
|
||||
u = cross(f,r),
|
||||
c = f*z,
|
||||
i = c + uv.x*r + uv.y*u,
|
||||
d = no(i);
|
||||
return d;
|
||||
}
|
||||
|
||||
vec3 postProcess(vec3 col) {
|
||||
// Vignette
|
||||
//col *= smoothstep(0.9, 0.5, length(gl_FragCoord.xy/u_resolution.xy-vec2(.5)));
|
||||
// Colour mapping
|
||||
col *= vec3(.9, 0.8, 0.7);
|
||||
// gamma
|
||||
col = pow( col, vec3(.45) );
|
||||
// Contrast = a
|
||||
col = smoothstep(0., 1., col);
|
||||
|
||||
// fade out at the end
|
||||
col += 1.0 - vec3(cl((46. - u_time)*.5, 0., 1.0));
|
||||
return col;
|
||||
}
|
||||
|
||||
vec3 cameraPos()
|
||||
{
|
||||
// first zoom in to the gate
|
||||
vec3 cPos = vec3(0., cl(6.-u_time,2.,6.), cl((100.-u_time*11.),6.,100.));
|
||||
if (u_time > 7.5) cPos += vec3(0., cl(7.5-u_time,-1.,0.), 0.);
|
||||
// close up shot for 1st glyph lock
|
||||
if (u_time > 10.5) cPos = vec3(2.,-1.,1.);
|
||||
// zoom away for 2nd glyph animation
|
||||
if (u_time > 12.) cPos = vec3(-1., -.7, 4.);
|
||||
if (u_time > 14.5) {
|
||||
cPos = vec3(0., 0., 4.);
|
||||
cPos.yz *= rot2D(-0.6-(cos(u_time-15.))*0.05);
|
||||
cPos.xz *= rot2D(sin((u_time-16.5)*0.1));
|
||||
}
|
||||
if (u_time > 23.5)
|
||||
{
|
||||
cPos = vec3(3., -.7, 4.);
|
||||
}
|
||||
if (u_time > 32.5)
|
||||
{
|
||||
cPos = vec3(-20.,10.,50.);
|
||||
}
|
||||
if (u_time > 36.5) {
|
||||
cPos = vec3(3., -.7, 4.);
|
||||
cPos.yz *= rot2D(((1.-cos(u_time-36.5))*-0.025));
|
||||
cPos.xz *= rot2D(sin((u_time-36.5)*0.07));
|
||||
}
|
||||
|
||||
return cPos;
|
||||
}
|
||||
|
||||
vec3 cameraPointAt() {
|
||||
vec3 p = vec3(0., -.5, 0.);
|
||||
// look at 1st glyph
|
||||
if (u_time > 10.5) p = vec3(1.7,-1.1,0.);
|
||||
// look gate at distance
|
||||
if(u_time > 12.) p = vec3(0.);
|
||||
if(u_time > 14.5) p = mix(vec3(1.5,1.4,0.0),vec3(-1.5,1.4,0.0), (u_time-16.5)*0.13);
|
||||
if(u_time > 23.5) p = vec3(0.);
|
||||
return p;
|
||||
}
|
||||
|
||||
// flash screen with glyph color when it is locked
|
||||
vec3 colorFlashesAnim(vec3 col) {
|
||||
if(u_time > 10.75) {
|
||||
float x = smoothstep(-1.,.8,sin((timedSine(vec3(.8, 10.75, 8.))*2.)));
|
||||
col = mix(col, chevronColor * (x * 1.4), x *.76);
|
||||
}
|
||||
return col;
|
||||
}
|
||||
|
||||
vec3 addSpecular(vec3 nor, vec3 rod, float amount, float phong)
|
||||
{
|
||||
return vec3(specular(nor,no(vec3(0.0,0.3,0.8)),no(rod),pow(10.,phong)))*amount;
|
||||
}
|
||||
|
||||
vec3 sceneGate(vec2 uv)
|
||||
{
|
||||
// Initialization
|
||||
vec3 ro = cameraPos(),
|
||||
rd = getCameraRayDir(uv, ro, cameraPointAt(), cl((43.-u_time)*-2.,2.,25.)),
|
||||
col = vec3(0.);
|
||||
float d = rayMarch(ro, rd,0), mat = 0.;
|
||||
|
||||
if (d < 500.) {
|
||||
// Lighting
|
||||
vec3 p = ro + rd * d,
|
||||
n = getNormal(p);
|
||||
mat = map(p,0).y;
|
||||
// Light 1 Arguments
|
||||
// 1: Ray starting point
|
||||
// 2: Light position
|
||||
// 3: Light intensity
|
||||
// 4: Shadow intensity
|
||||
|
||||
// Lights
|
||||
col += vec3(0.82, 0.5, 0.9) * getLight(p, vec3( 10., 15., 25.), 1., .2,n,1e-10);
|
||||
col += vec3(0.79, 0.66, 0.43) * getLight(p, vec3( 4., 2., -15.), 1., 1.,n,1e-10);
|
||||
col += vec3(0.0, 0.06, 0.7) * getLight(p, vec3( 0., 0., 5.),cl((u_time-29.0)*100.,0.,50.), 0.0,n,3.1);
|
||||
// indirect lightning -> vec3 in normalize is light direction
|
||||
col += vec3(0.29, 0.28, 0.33) * cl( dot( n, no(vec3(0. , 1., 10.))), 0., 1.);
|
||||
|
||||
if(mat==0.)
|
||||
col *= vec3(0.2, 0.3, 0.3) + addSpecular(n,rd,.5, 2.);
|
||||
if(mat==1.)
|
||||
col *= getSeaColor(p, n, no(vec3(0.0,0.3,0.8)),no(rd));
|
||||
if(mat==2.)
|
||||
col *= vec3(0.7, 0.7, 0.4) + noise (p.xz*3.+1.5, 0.1,0);
|
||||
if(mat==3.)
|
||||
col *= vec3(.8, .8, .5) + noise(p.xz*500.+1e5, .3,0);
|
||||
if(mat==4.)
|
||||
col *= vec3(0.0, 0.08, 0.11) + addSpecular(n,rd,0.3,0.7);
|
||||
if(mat ==5.)
|
||||
col = chevronColor*0.4;// * pow(cl(1. -dot(n, -rd), 0., 1.), .3);
|
||||
if(mat == 6.)
|
||||
col *= vec3(0.01, 0.04, 0.06) + addSpecular(n,rd,.1, 2.5);
|
||||
}
|
||||
col += glow * chevronColor*.25;
|
||||
return postProcess(colorFlashesAnim(applyFog(col, d, rd, vec3(0., -.1, -1.), .01)));
|
||||
}
|
||||
|
||||
void main() {
|
||||
vec2 u_resolution = vec2(1920,1080);
|
||||
vec2 qor = gl_FragCoord.xy/u_resolution.xy;
|
||||
vec2 resoultion = -1.0+2.0*qor;
|
||||
resoultion.x *= u_resolution.x/u_resolution.y;
|
||||
o = vec4(sceneGate( resoultion ),1.);
|
||||
}
|
||||
441
src/shaders/fragment.frag
Normal file
441
src/shaders/fragment.frag
Normal file
@ -0,0 +1,441 @@
|
||||
#version 460
|
||||
precision mediump float;
|
||||
out vec4 o;
|
||||
const float PI = 3.14159265;
|
||||
const float TAU = (2. * PI);
|
||||
const float PHI = sqrt(5.) * 0.5 + 0.5;
|
||||
layout(location = 0) uniform float syncs[7];
|
||||
layout(location = 8) uniform float fft_output[512]; // FFT_SIZE / 4
|
||||
float u_time = syncs[0];
|
||||
/* uses some snippets from:
|
||||
* "Seascape" by Alexander Alekseev aka TDM - 2014
|
||||
* License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
|
||||
* Contact: tdmaav@gmail.com
|
||||
*/
|
||||
|
||||
//precision mediump float;
|
||||
vec2 u_resolution = vec2(1920,1080);
|
||||
const float PI = 22./7.;
|
||||
|
||||
vec3 no(vec3 v) { return normalize(v); }
|
||||
float cl(float a, float b, float c) { return clamp(a,b,c); }
|
||||
|
||||
// Rotate
|
||||
mat2 rot2D(float angle) {
|
||||
float s = sin(angle), c = cos(angle);
|
||||
return mat2(c, -s, s, c);
|
||||
}
|
||||
|
||||
float smax( float a, float b, float k )
|
||||
{
|
||||
float h = max(k-abs(a-b),0.0);
|
||||
return max(a, b) + h*h*0.25/k;
|
||||
}
|
||||
|
||||
float hash(vec2 p, int algo)
|
||||
{
|
||||
if (algo == 1) {
|
||||
float h = dot(p,vec2(127.1,311.7));
|
||||
return fract(sin(h)*43758.5453123);
|
||||
}
|
||||
p = 50. * fract( p*0.3183099);
|
||||
return fract( p.x*p.y*(p.x+p.y) );
|
||||
}
|
||||
|
||||
float noise(vec2 p, float scale, int a)
|
||||
{
|
||||
vec2 i = floor( p ),
|
||||
f = fract( p ),
|
||||
u = f*f*(3.-2.*f);
|
||||
float sc = scale;
|
||||
if (a == 1) sc = 2.;
|
||||
return -scale+sc*mix( mix( hash( i + vec2(0.), a),
|
||||
hash( i + vec2(1.0,0.0), a ), u.x),
|
||||
mix( hash( i + vec2(0.0,1.0), a),
|
||||
hash( i + vec2(1.), a), u.x), u.y);
|
||||
}
|
||||
|
||||
/////////////////
|
||||
// GEOMETRY //
|
||||
/////////////////
|
||||
/*float sdSphere(vec3 p, float r) {
|
||||
return length(p)-r;
|
||||
}*/
|
||||
|
||||
float sdCappedCylinder( vec3 p, float h, float r )
|
||||
{
|
||||
vec2 d = abs(vec2(length(p.xy),p.z)) - vec2(r,h);
|
||||
return min(max(d.x,d.y),0.0) + length(max(d,0.0));
|
||||
}
|
||||
|
||||
float sdBox2(vec3 p, vec3 b) {
|
||||
vec3 q = abs(p) - b;
|
||||
return length(max(q,0.)) + min(max(q.x,max(q.y,q.z)),0.);
|
||||
}
|
||||
|
||||
float sdTriPrism( vec3 p, vec2 h, float rot )
|
||||
{
|
||||
p.xy *= rot2D(rot);
|
||||
vec3 q = abs(p);
|
||||
return max(q.z-h.y,max(q.x*.866025+p.y*.5,-p.y)-h.x*.5);
|
||||
}
|
||||
|
||||
float sdPyramid( vec3 p, float s)
|
||||
{
|
||||
p = abs(p);
|
||||
return (p.x+p.y+p.z-s)*0.577;// 35027;
|
||||
}
|
||||
|
||||
//////////////////
|
||||
// ANIMATION //
|
||||
//////////////////
|
||||
|
||||
// POSITIONS
|
||||
//const vec3 glyph1Pos = vec3(1.7,-1.1,0.0);
|
||||
//const vec3 glyph2Pos = vec3(2.0,0.0,0.0);
|
||||
|
||||
//const vec3 glyph4Pos = vec3(0.0,2.0,0.0)
|
||||
//const vec3 glyph6Pos = vec3(1.5 * -1.,1.4,0.0);
|
||||
//const vec3 glyph7Pos = vec3(1.7 * -1.,-1.1,0.0);
|
||||
|
||||
// DELAYS
|
||||
float STARTDELAY = 9., glow = 0.;
|
||||
|
||||
// POSITIONS
|
||||
|
||||
|
||||
// COLORS
|
||||
vec3 chevronColor = vec3(0.36, 0.9, 0.0);
|
||||
|
||||
// with duration d, startTime s and speed up with timeFact
|
||||
float timedSine(vec3 i) {
|
||||
return min((u_time - i.y)*i.z, i.x*PI);
|
||||
}
|
||||
|
||||
float calcFactor (float startTime)
|
||||
{
|
||||
return STARTDELAY + STARTDELAY*cl(sin(timedSine(vec3(1.5, startTime, 4.)) * 0.06), -.9, .9);
|
||||
}
|
||||
|
||||
// Animate ring movements
|
||||
vec3 ringAnim(vec3 p) {
|
||||
for (float i = 0.; i < 7.; i++) {
|
||||
float rotateDelay = STARTDELAY + (i * 3.), o=1.;
|
||||
if(u_time > rotateDelay) {
|
||||
if(mod(i,2.) >= 1.) o = -1.;
|
||||
p.xy *= rot2D(calcFactor(rotateDelay)*o);
|
||||
}
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
// Animate prism movements
|
||||
float prismAnim(vec2 i) {
|
||||
if(u_time >= i.y) {
|
||||
i.x += (.045*cl(sin((timedSine(vec3(3., i.y, 40.)) * .4)),-.8, .8));
|
||||
}
|
||||
return i.x;
|
||||
}
|
||||
|
||||
//////////////
|
||||
// SCENE //
|
||||
//////////////
|
||||
float sea_octave(vec2 uv, float choppy) {
|
||||
uv += noise(uv, 1., 1);
|
||||
vec2 wv = 1.0-abs(sin(uv));
|
||||
wv = mix(wv, abs(cos(uv)),wv);
|
||||
return pow(1.0-pow(wv.x * wv.y,0.65),choppy);
|
||||
}
|
||||
|
||||
vec3 map(vec3 p, int displace)
|
||||
{
|
||||
float mat = 0., glo = 1e3,
|
||||
// Ring boxes
|
||||
an = PI/12.,
|
||||
step,
|
||||
anRot = floor(atan(p.y,p.x)/an + .5)*an;
|
||||
vec3 q = p;
|
||||
q.xy = rot2D(anRot)*q.xy;
|
||||
float d = length(max(abs(q.xy - vec2(1.8,0.))-vec2(0.24,0.14),0.)) - .02,
|
||||
|
||||
// Main ring
|
||||
d2 = abs(length(p.xy) - 1.8) - .2;
|
||||
d = min(d,d2);
|
||||
|
||||
// Inner ring
|
||||
d2 = smax( abs(length(p.xy) - 1.75) - .08, abs(p.z - .1)-.04, .005 );
|
||||
d = max(-d2,d);
|
||||
|
||||
// Depth slice rings
|
||||
d = smax( d, abs(p.z)-.1, .02 );
|
||||
|
||||
//Rotating glyphs
|
||||
vec3 p2 = ringAnim(p), q2=p2;
|
||||
an = PI/16.;
|
||||
q2.xy = rot2D(floor((atan(p2.y,p2.x)/an) + .5)*an)*q2.xy;
|
||||
d2 = sdBox2( q2.xyz - vec3(1.75,0.,0.), vec3(.04, .14, .05) ) - .02 + noise(p.xy*100.,1e-3,0);
|
||||
d = min(d, d2);
|
||||
if (d==d2) mat = 6.;
|
||||
|
||||
// Gate Base
|
||||
d2 = 1e3;
|
||||
float stepDist = 1.5, h = 0.0, d3, choppy=4., freq=0.6, amp=.2;
|
||||
for(int i = 0; i < 4; i++) {
|
||||
step = sdBox2(vec3(p.x,p.y+stepDist+0.05,p.z), vec3(2., .2,stepDist)) - .05;
|
||||
d2 = min(d2, step);
|
||||
stepDist += .2;
|
||||
}
|
||||
d2 += noise(p.xz * 50.+200., .007, 0);
|
||||
d = min(d, d2);
|
||||
if (d==d2) mat = 2.0;
|
||||
|
||||
if (displace == 1) {
|
||||
vec2 uv = p.xy;
|
||||
for(int i = 0; i < 4; i++) {
|
||||
d3 = sea_octave((uv+u_time)*freq,choppy);
|
||||
d3 += sea_octave((uv-u_time)*freq,choppy);
|
||||
h += d3 * amp;
|
||||
uv *= mat2(1.6,1.2,-1.2,1.6); freq *= 1.9; amp *= 0.22;
|
||||
choppy = mix(choppy,1.0,0.4);
|
||||
}
|
||||
}
|
||||
d2 = max(-sdCappedCylinder(p, 2.0, min((1.7 - (u_time - 28.9)*2.5),2.3)), sdCappedCylinder(p, .025, 1.6) - h*0.15);
|
||||
d2 = max(d2, sdCappedCylinder ( p, 0.3, 1.7));
|
||||
d = min(d, d2);
|
||||
if (d==d2) {
|
||||
mat = 1.0;
|
||||
}
|
||||
|
||||
// sand
|
||||
d2 = (p.y +3.7) + noise((vec2((p.x),(p.z*.44-40.))*.04)+100., 20., 0) + .25*sin(p.z*.5+u_time);
|
||||
d = min(d,d2);
|
||||
if (d==d2) mat = 3.0;
|
||||
|
||||
// pyradmid
|
||||
d2 = sdPyramid(p+vec3(-75., 0., 100.), 60.);
|
||||
d = min(d, d2);
|
||||
if (d==d2) mat=3.;
|
||||
// Prisms
|
||||
for(float i = 0.; i < 8.; i++ ) {
|
||||
q = p;
|
||||
anRot = 24.67 / (PI * 2.) + (i+1.) * PI / 4.;
|
||||
|
||||
// Nudge first and the last prism out of the ground
|
||||
if (i == 1.) anRot += .2;
|
||||
if (i == 7.) anRot -= .2;
|
||||
q.xy = rot2D(anRot) * q.xy;
|
||||
float rotateDelay = STARTDELAY + (i - 1.) * 3. + 1.5;
|
||||
// We can now call each prism by it's index
|
||||
// draw all except the middle bottom prism
|
||||
if (i > 0.) {
|
||||
q.x -= 1.95;
|
||||
vec3 q2 = q; // new point for movable parts
|
||||
if(u_time > rotateDelay) q2.x = prismAnim(vec2(q2.x, rotateDelay));
|
||||
float prismTop = sdTriPrism(vec3(q.x - .06, q.y, q.z), vec2(.1,.15), .5) -.01;
|
||||
d2 = max(-sdTriPrism(vec3(q2.x - .14, q2.y - 0. , q2.z), vec2(.22), .5) - .01 , sdTriPrism(vec3(q2.x, q2.y, q2.z ), vec2(.2,.12), .5) - .02);
|
||||
d2 = min(d2, prismTop);
|
||||
d = min(d, d2);
|
||||
// glyph locking thing material
|
||||
if (d == d2) mat = 4.;
|
||||
// glyph locking prism material
|
||||
if( d == prismTop) if(u_time > rotateDelay + .2) {
|
||||
mat = 5.;
|
||||
glo = min(d2, prismTop);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return vec3( d, mat, glo);
|
||||
}
|
||||
|
||||
////////////////
|
||||
// DRAWING //
|
||||
////////////////
|
||||
|
||||
float rayMarch(vec3 ro, vec3 rd, int a) {
|
||||
vec3 d;
|
||||
float t = 0.; // total distance travelled
|
||||
// Raymarching
|
||||
for (int i = 0; i < 100; i++) {
|
||||
d = map(ro + rd * t, 0); // Get distance to objects
|
||||
if (a==0&&d.z<0.3) glow += pow(0.01/d.z,0.8)*0.6;
|
||||
t += d.x; // "march" the ray
|
||||
if (d.x < 1e-3 || t > 500.) break;
|
||||
}
|
||||
return t;
|
||||
}
|
||||
|
||||
vec3 getNormal(vec3 p) {
|
||||
vec2 e = vec2(.01, 0.);
|
||||
vec3 n = map(p, 1).x - vec3(
|
||||
map(p-e.xyy,1).x,
|
||||
map(p-e.yxy,1).x,
|
||||
map(p-e.yyx,1).x);
|
||||
return no(n);
|
||||
}
|
||||
|
||||
float getLight(vec3 p, vec3 lightPos, float intensity, float shadow, vec3 n, float atte) {
|
||||
vec3 l = no(lightPos - p);
|
||||
float len = length( lightPos - p ); // Distance from the light to the surface point.
|
||||
float dif = cl(dot(n, l)*intensity, 0., intensity) * 1.0 / (1.0 + atte*len),
|
||||
d = rayMarch(p+n*.0025, l, 1);
|
||||
if(d<length(lightPos-p)) dif *= shadow;
|
||||
return dif;
|
||||
}
|
||||
|
||||
// lighting
|
||||
float diffuse(vec3 n,vec3 l,float p) {
|
||||
return pow(dot(n,l) * 0.4 + 0.6,p);
|
||||
}
|
||||
|
||||
float specular(vec3 normal,vec3 lightPos,vec3 rayOrigin,float specular) {
|
||||
float nrm = (specular + 8.0) / (PI * 8.0);
|
||||
return pow(max(dot(reflect(rayOrigin,normal),lightPos),0.0),specular) * nrm;
|
||||
}
|
||||
|
||||
vec3 getSeaColor(vec3 p, vec3 n, vec3 l, vec3 eye) {
|
||||
|
||||
vec3 color = vec3(0.0, 0.1, 0.3) + diffuse(n,l,60.0) * vec3(0.11, 0.16, 0.18) * 0.3;
|
||||
color -= vec3(0.73, 0.15, 0.66) * pow(cl(1.-dot(n, -eye), 0., 1.), .7);
|
||||
color += vec3(specular(n,l,eye,60.0))*0.2;
|
||||
return color;
|
||||
}
|
||||
|
||||
|
||||
vec3 applyFog(vec3 col, float t, vec3 rd, vec3 lightDir, float b ) {
|
||||
vec3 fogColor = mix( vec3(0.34, 0.11, 0.34), // blue
|
||||
vec3(0.93, 0.37, 0.16), // yellow
|
||||
pow(max( dot(rd, lightDir), 0.) ,8.));
|
||||
return mix( col, fogColor, 1.0 - exp(-t*b) );
|
||||
}
|
||||
|
||||
vec3 getCameraRayDir(vec2 uv, vec3 p, vec3 l, float z)
|
||||
{
|
||||
vec3 f = no(l-p),
|
||||
r = no(cross(vec3(0.,1.,0.), f)),
|
||||
u = cross(f,r),
|
||||
c = f*z,
|
||||
i = c + uv.x*r + uv.y*u,
|
||||
d = no(i);
|
||||
return d;
|
||||
}
|
||||
|
||||
vec3 postProcess(vec3 col) {
|
||||
// Vignette
|
||||
//col *= smoothstep(0.9, 0.5, length(gl_FragCoord.xy/u_resolution.xy-vec2(.5)));
|
||||
// Colour mapping
|
||||
col *= vec3(.9, 0.8, 0.7);
|
||||
// gamma
|
||||
col = pow( col, vec3(.45) );
|
||||
// Contrast = a
|
||||
col = smoothstep(0., 1., col);
|
||||
|
||||
// fade out at the end
|
||||
col += 1.0 - vec3(cl((46. - u_time)*.5, 0., 1.0));
|
||||
return col;
|
||||
}
|
||||
|
||||
vec3 cameraPos()
|
||||
{
|
||||
// first zoom in to the gate
|
||||
vec3 cPos = vec3(0., cl(6.-u_time,2.,6.), cl((100.-u_time*11.),6.,100.));
|
||||
if (u_time > 7.5) cPos += vec3(0., cl(7.5-u_time,-1.,0.), 0.);
|
||||
// close up shot for 1st glyph lock
|
||||
if (u_time > 10.5) cPos = vec3(2.,-1.,1.);
|
||||
// zoom away for 2nd glyph animation
|
||||
if (u_time > 12.) cPos = vec3(-1., -.7, 4.);
|
||||
if (u_time > 14.5) {
|
||||
cPos = vec3(0., 0., 4.);
|
||||
cPos.yz *= rot2D(-0.6-(cos(u_time-15.))*0.05);
|
||||
cPos.xz *= rot2D(sin((u_time-16.5)*0.1));
|
||||
}
|
||||
if (u_time > 23.5)
|
||||
{
|
||||
cPos = vec3(3., -.7, 4.);
|
||||
}
|
||||
if (u_time > 32.5)
|
||||
{
|
||||
cPos = vec3(-20.,10.,50.);
|
||||
}
|
||||
if (u_time > 36.5) {
|
||||
cPos = vec3(3., -.7, 4.);
|
||||
cPos.yz *= rot2D(((1.-cos(u_time-36.5))*-0.025));
|
||||
cPos.xz *= rot2D(sin((u_time-36.5)*0.07));
|
||||
}
|
||||
|
||||
return cPos;
|
||||
}
|
||||
|
||||
vec3 cameraPointAt() {
|
||||
vec3 p = vec3(0., -.5, 0.);
|
||||
// look at 1st glyph
|
||||
if (u_time > 10.5) p = vec3(1.7,-1.1,0.);
|
||||
// look gate at distance
|
||||
if(u_time > 12.) p = vec3(0.);
|
||||
if(u_time > 14.5) p = mix(vec3(1.5,1.4,0.0),vec3(-1.5,1.4,0.0), (u_time-16.5)*0.13);
|
||||
if(u_time > 23.5) p = vec3(0.);
|
||||
return p;
|
||||
}
|
||||
|
||||
// flash screen with glyph color when it is locked
|
||||
vec3 colorFlashesAnim(vec3 col) {
|
||||
if(u_time > 10.75) {
|
||||
float x = smoothstep(-1.,.8,sin((timedSine(vec3(.8, 10.75, 8.))*2.)));
|
||||
col = mix(col, chevronColor * (x * 1.4), x *.76);
|
||||
}
|
||||
return col;
|
||||
}
|
||||
|
||||
vec3 addSpecular(vec3 nor, vec3 rod, float amount, float phong)
|
||||
{
|
||||
return vec3(specular(nor,no(vec3(0.0,0.3,0.8)),no(rod),pow(10.,phong)))*amount;
|
||||
}
|
||||
|
||||
vec3 sceneGate(vec2 uv)
|
||||
{
|
||||
// Initialization
|
||||
vec3 ro = cameraPos(),
|
||||
rd = getCameraRayDir(uv, ro, cameraPointAt(), cl((43.-u_time)*-2.,2.,25.)),
|
||||
col = vec3(0.);
|
||||
float d = rayMarch(ro, rd,0), mat = 0.;
|
||||
|
||||
if (d < 500.) {
|
||||
// Lighting
|
||||
vec3 p = ro + rd * d,
|
||||
n = getNormal(p);
|
||||
mat = map(p,0).y;
|
||||
// Light 1 Arguments
|
||||
// 1: Ray starting point
|
||||
// 2: Light position
|
||||
// 3: Light intensity
|
||||
// 4: Shadow intensity
|
||||
|
||||
// Lights
|
||||
col += vec3(0.82, 0.5, 0.9) * getLight(p, vec3( 10., 15., 25.), 1., .2,n,1e-10);
|
||||
col += vec3(0.79, 0.66, 0.43) * getLight(p, vec3( 4., 2., -15.), 1., 1.,n,1e-10);
|
||||
col += vec3(0.0, 0.06, 0.7) * getLight(p, vec3( 0., 0., 5.),cl((u_time-29.0)*100.,0.,50.), 0.0,n,3.1);
|
||||
// indirect lightning -> vec3 in normalize is light direction
|
||||
col += vec3(0.29, 0.28, 0.33) * cl( dot( n, no(vec3(0. , 1., 10.))), 0., 1.);
|
||||
|
||||
if(mat==0.)
|
||||
col *= vec3(0.2, 0.3, 0.3) + addSpecular(n,rd,.5, 2.);
|
||||
if(mat==1.)
|
||||
col *= getSeaColor(p, n, no(vec3(0.0,0.3,0.8)),no(rd));
|
||||
if(mat==2.)
|
||||
col *= vec3(0.7, 0.7, 0.4) + noise (p.xz*3.+1.5, 0.1,0);
|
||||
if(mat==3.)
|
||||
col *= vec3(.8, .8, .5) + noise(p.xz*500.+1e5, .3,0);
|
||||
if(mat==4.)
|
||||
col *= vec3(0.0, 0.08, 0.11) + addSpecular(n,rd,0.3,0.7);
|
||||
if(mat ==5.)
|
||||
col = chevronColor*0.4;// * pow(cl(1. -dot(n, -rd), 0., 1.), .3);
|
||||
if(mat == 6.)
|
||||
col *= vec3(0.01, 0.04, 0.06) + addSpecular(n,rd,.1, 2.5);
|
||||
}
|
||||
col += glow * chevronColor*.25;
|
||||
return postProcess(colorFlashesAnim(applyFog(col, d, rd, vec3(0., -.1, -1.), .01)));
|
||||
}
|
||||
|
||||
void main() {
|
||||
o = vec4(sceneGate( (gl_FragCoord.xy * 2. - u_resolution.xy) / u_resolution.y), 1.);
|
||||
}
|
||||
305
src/shaders/fragment.inl
Normal file
305
src/shaders/fragment.inl
Normal file
@ -0,0 +1,305 @@
|
||||
// Generated with Shader Minifier 1.5.1 (https://github.com/laurentlb/Shader_Minifier/)
|
||||
#ifndef FRAGMENT_INL_
|
||||
# define FRAGMENT_INL_
|
||||
# define VAR_fft_output "p"
|
||||
# define VAR_o "f"
|
||||
# define VAR_syncs "a"
|
||||
|
||||
const char *fragment_frag =
|
||||
"#version 460\n"
|
||||
"precision mediump float;"
|
||||
"out vec4 f;"
|
||||
"const float m=2.*acos(-1.),v=sqrt(5.)*.5+.5;"
|
||||
"layout(location=0)uniform float a[7];"
|
||||
"layout(location=8)uniform float p[512];"
|
||||
"float y=a[0];"
|
||||
"vec2 c=vec2(1920,1080);"
|
||||
"const float z=22./7.;"
|
||||
"vec3 n(vec3 v)"
|
||||
"{"
|
||||
"return normalize(v);"
|
||||
"}"
|
||||
"float n(float v,float f,float y)"
|
||||
"{"
|
||||
"return clamp(v,f,y);"
|
||||
"}"
|
||||
"mat2 n(float v)"
|
||||
"{"
|
||||
"float f=sin(v);"
|
||||
"v=cos(v);"
|
||||
"return mat2(v,-f,f,v);"
|
||||
"}"
|
||||
"float x(float v,float y,float m)"
|
||||
"{"
|
||||
"float z=max(m-abs(v-y),0.);"
|
||||
"return max(v,y)+z*z*.25/m;"
|
||||
"}"
|
||||
"float n(vec2 v,int y)"
|
||||
"{"
|
||||
"if(y==1)"
|
||||
"{"
|
||||
"float y=dot(v,vec2(127.1,311.7));"
|
||||
"return fract(sin(y)*43758.5453123);"
|
||||
"}"
|
||||
"v=50.*fract(v*.3183099);"
|
||||
"return fract(v.x*v.y*(v.x+v.y));"
|
||||
"}"
|
||||
"float n(vec2 v,float y,int f)"
|
||||
"{"
|
||||
"vec2 m=floor(v);"
|
||||
"v=fract(v);"
|
||||
"v=v*v*(3.-2.*v);"
|
||||
"float z=y;"
|
||||
"if(f==1)"
|
||||
"z=2.;"
|
||||
"return-y+z*mix(mix(n(m+vec2(0),f),n(m+vec2(1,0),f),v.x),mix(n(m+vec2(0,1),f),n(m+vec2(1),f),v.x),v.y);"
|
||||
"}"
|
||||
"float n(vec3 v,float y,float m)"
|
||||
"{"
|
||||
"vec2 f=abs(vec2(length(v.xy),v.z))-vec2(m,y);"
|
||||
"return min(max(f.x,f.y),0.)+length(max(f,0.));"
|
||||
"}"
|
||||
"float n(vec3 v,vec3 y)"
|
||||
"{"
|
||||
"v=abs(v)-y;"
|
||||
"return length(max(v,0.))+min(max(v.x,max(v.y,v.z)),0.);"
|
||||
"}"
|
||||
"float n(vec3 v,vec2 y)"
|
||||
"{"
|
||||
"v.xy*=n(.5);"
|
||||
"vec3 m=abs(v);"
|
||||
"return max(m.z-y.y,max(m.x*.866025+v.y*.5,-v.y)-y.x*.5);"
|
||||
"}"
|
||||
"float x(vec3 v)"
|
||||
"{"
|
||||
"v=abs(v);"
|
||||
"return(v.x+v.y+v.z-60.)*.577;"
|
||||
"}"
|
||||
"float s=0.;"
|
||||
"vec3 l=vec3(.36,.9,0);"
|
||||
"float t(vec3 v)"
|
||||
"{"
|
||||
"return min((y-v.y)*v.z,v.x*z);"
|
||||
"}"
|
||||
"vec3 w(vec3 v)"
|
||||
"{"
|
||||
"for(float f=0.;f<7.;f++)"
|
||||
"{"
|
||||
"float m=9.+f*3.,z=1.;"
|
||||
"if(y>m)"
|
||||
"{"
|
||||
"if(mod(f,2.)>=1.)"
|
||||
"z=-1.;"
|
||||
"v.xy*=n((9.+9.*n(sin(t(vec3(1.5,m,4))*.06),-.9,.9))*z);"
|
||||
"}"
|
||||
"}"
|
||||
"return v;"
|
||||
"}"
|
||||
"float n(vec2 v)"
|
||||
"{"
|
||||
"if(y>=v.y)"
|
||||
"v.x+=.045*n(sin(t(vec3(3,v.y,40))*.4),-.8,.8);"
|
||||
"return v.x;"
|
||||
"}"
|
||||
"float n(vec2 v,float f)"
|
||||
"{"
|
||||
"v+=n(v,1.,1);"
|
||||
"vec2 y=1.-abs(sin(v));"
|
||||
"y=mix(y,abs(cos(v)),y);"
|
||||
"return pow(1.-pow(y.x*y.y,.65),f);"
|
||||
"}"
|
||||
"vec3 n(vec3 v,int m)"
|
||||
"{"
|
||||
"float f=0.,i=1e3,r=z/12.,a,s=floor(atan(v.y,v.x)/r+.5)*r;"
|
||||
"vec3 l=v;"
|
||||
"l.xy=n(s)*l.xy;"
|
||||
"float c=length(max(abs(l.xy-vec2(1.8,0))-vec2(.24,.14),0.))-.02,d=abs(length(v.xy)-1.8)-.2;"
|
||||
"c=min(c,d);"
|
||||
"d=x(abs(length(v.xy)-1.75)-.08,abs(v.z-.1)-.04,.005);"
|
||||
"c=x(max(-d,c),abs(v.z)-.1,.02);"
|
||||
"vec3 p=w(v),t=p;"
|
||||
"r=z/16.;"
|
||||
"t.xy=n(floor(atan(p.y,p.x)/r+.5)*r)*t.xy;"
|
||||
"d=n(t.xyz-vec3(1.75,0,0),vec3(.04,.14,.05))-.02+n(v.xy*1e2,.001,0);"
|
||||
"c=min(c,d);"
|
||||
"if(c==d)"
|
||||
"f=6.;"
|
||||
"d=1e3;"
|
||||
"r=1.5;"
|
||||
"float e=0.,u,g=4.,C=.6,F=.2;"
|
||||
"for(int f=0;f<4;f++)"
|
||||
"a=n(vec3(v.x,v.y+r+.05,v.z),vec3(2,.2,r))-.05,d=min(d,a),r+=.2;"
|
||||
"d+=n(v.xz*50.+2e2,.007,0);"
|
||||
"c=min(c,d);"
|
||||
"if(c==d)"
|
||||
"f=2.;"
|
||||
"if(m==1)"
|
||||
"{"
|
||||
"vec2 f=v.xy;"
|
||||
"for(int v=0;v<4;v++)"
|
||||
"u=n((f+y)*C,g)+n((f-y)*C,g),e+=u*F,f*=mat2(1.6,1.2,-1.2,1.6),C*=1.9,F*=.22,g=mix(g,1.,.4);"
|
||||
"}"
|
||||
"d=max(max(-n(v,2.,min(1.7-(y-28.9)*2.5,2.3)),n(v,.025,1.6)-e*.15),n(v,.3,1.7));"
|
||||
"c=min(c,d);"
|
||||
"if(c==d)"
|
||||
"f=1.;"
|
||||
"d=v.y+3.7+n(vec2(v.x,v.z*.44-40.)*.04+1e2,20.,0)+.25*sin(v.z*.5+y);"
|
||||
"c=min(c,d);"
|
||||
"if(c==d)"
|
||||
"f=3.;"
|
||||
"d=x(v+vec3(-75,0,100));"
|
||||
"c=min(c,d);"
|
||||
"if(c==d)"
|
||||
"f=3.;"
|
||||
"for(float m=0.;m<8.;m++)"
|
||||
"{"
|
||||
"l=v;"
|
||||
"s=24.67/(z*2.)+(m+1.)*z/4.;"
|
||||
"if(m==1.)"
|
||||
"s+=.2;"
|
||||
"if(m==7.)"
|
||||
"s-=.2;"
|
||||
"l.xy=n(s)*l.xy;"
|
||||
"float r=9.+(m-1.)*3.+1.5;"
|
||||
"if(m>0.)"
|
||||
"{"
|
||||
"l.x-=1.95;"
|
||||
"vec3 v=l;"
|
||||
"if(y>r)"
|
||||
"v.x=n(vec2(v.x,r));"
|
||||
"float m=n(vec3(l.x-.06,l.yz),vec2(.1,.15))-.01;"
|
||||
"d=min(max(-n(vec3(v.x-.14,v.yz),vec2(.22))-.01,n(vec3(v),vec2(.2,.12))-.02),m);"
|
||||
"c=min(c,d);"
|
||||
"if(c==d)"
|
||||
"f=4.;"
|
||||
"if(c==m)"
|
||||
"if(y>r+.2)"
|
||||
"f=5.,i=min(d,m);"
|
||||
"}"
|
||||
"}"
|
||||
"return vec3(c,f,i);"
|
||||
"}"
|
||||
"float n(vec3 v,vec3 y,int m)"
|
||||
"{"
|
||||
"vec3 f;"
|
||||
"float c=0.;"
|
||||
"for(int i=0;i<100;i++)"
|
||||
"{"
|
||||
"f=n(v+y*c,0);"
|
||||
"if(m==0&&f.z<.3)"
|
||||
"s+=pow(.01/f.z,.8)*.6;"
|
||||
"c+=f.x;"
|
||||
"if(f.x<.001||c>5e2)"
|
||||
"break;"
|
||||
"}"
|
||||
"return c;"
|
||||
"}"
|
||||
"vec3 h(vec3 v)"
|
||||
"{"
|
||||
"vec2 f=vec2(.01,0);"
|
||||
"return n(n(v,1).x-vec3(n(v-f.xyy,1).x,n(v-f.yxy,1).x,n(v-f.yyx,1)));"
|
||||
"}"
|
||||
"float h(vec3 v,vec3 y,float f,float m,vec3 c,float i)"
|
||||
"{"
|
||||
"vec3 d=n(y-v);"
|
||||
"f=n(dot(c,d)*f,0.,f)/(1.+i*length(y-v));"
|
||||
"i=n(v+c*.0025,d,1);"
|
||||
"if(i<length(y-v))"
|
||||
"f*=m;"
|
||||
"return f;"
|
||||
"}"
|
||||
"float h(vec3 v,vec3 f,vec3 y,float m)"
|
||||
"{"
|
||||
"return pow(max(dot(reflect(y,v),f),0.),m)*((m+8.)/(z*8.));"
|
||||
"}"
|
||||
"vec3 h(vec3 v,vec3 y,vec3 f,vec3 m)"
|
||||
"{"
|
||||
"return vec3(0,.1,.3)+pow(dot(y,f)*.4+.6,60.)*vec3(.11,.16,.18)*.3-vec3(.73,.15,.66)*pow(n(1.-dot(y,-m),0.,1.),.7)+vec3(h(y,f,m,60.))*.2;"
|
||||
"}"
|
||||
"vec3 h(vec2 v,vec3 y,vec3 f,float m)"
|
||||
"{"
|
||||
"y=n(f-y);"
|
||||
"f=n(cross(vec3(0,1,0),y));"
|
||||
"return n(y*m+v.x*f+v.y*cross(y,f));"
|
||||
"}"
|
||||
"vec3 h()"
|
||||
"{"
|
||||
"vec3 v=vec3(0,n(6.-y,2.,6.),n(1e2-y*11.,6.,1e2));"
|
||||
"if(y>7.5)"
|
||||
"v+=vec3(0,n(7.5-y,-1.,0.),0);"
|
||||
"if(y>10.5)"
|
||||
"v=vec3(2,-1,1);"
|
||||
"if(y>12.)"
|
||||
"v=vec3(-1,-.7,4);"
|
||||
"if(y>14.5)"
|
||||
"v=vec3(0,0,4),v.yz*=n(-.6-cos(y-15.)*.05),v.xz*=n(sin((y-16.5)*.1));"
|
||||
"if(y>23.5)"
|
||||
"v=vec3(3,-.7,4);"
|
||||
"if(y>32.5)"
|
||||
"v=vec3(-20,10,50);"
|
||||
"if(y>36.5)"
|
||||
"v=vec3(3,-.7,4),v.yz*=n((1.-cos(y-36.5))*-.025),v.xz*=n(sin((y-36.5)*.07));"
|
||||
"return v;"
|
||||
"}"
|
||||
"vec3 n()"
|
||||
"{"
|
||||
"vec3 v=vec3(0,-.5,0);"
|
||||
"if(y>10.5)"
|
||||
"v=vec3(1.7,-1.1,0);"
|
||||
"if(y>12.)"
|
||||
"v=vec3(0);"
|
||||
"if(y>14.5)"
|
||||
"v=mix(vec3(1.5,1.4,0),vec3(-1.5,1.4,0),(y-16.5)*.13);"
|
||||
"if(y>23.5)"
|
||||
"v=vec3(0);"
|
||||
"return v;"
|
||||
"}"
|
||||
"vec3 r(vec3 v)"
|
||||
"{"
|
||||
"if(y>10.75)"
|
||||
"{"
|
||||
"float f=smoothstep(-1.,.8,sin(t(vec3(.8,10.75,8))*2.));"
|
||||
"v=mix(v,f*1.4*l,f*.76);"
|
||||
"}"
|
||||
"return v;"
|
||||
"}"
|
||||
"vec3 h(vec3 v,vec3 y,float f,float m)"
|
||||
"{"
|
||||
"return vec3(h(v,n(vec3(0,.3,.8)),n(y),pow(10.,m)))*f;"
|
||||
"}"
|
||||
"vec3 h(vec2 v)"
|
||||
"{"
|
||||
"vec3 f=h(),m=h(v,f,n(),n((43.-y)*-2.,2.,25.)),c=vec3(0);"
|
||||
"float z=n(f,m,0),i=0.;"
|
||||
"if(z<5e2)"
|
||||
"{"
|
||||
"vec3 v=f+m*z,d=h(v);"
|
||||
"i=n(v,0).y;"
|
||||
"c+=vec3(.82,.5,.9)*h(v,vec3(10,15,25),1.,.2,d,1e-10);"
|
||||
"c+=vec3(.79,.66,.43)*h(v,vec3(4,2,-15),1.,1.,d,1e-10);"
|
||||
"c+=vec3(0,.06,.7)*h(v,vec3(0,0,5),n((y-29.)*1e2,0.,50.),0.,d,3.1);"
|
||||
"c+=vec3(.29,.28,.33)*n(dot(d,n(vec3(0,1,10))),0.,1.);"
|
||||
"if(i==0.)"
|
||||
"c*=vec3(.2,.3,.3)+h(d,m,.5,2.);"
|
||||
"if(i==1.)"
|
||||
"c*=h(v,d,n(vec3(0,.3,.8)),n(m));"
|
||||
"if(i==2.)"
|
||||
"c*=vec3(.7,.7,.4)+n(v.xz*3.+1.5,.1,0);"
|
||||
"if(i==3.)"
|
||||
"c*=vec3(.8,.8,.5)+n(v.xz*5e2+1e5,.3,0);"
|
||||
"if(i==4.)"
|
||||
"c*=vec3(0,.08,.11)+h(d,m,.3,.7);"
|
||||
"if(i==5.)"
|
||||
"c=l*.4;"
|
||||
"if(i==6.)"
|
||||
"c*=vec3(.01,.04,.06)+h(d,m,.1,2.5);"
|
||||
"}"
|
||||
"c+=s*l*.25;"
|
||||
"return smoothstep(0.,1.,pow(r(mix(c,mix(vec3(.34,.11,.34),vec3(.93,.37,.16),pow(max(dot(m,vec3(0,-.1,-1)),0.),8.)),1.-exp(-z*.01)))*vec3(.9,.8,.7),vec3(.45)))+1.-vec3(n((46.-y)*.5,0.,1.));"
|
||||
"}"
|
||||
"void main()"
|
||||
"{"
|
||||
"f=vec4(h((gl_FragCoord.xy*2.-c.xy)/c.y),1);"
|
||||
"}";
|
||||
|
||||
#endif // FRAGMENT_INL_
|
||||
18
src/shaders/post.frag
Normal file
18
src/shaders/post.frag
Normal file
@ -0,0 +1,18 @@
|
||||
// A simple chromatic aberration example
|
||||
|
||||
// Mipmap fake glossy thing!
|
||||
#version 130
|
||||
uniform sampler2D o;
|
||||
out vec4 i;
|
||||
float hash(float c){return fract(sin(dot(c, 12.9898)) * 43758.5453);}
|
||||
void main(){
|
||||
i = vec4(0);
|
||||
for(int t = 0; t < 25; t++){
|
||||
vec2 uv = gl_FragCoord.xy*2./vec2(1920,1080);
|
||||
float s1 = hash(float(t+dot(uv,uv)));
|
||||
float s2 = hash(float(1-t+dot(uv,uv)));
|
||||
vec2 f = 0.01*(-1.0+2.0*vec2(s1,s2));
|
||||
i += vec4(textureLod(o, uv, (0.3+0.7*s1)*texture(o, (1.0+1.0*f)*uv).a*8).rgb,1);
|
||||
}
|
||||
i /= vec4(25);
|
||||
}
|
||||
27
src/shaders/post.inl
Normal file
27
src/shaders/post.inl
Normal file
@ -0,0 +1,27 @@
|
||||
// Generated with Shader Minifier 1.5.1 (https://github.com/laurentlb/Shader_Minifier/)
|
||||
#ifndef POST_INL_
|
||||
# define POST_INL_
|
||||
# define VAR_i "v"
|
||||
# define VAR_o "f"
|
||||
|
||||
const char *post_frag =
|
||||
"#version 130\n"
|
||||
"uniform sampler2D f;"
|
||||
"out vec4 v;"
|
||||
"float t(float f)"
|
||||
"{"
|
||||
"return fract(sin(dot(f,12.9898))*43758.5453);"
|
||||
"}"
|
||||
"void main()"
|
||||
"{"
|
||||
"v=vec4(0);"
|
||||
"for(int s=0;s<25;s++)"
|
||||
"{"
|
||||
"vec2 d=gl_FragCoord.xy*2./vec2(1920,1080);"
|
||||
"float i=t(float(s+dot(d,d))),C=t(float(1-s+dot(d,d)));"
|
||||
"v+=vec4(textureLod(f,d,(.3+.7*i)*texture(f,(1.+.01*(-1.+2.*vec2(i,C)))*d).w*8).xyz,1);"
|
||||
"}"
|
||||
"v/=vec4(25);"
|
||||
"}";
|
||||
|
||||
#endif // POST_INL_
|
||||
654
src/shaders/random.frag
Normal file
654
src/shaders/random.frag
Normal file
@ -0,0 +1,654 @@
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// HG_SDF
|
||||
//
|
||||
// GLSL LIBRARY FOR BUILDING SIGNED DISTANCE BOUNDS
|
||||
//
|
||||
// version 2021-07-28
|
||||
//
|
||||
// Check https://mercury.sexy/hg_sdf for updates
|
||||
// and usage examples. Send feedback to spheretracing@mercury.sexy.
|
||||
//
|
||||
// Brought to you by MERCURY https://mercury.sexy/
|
||||
//
|
||||
//
|
||||
//
|
||||
// Released dual-licensed under
|
||||
// Creative Commons Attribution-NonCommercial (CC BY-NC)
|
||||
// or
|
||||
// MIT License
|
||||
// at your choice.
|
||||
//
|
||||
// SPDX-License-Identifier: MIT OR CC-BY-NC-4.0
|
||||
//
|
||||
// /////
|
||||
|
||||
////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// HELPER FUNCTIONS/MACROS
|
||||
//
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
||||
const float PI = 3.14159265;
|
||||
const float TAU = (2. * PI);
|
||||
const float PHI = sqrt(5.) * 0.5 + 0.5;
|
||||
|
||||
vec3 applyFog(vec3 col, float t, vec3 rd, vec3 lightDir, float b) {
|
||||
float fogAmount = 1.0 - exp(-t * b);
|
||||
float sunAmount = max(dot(rd, lightDir), 0.);
|
||||
vec3 fogColor = mix(vec3(0.1529, 0.1137, 0.2), // blue
|
||||
vec3(0.2588, 0.1765, 0.3529), // yellow
|
||||
pow(sunAmount, 1.0));
|
||||
return mix(col, fogColor, fogAmount);
|
||||
}
|
||||
|
||||
mat2 scale(vec2 scale) {
|
||||
return mat2(1. / scale.x, 0.0, 0.0, 1. / scale.y);
|
||||
}
|
||||
|
||||
// Sign function that doesn't return 0
|
||||
float sgn(float x) {
|
||||
return (x < 0.) ? -1. : 1.;
|
||||
}
|
||||
|
||||
vec2 sgn(vec2 v) {
|
||||
return vec2((v.x < 0.) ? -1. : 1., (v.y < 0.) ? -1. : 1.);
|
||||
}
|
||||
|
||||
float square(float x) {
|
||||
return x * x;
|
||||
}
|
||||
|
||||
vec2 square(vec2 x) {
|
||||
return x * x;
|
||||
}
|
||||
|
||||
vec3 square(vec3 x) {
|
||||
return x * x;
|
||||
}
|
||||
|
||||
float lengthSqr(vec3 x) {
|
||||
return dot(x, x);
|
||||
}
|
||||
|
||||
// Maximum/minumum elements of a vector
|
||||
float vmax(vec2 v) {
|
||||
return max(v.x, v.y);
|
||||
}
|
||||
|
||||
float vmax(vec3 v) {
|
||||
return max(max(v.x, v.y), v.z);
|
||||
}
|
||||
|
||||
float vmax(vec4 v) {
|
||||
return max(max(v.x, v.y), max(v.z, v.w));
|
||||
}
|
||||
|
||||
float vmin(vec2 v) {
|
||||
return min(v.x, v.y);
|
||||
}
|
||||
|
||||
float vmin(vec3 v) {
|
||||
return min(min(v.x, v.y), v.z);
|
||||
}
|
||||
|
||||
float vmin(vec4 v) {
|
||||
return min(min(v.x, v.y), min(v.z, v.w));
|
||||
}
|
||||
|
||||
// Hexagonal prism, circumcircle variant
|
||||
float fHexagonCircumcircle(vec3 p, vec2 h) {
|
||||
vec3 q = abs(p);
|
||||
return max(q.y - h.y, max(q.x * sqrt(3.) * 0.5 + q.z * 0.5, q.z) - h.x);
|
||||
//this is mathematically equivalent to this line, but less efficient:
|
||||
//return max(q.y - h.y, max(dot(vec2(cos(PI/3), sin(PI/3)), q.zx), q.z) - h.x);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PRIMITIVE DISTANCE FUNCTIONS
|
||||
//
|
||||
////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Conventions:
|
||||
//
|
||||
// Everything that is a distance function is called fSomething.
|
||||
// The first argument is always a point in 2 or 3-space called <p>.
|
||||
// Unless otherwise noted, (if the object has an intrinsic "up"
|
||||
// side or direction) the y axis is "up" and the object is
|
||||
// centered at the origin.
|
||||
//
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
||||
float fSphere(vec3 p, float r) {
|
||||
return length(p) - r;
|
||||
}
|
||||
|
||||
// Plane with normal n (n is normalized) at some distance from the origin
|
||||
float fPlane(vec3 p, vec3 n, float distanceFromOrigin) {
|
||||
return dot(p, n) + distanceFromOrigin;
|
||||
}
|
||||
|
||||
// Cheap Box: distance to corners is overestimated
|
||||
float fBoxCheap(vec3 p, vec3 b) { //cheap box
|
||||
return vmax(abs(p) - b);
|
||||
}
|
||||
|
||||
// Box: correct distance to corners
|
||||
float fBox(vec3 p, vec3 b) {
|
||||
vec3 d = abs(p) - b;
|
||||
return length(max(d, vec3(0))) + vmax(min(d, vec3(0)));
|
||||
}
|
||||
|
||||
// Same as above, but in two dimensions (an endless box)
|
||||
float fBox2Cheap(vec2 p, vec2 b) {
|
||||
return vmax(abs(p) - b);
|
||||
}
|
||||
|
||||
float fBox2(vec2 p, vec2 b) {
|
||||
vec2 d = abs(p) - b;
|
||||
return length(max(d, vec2(0.))) + vmax(min(d, vec2(0.)));
|
||||
}
|
||||
|
||||
// Endless "corner"
|
||||
float fCorner(vec2 p) {
|
||||
return length(max(p, vec2(0.))) + vmax(min(p, vec2(0.)));
|
||||
}
|
||||
|
||||
// Cylinder standing upright on the xz plane
|
||||
float fCylinder(vec3 p, float r, float height) {
|
||||
float d = length(p.xz) - r;
|
||||
d = max(d, abs(p.y) - height);
|
||||
return d;
|
||||
}
|
||||
|
||||
// Capsule: A Cylinder with round caps on both sides
|
||||
float fCapsule(vec3 p, float r, float c) {
|
||||
return mix(length(p.xz) - r, length(vec3(p.x, abs(p.y) - c, p.z)) - r, step(c, abs(p.y)));
|
||||
}
|
||||
|
||||
// Distance to line segment between <a> and <b>, used for fCapsule() version 2below
|
||||
float fLineSegment(vec3 p, vec3 a, vec3 b) {
|
||||
vec3 ab = b - a;
|
||||
float t = clamp(dot(p - a, ab) / dot(ab, ab), 0., 1.);
|
||||
return length((ab * t + a) - p);
|
||||
}
|
||||
|
||||
// Capsule version 2: between two end points <a> and <b> with radius r
|
||||
float fCapsule(vec3 p, vec3 a, vec3 b, float r) {
|
||||
return fLineSegment(p, a, b) - r;
|
||||
}
|
||||
|
||||
// Torus in the XZ-plane
|
||||
float fTorus(vec3 p, float smallRadius, float largeRadius) {
|
||||
return length(vec2(length(p.xz) - largeRadius, p.y)) - smallRadius;
|
||||
}
|
||||
|
||||
// A circle line. Can also be used to make a torus by subtracting the smaller radius of the torus.
|
||||
float fCircle(vec3 p, float r) {
|
||||
float l = length(p.xz) - r;
|
||||
return length(vec2(p.y, l));
|
||||
}
|
||||
|
||||
// A circular disc with no thickness (i.e. a cylinder with no height).
|
||||
// Subtract some value to make a flat disc with rounded edge.
|
||||
float fDisc(vec3 p, float r) {
|
||||
float l = length(p.xz) - r;
|
||||
return l < 0. ? abs(p.y) : length(vec2(p.y, l));
|
||||
}
|
||||
|
||||
// Hexagonal prism, incircle variant
|
||||
float fHexagonIncircle(vec3 p, vec2 h) {
|
||||
return fHexagonCircumcircle(p, vec2(h.x * sqrt(3.) * 0.5, h.y));
|
||||
}
|
||||
|
||||
// Cone with correct distances to tip and base circle. Y is up, 0 is in the middle of the base.
|
||||
float fCone(vec3 p, float radius, float height) {
|
||||
vec2 q = vec2(length(p.xz), p.y);
|
||||
vec2 tip = q - vec2(0, height);
|
||||
vec2 mantleDir = normalize(vec2(height, radius));
|
||||
float mantle = dot(tip, mantleDir);
|
||||
float d = max(mantle, -q.y);
|
||||
float projected = dot(tip, vec2(mantleDir.y, -mantleDir.x));
|
||||
|
||||
// distance to tip
|
||||
if((q.y > height) && (projected < 0.)) {
|
||||
d = max(d, length(tip));
|
||||
}
|
||||
|
||||
// distance to base ring
|
||||
if((q.x > radius) && (projected > length(vec2(height, radius)))) {
|
||||
d = max(d, length(q - vec2(radius, 0)));
|
||||
}
|
||||
return d;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// DOMAIN MANIPULATION OPERATORS
|
||||
//
|
||||
////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Conventions:
|
||||
//
|
||||
// Everything that modifies the domain is named pSomething.
|
||||
//
|
||||
// Many operate only on a subset of the three dimensions. For those,
|
||||
// you must choose the dimensions that you want manipulated
|
||||
// by supplying e.g. <p.x> or <p.zx>
|
||||
//
|
||||
// <inout p> is always the first argument and modified in place.
|
||||
//
|
||||
// Many of the operators partition space into cells. An identifier
|
||||
// or cell index is returned, if possible. This return value is
|
||||
// intended to be optionally used e.g. as a random seed to change
|
||||
// parameters of the distance functions inside the cells.
|
||||
//
|
||||
// Unless stated otherwise, for cell index 0, <p> is unchanged and cells
|
||||
// are centered on the origin so objects don't have to be moved to fit.
|
||||
//
|
||||
//
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
||||
// Rotate around a coordinate axis (i.e. in a plane perpendicular to that axis) by angle <a>.
|
||||
// Read like this: R(p.xz, a) rotates "x towards z".
|
||||
// This is fast if <a> is a compile-time constant and slower (but still practical) if not.
|
||||
void pR(inout vec2 p, float a) {
|
||||
p = cos(a) * p + sin(a) * vec2(p.y, -p.x);
|
||||
}
|
||||
|
||||
// Shortcut for 45-degrees rotation
|
||||
void pR45(inout vec2 p) {
|
||||
p = (p + vec2(p.y, -p.x)) * sqrt(0.5);
|
||||
}
|
||||
|
||||
// Repeat space along one axis. Use like this to repeat along the x axis:
|
||||
// <float cell = pMod1(p.x,5);> - using the return value is optional.
|
||||
float pMod1(inout float p, float size) {
|
||||
float halfsize = size * 0.5;
|
||||
float c = floor((p + halfsize) / size);
|
||||
p = mod(p + halfsize, size) - halfsize;
|
||||
return c;
|
||||
}
|
||||
|
||||
// Same, but mirror every second cell so they match at the boundaries
|
||||
float pModMirror1(inout float p, float size) {
|
||||
float halfsize = size * 0.5;
|
||||
float c = floor((p + halfsize) / size);
|
||||
p = mod(p + halfsize, size) - halfsize;
|
||||
p *= mod(c, 2.0) * 2. - 1.;
|
||||
return c;
|
||||
}
|
||||
|
||||
// Repeat the domain only in positive direction. Everything in the negative half-space is unchanged.
|
||||
float pModSingle1(inout float p, float size) {
|
||||
float halfsize = size * 0.5;
|
||||
float c = floor((p + halfsize) / size);
|
||||
if(p >= 0.)
|
||||
p = mod(p + halfsize, size) - halfsize;
|
||||
return c;
|
||||
}
|
||||
|
||||
// Repeat only a few times: from indices <start> to <stop> (similar to above, but more flexible)
|
||||
float pModInterval1(inout float p, float size, float start, float stop) {
|
||||
float halfsize = size * 0.5;
|
||||
float c = floor((p + halfsize) / size);
|
||||
p = mod(p + halfsize, size) - halfsize;
|
||||
if(c > stop) { //yes, this might not be the best thing numerically.
|
||||
p += size * (c - stop);
|
||||
c = stop;
|
||||
}
|
||||
if(c < start) {
|
||||
p += size * (c - start);
|
||||
c = start;
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
// Repeat around the origin by a fixed angle.
|
||||
// For easier use, num of repetitions is use to specify the angle.
|
||||
float pModPolar(inout vec2 p, float repetitions) {
|
||||
float angle = 2. * PI / repetitions;
|
||||
float a = atan(p.y, p.x) + angle / 2.;
|
||||
float r = length(p);
|
||||
float c = floor(a / angle);
|
||||
a = mod(a, angle) - angle / 2.;
|
||||
p = vec2(cos(a), sin(a)) * r;
|
||||
// For an odd number of repetitions, fix cell index of the cell in -x direction
|
||||
// (cell index would be e.g. -5 and 5 in the two halves of the cell):
|
||||
if(abs(c) >= (repetitions / 2.))
|
||||
c = abs(c);
|
||||
return c;
|
||||
}
|
||||
|
||||
// Repeat in two dimensions
|
||||
vec2 pMod2(inout vec2 p, vec2 size) {
|
||||
vec2 c = floor((p + size * 0.5) / size);
|
||||
p = mod(p + size * 0.5, size) - size * 0.5;
|
||||
return c;
|
||||
}
|
||||
|
||||
// Same, but mirror every second cell so all boundaries match
|
||||
vec2 pModMirror2(inout vec2 p, vec2 size) {
|
||||
vec2 halfsize = size * 0.5;
|
||||
vec2 c = floor((p + halfsize) / size);
|
||||
p = mod(p + halfsize, size) - halfsize;
|
||||
p *= mod(c, vec2(2.)) * 2. - vec2(1);
|
||||
return c;
|
||||
}
|
||||
|
||||
// Same, but mirror every second cell at the diagonal as well
|
||||
vec2 pModGrid2(inout vec2 p, vec2 size) {
|
||||
vec2 c = floor((p + size * 0.5) / size);
|
||||
p = mod(p + size * 0.5, size) - size * 0.5;
|
||||
p *= mod(c, vec2(2.)) * 2. - vec2(1.);
|
||||
p -= size / 2.;
|
||||
if(p.x > p.y)
|
||||
p.xy = p.yx;
|
||||
return floor(c / 2.);
|
||||
}
|
||||
|
||||
// Repeat in three dimensions
|
||||
vec3 pMod3(inout vec3 p, vec3 size) {
|
||||
vec3 c = floor((p + size * 0.5) / size);
|
||||
p = mod(p + size * 0.5, size) - size * 0.5;
|
||||
return c;
|
||||
}
|
||||
|
||||
// Mirror at an axis-aligned plane which is at a specified distance <dist> from the origin.
|
||||
float pMirror(inout float p, float dist) {
|
||||
float s = sgn(p);
|
||||
p = abs(p) - dist;
|
||||
return s;
|
||||
}
|
||||
|
||||
// Mirror in both dimensions and at the diagonal, yielding one eighth of the space.
|
||||
// translate by dist before mirroring.
|
||||
vec2 pMirrorOctant(inout vec2 p, vec2 dist) {
|
||||
vec2 s = sgn(p);
|
||||
pMirror(p.x, dist.x);
|
||||
pMirror(p.y, dist.y);
|
||||
if(p.y > p.x)
|
||||
p.xy = p.yx;
|
||||
return s;
|
||||
}
|
||||
|
||||
// Reflect space at a plane
|
||||
float pReflect(inout vec3 p, vec3 planeNormal, float offset) {
|
||||
float t = dot(p, planeNormal) + offset;
|
||||
if(t < 0.) {
|
||||
p = p - (2. * t) * planeNormal;
|
||||
}
|
||||
return sgn(t);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// OBJECT COMBINATION OPERATORS
|
||||
//
|
||||
////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// We usually need the following boolean operators to combine two objects:
|
||||
// Union: OR(a,b)
|
||||
// Intersection: AND(a,b)
|
||||
// Difference: AND(a,!b)
|
||||
// (a and b being the distances to the objects).
|
||||
//
|
||||
// The trivial implementations are min(a,b) for union, max(a,b) for intersection
|
||||
// and max(a,-b) for difference. To combine objects in more interesting ways to
|
||||
// produce rounded edges, chamfers, stairs, etc. instead of plain sharp edges we
|
||||
// can use combination operators. It is common to use some kind of "smooth minimum"
|
||||
// instead of min(), but we don't like that because it does not preserve Lipschitz
|
||||
// continuity in many cases.
|
||||
//
|
||||
// Naming convention: since they return a distance, they are called fOpSomething.
|
||||
// The different flavours usually implement all the boolean operators above
|
||||
// and are called fOpUnionRound, fOpIntersectionRound, etc.
|
||||
//
|
||||
// The basic idea: Assume the object surfaces intersect at a right angle. The two
|
||||
// distances <a> and <b> constitute a new local two-dimensional coordinate system
|
||||
// with the actual intersection as the origin. In this coordinate system, we can
|
||||
// evaluate any 2D distance function we want in order to shape the edge.
|
||||
//
|
||||
// The operators below are just those that we found useful or interesting and should
|
||||
// be seen as examples. There are infinitely more possible operators.
|
||||
//
|
||||
// They are designed to actually produce correct distances or distance bounds, unlike
|
||||
// popular "smooth minimum" operators, on the condition that the gradients of the two
|
||||
// SDFs are at right angles. When they are off by more than 30 degrees or so, the
|
||||
// Lipschitz condition will no longer hold (i.e. you might get artifacts). The worst
|
||||
// case is parallel surfaces that are close to each other.
|
||||
//
|
||||
// Most have a float argument <r> to specify the radius of the feature they represent.
|
||||
// This should be much smaller than the object size.
|
||||
//
|
||||
// Some of them have checks like "if ((-a < r) && (-b < r))" that restrict
|
||||
// their influence (and computation cost) to a certain area. You might
|
||||
// want to lift that restriction or enforce it. We have left it as comments
|
||||
// in some cases.
|
||||
//
|
||||
// usage example:
|
||||
//
|
||||
// float fTwoBoxes(vec3 p) {
|
||||
// float box0 = fBox(p, vec3(1));
|
||||
// float box1 = fBox(p-vec3(1), vec3(1));
|
||||
// return fOpUnionChamfer(box0, box1, 0.2);
|
||||
// }
|
||||
//
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
||||
// The "Chamfer" flavour makes a 45-degree chamfered edge (the diagonal of a square of size <r>):
|
||||
float fOpUnionChamfer(float a, float b, float r) {
|
||||
return min(min(a, b), (a - r + b) * sqrt(0.5));
|
||||
}
|
||||
|
||||
// Intersection has to deal with what is normally the inside of the resulting object
|
||||
// when using union, which we normally don't care about too much. Thus, intersection
|
||||
// implementations sometimes differ from union implementations.
|
||||
float fOpIntersectionChamfer(float a, float b, float r) {
|
||||
return max(max(a, b), (a + r + b) * sqrt(0.5));
|
||||
}
|
||||
|
||||
// Difference can be built from Intersection or Union:
|
||||
float fOpDifferenceChamfer(float a, float b, float r) {
|
||||
return fOpIntersectionChamfer(a, -b, r);
|
||||
}
|
||||
|
||||
// The "Round" variant uses a quarter-circle to join the two objects smoothly:
|
||||
float fOpUnionRound(float a, float b, float r) {
|
||||
vec2 u = max(vec2(r - a, r - b), vec2(0));
|
||||
return max(r, min(a, b)) - length(u);
|
||||
}
|
||||
|
||||
float fOpIntersectionRound(float a, float b, float r) {
|
||||
vec2 u = max(vec2(r + a, r + b), vec2(0));
|
||||
return min(-r, max(a, b)) + length(u);
|
||||
}
|
||||
|
||||
float fOpDifferenceRound(float a, float b, float r) {
|
||||
return fOpIntersectionRound(a, -b, r);
|
||||
}
|
||||
|
||||
// The "Columns" flavour makes n-1 circular columns at a 45 degree angle:
|
||||
float fOpUnionColumns(float a, float b, float r, float n) {
|
||||
if((a < r) && (b < r)) {
|
||||
vec2 p = vec2(a, b);
|
||||
float columnradius = r * sqrt(2.) / ((n - 1.) * 2. + sqrt(2.));
|
||||
pR45(p);
|
||||
p.x -= sqrt(2.) / 2. * r;
|
||||
p.x += columnradius * sqrt(2.);
|
||||
if(mod(n, 2.) == 1.) {
|
||||
p.y += columnradius;
|
||||
}
|
||||
// At this point, we have turned 45 degrees and moved at a point on the
|
||||
// diagonal that we want to place the columns on.
|
||||
// Now, repeat the domain along this direction and place a circle.
|
||||
pMod1(p.y, columnradius * 2.);
|
||||
float result = length(p) - columnradius;
|
||||
result = min(result, p.x);
|
||||
result = min(result, a);
|
||||
return min(result, b);
|
||||
} else {
|
||||
return min(a, b);
|
||||
}
|
||||
}
|
||||
|
||||
float fOpDifferenceColumns(float a, float b, float r, float n) {
|
||||
a = -a;
|
||||
float m = min(a, b);
|
||||
//avoid the expensive computation where not needed (produces discontinuity though)
|
||||
if((a < r) && (b < r)) {
|
||||
vec2 p = vec2(a, b);
|
||||
float columnradius = r * sqrt(2.) / n / 2.0;
|
||||
columnradius = r * sqrt(2.) / ((n - 1.) * 2. + sqrt(2.));
|
||||
|
||||
pR45(p);
|
||||
p.y += columnradius;
|
||||
p.x -= sqrt(2.) / 2. * r;
|
||||
p.x += -columnradius * sqrt(2.) / 2.;
|
||||
|
||||
if(mod(n, 2.) == 1.) {
|
||||
p.y += columnradius;
|
||||
}
|
||||
pMod1(p.y, columnradius * 2.);
|
||||
|
||||
float result = -length(p) + columnradius;
|
||||
result = max(result, p.x);
|
||||
result = min(result, a);
|
||||
return -min(result, b);
|
||||
} else {
|
||||
return -m;
|
||||
}
|
||||
}
|
||||
|
||||
float fOpIntersectionColumns(float a, float b, float r, float n) {
|
||||
return fOpDifferenceColumns(a, -b, r, n);
|
||||
}
|
||||
|
||||
// The "Stairs" flavour produces n-1 steps of a staircase:
|
||||
// much less stupid version by paniq
|
||||
float fOpUnionStairs(float a, float b, float r, float n) {
|
||||
float s = r / n;
|
||||
float u = b - r;
|
||||
return min(min(a, b), 0.5 * (u + a + abs((mod(u - a + s, 2. * s)) - s)));
|
||||
}
|
||||
|
||||
// We can just call Union since stairs are symmetric.
|
||||
float fOpIntersectionStairs(float a, float b, float r, float n) {
|
||||
return -fOpUnionStairs(-a, -b, r, n);
|
||||
}
|
||||
|
||||
float fOpDifferenceStairs(float a, float b, float r, float n) {
|
||||
return -fOpUnionStairs(-a, b, r, n);
|
||||
}
|
||||
|
||||
// Similar to fOpUnionRound, but more lipschitz-y at acute angles
|
||||
// (and less so at 90 degrees). Useful when fudging around too much
|
||||
// by MediaMolecule, from Alex Evans' siggraph slides
|
||||
float fOpUnionSoft(float a, float b, float r) {
|
||||
float e = max(r - abs(a - b), 0.);
|
||||
return min(a, b) - e * e * 0.25 / r;
|
||||
}
|
||||
|
||||
// produces a cylindical pipe that runs along the intersection.
|
||||
// No objects remain, only the pipe. This is not a boolean operator.
|
||||
float fOpPipe(float a, float b, float r) {
|
||||
return length(vec2(a, b)) - r;
|
||||
}
|
||||
|
||||
// first object gets a v-shaped engraving where it intersect the second
|
||||
float fOpEngrave(float a, float b, float r) {
|
||||
return max(a, (a + r - abs(b)) * sqrt(0.5));
|
||||
}
|
||||
|
||||
// first object gets a capenter-style groove cut out
|
||||
float fOpGroove(float a, float b, float ra, float rb) {
|
||||
return max(a, min(a + ra, rb - abs(b)));
|
||||
}
|
||||
|
||||
// first object gets a capenter-style tongue attached
|
||||
float fOpTongue(float a, float b, float ra, float rb) {
|
||||
return min(a, max(a - ra, abs(b) - rb));
|
||||
}
|
||||
|
||||
//#endSection End of library
|
||||
|
||||
// https://stackoverflow.com/questions/4200224/random-noise-functions-for-glsl
|
||||
// golden_noise
|
||||
float noise(in vec2 xy, in float seed) {
|
||||
return fract(tan(distance(xy * PHI, xy) * seed) * xy.x);
|
||||
}
|
||||
|
||||
vec3 rnd23(vec2 p) {
|
||||
vec3 p3 = fract(p.xyx * vec3(.1031, .1030, .0973));
|
||||
p3 += dot(p3, p3.yxz + 33.33);
|
||||
return fract((p3.xxy + p3.yzz) * p3.zyx);
|
||||
}
|
||||
|
||||
mat2 Rot(float a) {
|
||||
float s = sin(a), c = cos(a);
|
||||
return mat2(c, -s, s, c);
|
||||
}
|
||||
|
||||
float opExtrusion(in vec3 p, in float sdf, in float h) {
|
||||
vec2 w = vec2(sdf, abs(p.z) - h);
|
||||
return min(max(w.x, w.y), 0.0) + length(max(w, 0.0));
|
||||
}
|
||||
|
||||
float sdCog2d(vec2 pos) {
|
||||
float r = length(pos) * 2.;
|
||||
float a = atan(pos.y, pos.x);
|
||||
float f = 1. - smoothstep(-0.2, .8, sin(a * 12.)) * 0.14;
|
||||
f = smoothstep(f, f + 2., r);
|
||||
return f;
|
||||
}
|
||||
|
||||
float sdCog(vec3 pos, float angle) {
|
||||
pos.xy *= Rot(angle);
|
||||
float d1 = opExtrusion(pos, sdCog2d(pos.xy), 0.05);
|
||||
float d2 = fCapsule(pos, vec3(0., 0.0, 0.), vec3(0., 0., 1.), 0.2);
|
||||
return 0.8 * fOpDifferenceRound(d1, d2, 0.05) - 0.003;
|
||||
}
|
||||
|
||||
float sdCapsule(vec3 p, vec3 a, vec3 b, float r) {
|
||||
vec3 pa = p - a, ba = b - a;
|
||||
float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);
|
||||
return length(pa - ba * h) - r;
|
||||
}
|
||||
|
||||
float sdCylinder(vec3 p, vec3 a, vec3 b, float r) {
|
||||
|
||||
vec3 ba = b - a;
|
||||
vec3 pa = p - a;
|
||||
float baba = dot(ba, ba);
|
||||
float paba = dot(pa, ba);
|
||||
float x = length(pa * baba - ba * paba) - r * baba;
|
||||
float y = abs(paba - baba * 0.5) - baba * 0.5;
|
||||
float x2 = x * x;
|
||||
float y2 = y * y * baba;
|
||||
float d = (max(x, y) < 0.0) ? -min(x2, y2) : (((x > 0.0) ? x2 : 0.0) + ((y > 0.0) ? y2 : 0.0));
|
||||
|
||||
return sign(d) * sqrt(abs(d)) / baba;
|
||||
}
|
||||
|
||||
float sdPlane(vec3 p, vec4 n) {
|
||||
// n must be normalized
|
||||
return dot(p, n.xyz) + n.w;
|
||||
}
|
||||
|
||||
// Add this function before mapScene
|
||||
float rippleEffect(vec3 p, vec3 center, float time) {
|
||||
float dist = length(p.xz - center.xz);
|
||||
float wave = sin(dist * 2.0 - time * 8.0) * exp(-dist * 0.3);
|
||||
return wave * 0.5; // Adjust amplitude as needed
|
||||
}
|
||||
|
||||
/*// Hexagonal prism, circumcircle variant
|
||||
float fHexagonCircumcircle(vec3 p, vec2 h) {
|
||||
vec3 q = abs(p);
|
||||
return max(q.y - h.y, max(q.x * sqrt(3.) * 0.5 + q.z * 0.5, q.z) - h.x);
|
||||
//this is mathematically equivalent to this line, but less efficient:
|
||||
//return max(q.y - h.y, max(dot(vec2(cos(PI/3), sin(PI/3)), q.zx), q.z) - h.x);
|
||||
}*/
|
||||
46
src/sointu/song.h
Normal file
46
src/sointu/song.h
Normal file
@ -0,0 +1,46 @@
|
||||
// auto-generated by Sointu, editing not recommended
|
||||
#ifndef SU_RENDER_H
|
||||
#define SU_RENDER_H
|
||||
|
||||
#define SU_CHANNEL_COUNT 2
|
||||
#define SU_LENGTH_IN_SAMPLES 8282304
|
||||
#define SU_BUFFER_LENGTH (SU_LENGTH_IN_SAMPLES*SU_CHANNEL_COUNT)
|
||||
|
||||
#define SU_SAMPLE_RATE 44100
|
||||
#define SU_BPM 138
|
||||
#define SU_ROWS_PER_BEAT 4
|
||||
#define SU_ROWS_PER_PATTERN 16
|
||||
#define SU_LENGTH_IN_PATTERNS 108
|
||||
#define SU_LENGTH_IN_ROWS (SU_LENGTH_IN_PATTERNS*SU_PATTERN_SIZE)
|
||||
#define SU_SAMPLES_PER_ROW (SU_SAMPLE_RATE*60/(SU_BPM*SU_ROWS_PER_BEAT))
|
||||
#define SU_NUMSYNCS 2
|
||||
#define SU_SYNCBUFFER_LENGTH ((SU_LENGTH_IN_SAMPLES+255)>>8)*SU_NUMSYNCS
|
||||
|
||||
#include <stdint.h>
|
||||
#if UINTPTR_MAX == 0xffffffff
|
||||
#if defined(__clang__) || defined(__GNUC__)
|
||||
#define SU_CALLCONV __attribute__ ((stdcall))
|
||||
#elif defined(_WIN32)
|
||||
#define SU_CALLCONV __stdcall
|
||||
#endif
|
||||
#else
|
||||
#define SU_CALLCONV
|
||||
#endif
|
||||
typedef float SUsample;
|
||||
#define SU_SAMPLE_RANGE 1.0
|
||||
#define SU_SAMPLE_FLOAT
|
||||
#define SU_SAMPLE_SIZE 4
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#define SU_SYNC
|
||||
void SU_CALLCONV su_render_song(SUsample *buffer);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
115
src/song.cpp
Normal file
115
src/song.cpp
Normal file
@ -0,0 +1,115 @@
|
||||
#include <string>
|
||||
#include "song.h"
|
||||
#pragma comment(lib, "strmiids.lib")
|
||||
#pragma comment(lib, "ComCtl32.lib")
|
||||
#pragma comment(lib, "winmm.lib")
|
||||
|
||||
#pragma comment(lib, "strmbase.lib")
|
||||
|
||||
using namespace Leviathan;
|
||||
|
||||
Song::Song()
|
||||
{
|
||||
}
|
||||
|
||||
Song::Song(LPCWSTR path) : playing(false)
|
||||
{
|
||||
__int64 trackLength;
|
||||
IGraphBuilder * graph;
|
||||
|
||||
CoInitialize(0);
|
||||
CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC, IID_IGraphBuilder, (void**)&graph);
|
||||
|
||||
graph->QueryInterface(IID_IMediaControl, (void**)&mediaControl);
|
||||
graph->QueryInterface(IID_IMediaSeeking, (void**)&mediaSeeking);
|
||||
graph->QueryInterface(IID_IBasicAudio, (void**)&audioControl);
|
||||
audioControl->put_Volume(long(-90000));
|
||||
|
||||
HRESULT hr = graph->RenderFile(path, 0);
|
||||
|
||||
if (hr == S_OK)
|
||||
printf("Audio file opened successfully\n");
|
||||
else
|
||||
printf("Failed to open audio file\n");
|
||||
|
||||
graph->Release();
|
||||
|
||||
mediaSeeking->SetTimeFormat(&TIME_FORMAT_MEDIA_TIME);
|
||||
mediaSeeking->GetDuration(&trackLength);
|
||||
length = (long double)(trackLength) / (long double)10000000.0;
|
||||
|
||||
__int64 position = 0;
|
||||
mediaSeeking->SetPositions(&position, AM_SEEKING_AbsolutePositioning, &position, AM_SEEKING_NoPositioning);
|
||||
pause();
|
||||
}
|
||||
|
||||
Song::~Song()
|
||||
{
|
||||
audioControl->Release();
|
||||
mediaControl->Release();
|
||||
mediaSeeking->Release();
|
||||
}
|
||||
|
||||
int Song::play()
|
||||
{
|
||||
mediaControl->Run();
|
||||
playing = true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int Song::pause()
|
||||
{
|
||||
mediaControl->Stop();
|
||||
playing = false;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int Song::toggle()
|
||||
{
|
||||
playing = !playing;
|
||||
if (playing)
|
||||
play();
|
||||
else
|
||||
pause();
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool Song::is_playing()
|
||||
{
|
||||
OAFilterState state;
|
||||
mediaControl->GetState(INFINITE, &state);
|
||||
__int64 trackLength, position;
|
||||
mediaSeeking->GetDuration(&trackLength);
|
||||
mediaSeeking->GetCurrentPosition(&position);
|
||||
return position<trackLength;
|
||||
}
|
||||
|
||||
int Song::seek(long double position)
|
||||
{
|
||||
if (position>length)
|
||||
position = length;
|
||||
if (position<.0)
|
||||
position = .0;
|
||||
|
||||
__int64 seekPosition = __int64(10000000.0*position);
|
||||
|
||||
if (playing)
|
||||
mediaControl->Stop();
|
||||
mediaSeeking->SetPositions(&seekPosition, AM_SEEKING_AbsolutePositioning, &seekPosition, AM_SEEKING_NoPositioning);
|
||||
if (playing)
|
||||
mediaControl->Run();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
long double Song::getTime()
|
||||
{
|
||||
__int64 position;
|
||||
mediaSeeking->GetCurrentPosition(&position);
|
||||
return (long double)(position) / (long double)10000000.0;
|
||||
}
|
||||
|
||||
long double Song::getLength()
|
||||
{
|
||||
return length;
|
||||
}
|
||||
39
src/song.h
Normal file
39
src/song.h
Normal file
@ -0,0 +1,39 @@
|
||||
#pragma once
|
||||
|
||||
#pragma warning(disable:995)
|
||||
#include <dshow.h>
|
||||
#pragma warning(default:995)
|
||||
|
||||
namespace Leviathan
|
||||
{
|
||||
class Song
|
||||
{
|
||||
public:
|
||||
Song();
|
||||
|
||||
Song(LPCWSTR path);
|
||||
|
||||
~Song();
|
||||
|
||||
int play();
|
||||
|
||||
int pause();
|
||||
|
||||
int toggle();
|
||||
|
||||
bool is_playing();
|
||||
|
||||
int seek(long double position);
|
||||
|
||||
long double getTime();
|
||||
|
||||
long double getLength();
|
||||
|
||||
private:
|
||||
long double length;
|
||||
bool playing;
|
||||
IMediaControl * mediaControl;
|
||||
IMediaSeeking * mediaSeeking;
|
||||
IBasicAudio * audioControl;
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user