commit 77c69653e86d1c82208ea5980f31260da9971545 Author: Job Bautista Date: Wed Apr 27 22:01:42 2022 +0800 Initial commit Debut arranges: Bad Apple!!, The Rabbit Has Landed diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..72ab120 --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) 2022 Job Bautista + +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. diff --git a/README b/README new file mode 100644 index 0000000..4dbc595 --- /dev/null +++ b/README @@ -0,0 +1,111 @@ +SoxMusicGen +----------- + +A Perl 5 module making it easier to create music with the power of SoX +synths as well as your custom samples. + +If you're one of these people: + +- a Perl programmer +- suck at reading sheet music +- finds MML too difficult +- too lazy to learn FamiTracker +- think that scientific note duration is the best thing since sliced bread +- used libsox.sh, the predecessor of this module + +Then try this crappy module of mine! + +Some features of this module: + +- Easy to write syntax for inputting notes (e.g. "$qu:A4") + - Inspired from korobeiniki.sh of the dsuni/bashtris repository +- Supports multiple note harmonies ("$ei:A4/C5") + - Unlike before in libsox.sh you can do as many notes as you want! + - Like this: "$dei:C6/A5/G5/B5/F4/D3/G3/B4" +- Supports every synth type included in SoX +- You can use your own samples as well + - Your samples should be encoded in a format supported by SoX, like wav +- Adheres to the Unix philosophy of "do one thing and do it well" + +What this library doesn't support: + +- Harmonies with different durations or instruments + - e.g. countermelodies and background melodies + - I suggest doing two separate scripts, sox them into two files, then + play both either merged or mixed + +Usage +----- + +# Paste the following in your child script: + +use lib 'path/to/module'; # most likely either .. or . +use SoXMusicGen; + +our @notes; + +setTempo(BPM); # Replace "BPM" with integer +setDefaultSynthType(""); # Choose from sin, square, triangle, pluck, etc. +our $maxSynthChannels=1; # Set as many as needed + +# If using more than two channels... +setDefaultSynthType("", "", ""); # Number of synths set must match number +our $maxSynthChannels=4; # of audio channels + +# If you're using custom samples... +our $synthSampleRate=44100; # Your synth sample rate must match the SR of + # your custom samples, which might be 44.1kHz. +our $maxSamplesChannels=2; # How much notes of your custom samples to play + # at the same time. If your custom samples use 2 + # channels per note, set $maxSynthChannels to 4. + # That's if you want to use both synths and samples +our $samplesDir="path/to/samples"; # Every file must be formatted as + # NOTE.ext, like A#4.wav and C3.aiff + +# To print the sox pipes... +createSynths(); # for synths +createSamples(); # for custom samples + +# Refer to the child scripts included in this repo for more examples + +Example child script syntax +--------------------------- + +./music.pl | xargs play -S -V1 # Plays into SoX once + +./music.pl | xargs ./myplay-repeat.sh 1 # Plays into SoX twice + +./music.pl | xargs ./mysox.sh music.wav # Saves into "music.wav" using SoX + +./music.pl | head -n +37 | xargs play -S -V1 ; ./music.pl | tail -n +37 | + xargs ./myplay-repeat.sh 3 # Plays line 1 to 37 of music.pl's output once, + then plays the rest thrice + +./music.pl | xargs ./mysox.sh - | cvlc - # Saves into stdout then pipes it into + vlc +./music.pl > music.txt # Redirects music.pl's output to a text file + +./music.pl | xclip -i # Copies music.pl's output to XA_PRIMARY + +License +------- + +Copyright (C) 2022 Job Bautista + +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. diff --git a/SoXMusicGen.pm b/SoXMusicGen.pm new file mode 100644 index 0000000..1fcee44 --- /dev/null +++ b/SoXMusicGen.pm @@ -0,0 +1,130 @@ +package SoXMusicGen; + +use warnings; +use strict; + +=begin +Copyright (C) 2022 Job Bautista + +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. +=cut + +use POSIX; + +use Exporter qw(import); +our @EXPORT = qw(setTempo setDefaultSynthType createSynths createSamples + silence iterate $synthSampleRate $samplesDir + $maxSynthChannels $maxSamplesChannels @notes + $fu $ha $qu $ei $si + $dha $dqu $dei $dsi + $tqu $tei $tsi + ); + +our @notes; # In the following format - "$duration:NOTE" + +sub setTempo { + my $BPM=$_[0]; + + # durations + our $fu=240 / $BPM; # Whole note + our $ha=120 / $BPM; # Half note + our $qu=60 / $BPM; # Quarter note + our $ei=30 / $BPM; # Eighth note + our $si=15 / $BPM; # Sixteenth note + our $dha=190 / $BPM; # Dotted-half note + our $dqu=90 / $BPM; # Dotted-quarter note + our $dei=45 / $BPM; # Dotted-eighth note + our $dsi=22.5 / $BPM; # Dotted-sixteenth note + our $tqu=40 / $BPM; # Triplet-quarter note + our $tei=20 / $BPM; # Triplet-eighth note + our $tsi=10 / $BPM; # Triplet-sixteenth note +} + +my @defaultsynth=("sin"); # Just in case you forget to specify synth type +my @synthtype=@defaultsynth; # Number of default synths must match +our $maxSynthChannels=1; # number of max channels to use +sub setDefaultSynthType { + @defaultsynth=@_; + @synthtype=@defaultsynth; +} + +sub iterate { + my @iteration=($_[0]..$_[1]); + return @iteration; +} + +our $synthSampleRate=48000; + +sub createSynths { + foreach my $note (@notes) { + my @currentNote = split(':', $note); + print '"|sox -r ', $synthSampleRate, ' -n -p synth ', + POSIX::floor($currentNote[0]*1000)/1000; + my @pitches = split('/', uc $currentNote[1]); + for my $currentSynthAndPitch (iterate(0,$maxSynthChannels-1)) { + print ' ', $synthtype[$currentSynthAndPitch]; + if(exists($pitches[$currentSynthAndPitch])) { + print ' ', $pitches[$currentSynthAndPitch]; + } else { + print ' ', $pitches[-1]; + } + } + print '"', "\n"; + } + @notes = (); # You usually want to reset the notes array after calling this +} + +sub silence { # needed because pluck synth doesn't support zero frequency + createSynths(); # necessary because we will be changing + @synthtype = (); # synth type + for (iterate(0,@defaultsynth-1)) { # If number of default synths is 4, + push (@synthtype, "sin"); # we create 4 sine synths + } # sin, square, sawtooth, trapezium, and exp support freq=0 + push (@notes, "$_[0]:0"); + createSynths(); # get the silence printed + @synthtype=@defaultsynth; # before we return to default synth +} + +our $samplesDir; +our $maxSamplesChannels=1; + +sub createSamples { + foreach my $note (@notes) { + my @currentNote = split(':', $note); + my @pitches = split('/', uc $currentNote[1]); + if($maxSamplesChannels == 1) { + print '"|sox ', $samplesDir, '/', uc $pitches[0], '.* -p ', + 'trim 0 ', POSIX::floor($currentNote[0]*1000)/1000, '"', "\n"; + } else { + print '"|sox -M '; + for my $currentSample (iterate(0,$maxSamplesChannels-1)) { + if(exists($pitches[$currentSample])) { + print $samplesDir, '/', uc $pitches[$currentSample], '.* '; + } else { + print $samplesDir, '/', uc $pitches[-1], '.* '; + } + } + print '-p trim 0 ', + POSIX::floor($currentNote[0]*1000)/1000, '"', "\n"; + } + } + @notes = (); # You usually want to reset the notes array after calling this +} + +1; diff --git a/bad-apple/art.txt b/bad-apple/art.txt new file mode 100644 index 0000000..6c898f6 --- /dev/null +++ b/bad-apple/art.txt @@ -0,0 +1,8 @@ + __ ../.. __ ..\.. __ __ ___ +|__) ( ( | \ ) ) |__) |__) | |__ +|__) \_._/ |__/ \_._/ | | |___ |___ + +Bad Apple!! +Composed by ZUN for Touhou Gensoukyou: Lotus Land Story +Arranged by Job Bautista +Apple ASCII art by Rudá Moura diff --git a/bad-apple/piano-ver.pl b/bad-apple/piano-ver.pl new file mode 100755 index 0000000..f241b04 --- /dev/null +++ b/bad-apple/piano-ver.pl @@ -0,0 +1,339 @@ +#!/usr/bin/env perl + +use warnings; +use strict; + +=begin +Copyright (C) 2022 Job Bautista + +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. +=cut + +use lib '..'; +use SoXMusicGen; + +our @notes; + +setTempo(160); +our $maxSynthChannels=4; +our $maxSamplesChannels=2; +setDefaultSynthType("sin", "sin", "sin", "sin"); # To match with our custom +our $synthSampleRate=44100; # piano samples +our $samplesDir=$ARGV[0]; + +# intro +for (iterate(1,8)) { + push (@notes, "$qu:1"); +} +createSynths(); + +sub introcommon { + push @notes, ( + "$ei:D#4", + "$ei:A#4", + "$ei:G#4", + "$ei:A#4", + "$ei:F#4", + "$ei:A#4", + "$ei:F4", + "$ei:A#4" + ); +} +introcommon(); introcommon(); +push (@notes, "$ei:D#4"); +for (iterate(1,7)) { + push (@notes, "$ei:D#6/A#5"); + createSamples(); + silence("$ei"); +} +push (@notes, "$ei:D#6/A#5"); + +# fast bridge +sub fastbridge { + sub adff { + push @notes, ( + "$si:A#5/F#5", + "$si:D#5/A#5", + "$si:F5/D#5", + "$si:F#5/F5" + ); + } + adff(); adff(); adff(); + push @notes, ( + "$si:C#6/F#5", + "$si:D#6/C#6", + + "$si:A#5/D#6", + "$si:D#5/A#5" + ); + adff(); adff(); + push @notes, ( + "$si:A#5/F#5", + "$si:D#5/A#5", + + "$si:C#6/D#5", + "$si:D#6/C#6", + + "$si:A#5/D#6", + "$si:G#5/A#5", + "$si:F#5/G#5", + "$si:F5/F#5", + + "$si:B4/F5", + "$si:B4/B4", + + "$si:F#5/B4" + ); + sub bbcdf { + push @notes, ( + "$si:B4/F#5", + "$si:B4/B4", + + "$si:C#5/B4", + "$si:D#5/C#5", + "$si:F#5/D#5" + ); + } + bbcdf(); push @notes, ( "$si:B4/F#5", "$si:B4/B4", "$si:F#5/B4" ); + bbcdf(); push @notes, ( "$si:D5/F#5", "$si:D#5/D5", "$si:F5/D#5" ); + sub addf { + push @notes, ( + "$si:A#4/F5", + "$si:D5/A#4", + "$si:D#5/D5", + "$si:F5/D#5" + ); + } + addf(); addf(); + push @notes, ( + "$si:A#4/F5", + "$si:A#4/A#4", + "$si:G#4/A#4", + "$si:F#4/G#4", + "$si:F4/F#4" + ); +} +fastbridge(); fastbridge(); + +# verse 1 +sub verse1common { + push @notes, ( + "$ei:D#5/D#4", + "$ei:F5/F4", + "$ei:F#5/F#4", + "$ei:G#5/G#4", + "$qu:A#5/A#4" + ); +} +verse1common(); +push @notes, ( + "$ei:D#5/D#4", + "$ei:C#6/C#5", + "$qu:A#5/A#4", + "$qu:D#5/D#4", + "$ei:A#5/A#4", + "$ei:G#5/G#4", + "$ei:F#5/F#4", + "$ei:F5/F4" +); +verse1common(); +push @notes, ( + "$ei:G#5/G#4", + "$ei:F#5/F#4", + "$ei:F5/F4", + "$ei:A#4/A#3", + "$ei:F5/F4", + "$ei:F#5/F#4", + "$ei:F5/F4", + "$ei:D#5/D#4", + "$ei:D5/D4", + "$ei:F5/F4" +); +verse1common(); +push @notes, ( + "$ei:G#5/G#4", + "$ei:C#6/C#5", + "$qu:D#6/D#5", + "$qu:D#6/D#5", + "$qu:F6/F5", + "$qu:F#6/F#5", + "$ei:D#6/D#5", + "$ei:F6/F5", + "$ei:F#6/F#5", + "$ei:G#6/G#5", + "$qu:A#6/A#5", + "$ei:G#6/G#5", + "$ei:F#6/F#5", + "$qu:G#6/G#5", + "$qu:F6/F5", + "$qu:F#6/F#5", + "$qu:G#6/G#5" +); + +# verse 2 +sub verse2common { + push @notes, ( + "$ha:D#5/D#4", + "$ei:D#5/D#4", + "$ei:F5/F4", + "$qu:F#5/F#4", + "$dqu:F5/F4" + ); +} +verse2common(); +push @notes, ( + "$dqu:A#4/A#3", + "$qu:F5/F4", + "$qu:F5/F4", + "$ei:F#5/F#4", + "$dqu:D#5/D#4", + "$qu:C#5/C#4", + "$qu:C#5/C#4", + "$ei:D#5/D#4", + "$dqu:A#4/A#3", + "$qu:D#5/D#4" +); +verse2common(); +push @notes, ( + "$dqu:F#5/F#4", + "$qu:G#5/G#4", + "$dqu:D#5/D#4", + "$ei:A#5/A#4", + "$fu:A#5/A#4", + "$ei:G#5/G#4", + "$ei:A#5/A#4", + "$qu:C#6/C#5" +); + +# verse 3, which is basically a higher pitched verse 2 +sub verse3common { + push @notes, ( + "$ha:D#6/D#5", + "$ei:D#6/D#5", + "$ei:F6/F5" + ); +} +verse3common; +push @notes, ( + "$qu:F#6/F#5", + "$dqu:F6/F5", + "$dqu:A#5/A#4", + "$qu:F6/F5", + "$qu:F6/F5", + "$ei:F#6/F#5", + "$dqu:D#6/D#5", + "$qu:C#6/C#5", + "$qu:C#6/C#5", + "$ei:D#6/D#5", + "$dqu:A#5/A#4", + "$qu:F6/F5" +); +verse3common(); +push @notes, ( + "$ei:F#6/F#5", + "$ei:G#6/G#5", + "$dqu:F6/F5", + "$dqu:F#6/F#5", + "$qu:G#6/G#5", + "$dqu:D6/D5", + "$dqu:A#5/A#4", + "$qu:A#6/A#5", + "$qu:G#6/G#5", + "$qu:F#6/F#5", + "$qu:F6/F5", + "$qu:F#6/F#5" +); + +# verse 4 +sub verse4common { + push @notes, ( + "$ei:G5/G4", + "$qu:D5/D4", + "$qu:G5/G4", + "$ei:A#4/A#4", + "$ei:D5/D4", + "$ei:F5/F4", + "$ei:G5/G4", + "$ei:D5/D4", + "$ei:A#4/A#3", + "$qu:G5/G4", + "$ei:G5/G4", + "$ei:A5/A4", + "$ei:A#5/A#4", + "$ei:G5/G4", + "$qu:D5/D4", + "$qu:G5/G4", + "$ei:D5/D4", + "$ei:G5/G4", + "$ei:C6/C5", + "$ha:A#5/A#4" + ); +} +verse4common(); +push @notes, ( + "$ei:A5/A4", + "$ei:G5/G4", + "$ei:D5/D4", + "$ei:A#4/A#3" +); +verse4common(); +push @notes, ( "$qu:A5/A4", "$qu:A#5/A#4" ); + +# verse 5, which is basically a higher pitched verse 4 +sub verse5common { + push @notes, ( + "$ei:G6/G5", + "$qu:D6/D5", + "$qu:G6/G5", + "$ei:A#5/A#4", + "$ei:D6/D5", + "$ei:F6/F5", + "$ei:G6/G5", + "$ei:D6/D5", + "$ei:A#5/A#4", + "$qu:G6/G5", + "$ei:G6/G5", + "$ei:A6/A5", + "$ei:A#6/A#5", + "$ei:G6/G5", + "$qu:D6/D5", + "$qu:G6/G5" + ); +} +verse5common(); +push @notes, ( + "$ei:D6/D5", + "$ei:G6/G5", + "$ei:C7/C6", + "$ha:A#6/A#5", + + "$ei:A6/A5", + "$ei:G6/G5", + "$ei:D6/D5", + "$ei:A#5/A#4" +); +verse5common(); +push @notes, ( + "$ei:D6/D5", + "$ei:G6/G5", + "$ei:A6/A5", + "$fu:A#6/A#5" +); + +createSamples(); diff --git a/bad-apple/synths-only.pl b/bad-apple/synths-only.pl new file mode 100755 index 0000000..eee23cf --- /dev/null +++ b/bad-apple/synths-only.pl @@ -0,0 +1,343 @@ +#!/usr/bin/env perl + +use warnings; +use strict; + +=begin +Copyright (C) 2022 Job Bautista + +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. +=cut + +use lib '..'; +use SoXMusicGen; + +our @notes; + +setTempo(160); +setDefaultSynthType("sin"); +our $maxSynthChannels=1; + +# intro +for (iterate(1,8)) { + push (@notes, "$qu:25"); +} +sub introcommon { + push @notes, ( + "$ei:D#3", + "$ei:A#3", + "$ei:G#3", + "$ei:A#3", + "$ei:F#3", + "$ei:A#3", + "$ei:F3", + "$ei:A#3" + ); +} +introcommon(); introcommon(); +push (@notes, "$ei:D#3"); +for (iterate(1,7)) { + push (@notes, "$ei:D#4"); + silence("$ei"); +} +push (@notes, "$ei:D#4"); + +# fast bridge +sub fastbridge { + sub adff { + push @notes, ( + "$si:A#4", + "$si:D#4", + "$si:F4", + "$si:F#4" + ); + } + adff(); adff(); adff(); + push @notes, ( + "$si:C#5", + "$si:D#5", + + "$si:A#4", + "$si:D#4" + ); + adff(); adff(); + push @notes, ( + "$si:A#4", + "$si:D#4", + + "$si:C#5", + "$si:D#5", + + "$si:A#4", + "$si:G#4", + "$si:F#4", + "$si:F4", + + "$si:B3", + "$si:B3", + + "$si:F#4", + + "$si:B3", + "$si:B3", + + "$si:C#4", + "$si:D#4", + "$si:F#4", + + "$si:B3", + "$si:B3", + + "$si:F#4", + + "$si:B3", + "$si:B3", + + "$si:C#4", + "$si:D#4", + "$si:F#4", + "$si:D4", + "$si:D#4", + "$si:F4" + ); + sub addf { + push @notes, ( + "$si:A#3", + "$si:D4", + "$si:D#4", + "$si:F4" + ); + } + addf(); addf(); + push @notes, ( + "$si:A#3", + "$si:A#3", + "$si:G#3", + "$si:F#3", + "$si:F3" + ); +} +fastbridge(); fastbridge(); + +# verse 1 +sub verse1common { + push @notes, ( + "$ei:D#4", + "$ei:F4", + "$ei:F#4", + "$ei:G#4", + "$qu:A#4" + ); +} +verse1common(); +push @notes, ( + "$ei:D#4", + "$ei:C#5", + "$qu:A#4", + "$qu:D#4", + "$ei:A#4", + "$ei:G#4", + "$ei:F#4", + "$ei:F4" +); +verse1common(); +push @notes, ( + "$ei:G#4", + "$ei:F#4", + "$ei:F4", + "$ei:A#3", + "$ei:F4", + "$ei:F#4", + "$ei:F4", + "$ei:D#4", + "$ei:D4", + "$ei:F4" +); +verse1common(); +push @notes, ( + "$ei:G#4", + "$ei:C#5", + "$qu:D#5", + "$qu:D#5", + "$qu:F5", + "$qu:F#5", + "$ei:D#5", + "$ei:F5", + "$ei:F#5", + "$ei:G#5", + "$qu:A#5", + "$ei:G#5", + "$ei:F#5", + "$qu:G#5", + "$qu:F5", + "$qu:F#5", + "$qu:G#5" +); + +# verse 2 +sub verse2common { + push @notes, ( + "$ha:D#4", + "$ei:D#4", + "$ei:F4", + "$qu:F#4", + "$dqu:F4" + ); +} +verse2common(); +push @notes, ( + "$dqu:A#3", + "$qu:F4", + "$qu:F4", + "$ei:F#4", + "$dqu:D#4", + "$qu:C#4", + "$qu:C#4", + "$ei:D#4", + "$dqu:A#3", + "$qu:D#4" +); +verse2common(); +push @notes, ( + "$dqu:F#4", + "$qu:G#4", + "$dqu:D#4", + "$ei:A#4", + "$fu:A#4", + "$ei:G#4", + "$ei:A#4", + "$qu:C#5" +); + +# verse 3, which is basically a higher pitched verse 2 +sub verse3common { + push @notes, ( + "$ha:D#5", + "$ei:D#5", + "$ei:F5" + ); +} +verse3common; +push @notes, ( + "$qu:F#5", + "$dqu:F5", + "$dqu:A#4", + "$qu:F5", + "$qu:F5", + "$ei:F#5", + "$dqu:D#5", + "$qu:C#5", + "$qu:C#5", + "$ei:D#5", + "$dqu:A#4", + "$qu:F5" +); +verse3common(); +push @notes, ( + "$ei:F#5", + "$ei:G#5", + "$dqu:F5", + "$dqu:F#5", + "$qu:G#5", + "$dqu:D5", + "$dqu:A#4", + "$qu:A#5", + "$qu:G#5", + "$qu:F#5", + "$qu:F5", + "$qu:F#5" +); + +# verse 4 +sub verse4common { + push @notes, ( + "$ei:G4", + "$qu:D4", + "$qu:G4", + "$ei:A#3", + "$ei:D4", + "$ei:F4", + "$ei:G4", + "$ei:D4", + "$ei:A#3", + "$qu:391", # custom duration needed because can't hear notes separately + "$ei:391", + "$ei:A4", + "$ei:A#4", + "$ei:G4", + "$qu:D4", + "$qu:G4", + "$ei:D4", + "$ei:G4", + "$ei:C5", + "$ha:A#4" + ); +} +verse4common(); +push @notes, ( + "$ei:A4", + "$ei:G4", + "$ei:D4", + "$ei:A#3" +); +verse4common(); +push @notes, ( "$qu:A4", "$qu:A#4" ); + +# verse 5, which is basically a higher pitched verse 4 +sub verse5common { + push @notes, ( + "$ei:G5", + "$qu:D5", + "$qu:G5", + "$ei:A#4", + "$ei:D5", + "$ei:F5", + "$ei:G5", + "$ei:D5", + "$ei:A#4", + "$qu:783", + "$ei:783", + "$ei:A5", + "$ei:A#5", + "$ei:G5", + "$qu:D5", + "$qu:G5" + ); +} +verse5common(); +push @notes, ( + "$ei:D5", + "$ei:G5", + "$ei:C6", + "$ha:A#5", + + "$ei:A5", + "$ei:G5", + "$ei:D5", + "$ei:A#4" +); +verse5common(); +push @notes, ( + "$ei:D5", + "$ei:G5", + "$ei:A5", + "$fu:A#5-902" +); + +createSynths(); diff --git a/rabbit-has-landed/art.txt b/rabbit-has-landed/art.txt new file mode 100644 index 0000000..2f4bcf7 --- /dev/null +++ b/rabbit-has-landed/art.txt @@ -0,0 +1,11 @@ + ___ ___ __ __ __ ___ + | |__| |__ |__) /\ |__) |__) | | + | | | |___ | \ /~~\ |__) |__) | | + + __ __ ___ __ +|__| /\ /__` | /\ |\ | | \ |__ | \ +| | /~~\ .__/ |___ /~~\ | \| |__/ |___ |__/ + +The Rabbit Has Landed +Composed by ZUN for Touhou Kanjuden: Legacy of Lunatic Kingdom +Arranged by Job Bautista diff --git a/rabbit-has-landed/rabbit-has-landed.pl b/rabbit-has-landed/rabbit-has-landed.pl new file mode 100755 index 0000000..413ec92 --- /dev/null +++ b/rabbit-has-landed/rabbit-has-landed.pl @@ -0,0 +1,800 @@ +#!/usr/bin/env perl + +use warnings; +use strict; + +=begin +Copyright (C) 2022 Job Bautista + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and a#sociated 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. +=cut + +use lib '..'; +use SoXMusicGen; + +our @notes; +our $maxSynthChannels=6; +setTempo(155); +setDefaultSynthType("square", "square", + "square", "square", + "square", "square"); # sine synth struggles with 6 channels + +# intro +sub ee4h { + for (iterate(1,2)) { + push (@notes, "$ei:$_[0]$_[3]/$_[1]$_[4]/$_[2]$_[5]/$_[0]$_[6]"); + } +} +ee4h("b", "f#", "d", 3, 3, 3, 2); +push (@notes, "$qu:b4/f#4/d4"); +ee4h("a", "f#", "d", 3, 3, 3, 2); +push (@notes, "$qu:a4/f#4/d4"); +push @notes, ( + "$dei:g#4/e4", + "$dei:a4/e4", + "$ei:g#4/e4", + "$ha:f#4/c#4" +); +ee4h("b", "f#", "d", 3, 3, 3, 2); +push @notes, ( + "$ei:f#4/c#4", + "$ei:a4/e4", + "$ei:b4/f#4", + "$ei:c#5/f#4", + "$qu:a4/f#4", + "$dei:g#4/e4", + "$dei:a4/f#4", + "$ei:b4/g#4", + "$ha:c#5/a#4/f#4" +); +ee4h("e", "b", "g", 4, 3, 3, 3); +push (@notes, "$qu:e5/b4/g4"); +ee4h("d", "b", "g", 4, 3, 3, 3); +push (@notes, "$qu:d5/b4/g4"); +push @notes, ( + "$dei:c#5/a4", + "$dei:d5/a4", + "$ei:c#5/a4", + "$ha:b4/f#4" +); +ee4h("e", "b", "g", 4, 3, 3, 3); +push @notes, ( + "$ei:b4/f#4", + "$ei:d5/a4", + "$ei:e5/b4", + "$ei:f#5/b4", + "$qu:d5/b4", + "$dei:c#5/a4", + "$dei:d5/b4", + "$ei:e5/c#5", + "$ha:f#5/d#5/b4" +); + +# verse 1 +push @notes, ( + "$ei:a4/a3", + "$ei:e5", + "$ei:f#5/a3", + "$si:a4/f#4/d4", + "$si:c#5", + "$ei:f#5/a3", + "$ei:g#5", + "$ei:b4/a3", + "$ei:g#5", + "$ha:a5/e5", + + "$dsi:b3", + "$tsi:g5", + "$ei:g#5", + "$ei:e5", + "$ei:b4", + + "$ei:g#4/g#3", + "$ei:c#5", + "$ei:e5/g#3", + "$si:b4/e4/c#4", + "$si:c#5", + "$ei:f5/g#3", + "$ei:b5", + "$ei:f5", + "$ei:g#5", + "$dqu:a5", + "$dqu:g#5", + "$qu:e5", + + "$ei:a4/f#3", + "$ei:e5", + "$ei:f#5/f#3", + "$si:a4/d4/a3", + "$si:e5", + "$ei:f#5/f#3", + "$ei:g#5", + "$ei:b4/f#3", + "$ei:f#5", + "$dei:g#5", + "$dei:a5", + "$ei:b5", + + "$dsi:g#3", + "$tsi:g5", + "$ei:g#5", + "$ei:f#5/g#3", + "$ei:g#5", + "$ei:f5/g#3", + "$ei:g#5", + "$ei:c#6/g#3", + "$ei:f5", + "$ei:g#5/g#3", + "$ei:c#6", + "$ei:f5/g#3", + "$ei:g#5", + "$dqu:b5", + ".967:a5" # half + eighth note +); + +# verse 2 +push @notes, ( + "$ei:a4/f#4", + "$ei:e5/a4", + "$ei:f#5/d5", + "$si:a4/d3", + "$si:c#5", + "$ei:f#5/c#5", + "$ei:g#5/e5", + "$ei:b4/f#4", + "$ei:g#5/e5", + "$ha:a5/e5/b4", + + "$si:c#4", + "$tsi:b3", + "$tsi:g5", + "$ei:g#5/e5", + "$ei:e5/b4", + "$ei:b4/g#4", + "$ei:g#4", + "$ei:c#5/g#4", + "$ei:e5/c#5", + "$si:b4/g#3", + "$si:c#5/c#4", + "$ei:f5/c#5", + "$ei:b5/f5", + "$ei:f5/c#5", + "$ei:g#5/f5", + "$dqu:a5/f#5", + "$dqu:g#5/e5", + "$qu:e5/b4", + + "$ei:a4/f#4", + "$ei:e5/c#5", + "$ei:f#5/d5", + "$si:a4/f#3", + "$si:e5/a3", + "$ei:f#5/d5", + "$ei:g#5/e5", + "$ei:b4/g#4", + "$ei:f#5/d5", + "$dei:g#5/e5", + "$dei:a5/f#5", + "$ei:b5/g#5", + + "$dsi:g#3", + "$tsi:g5", + "$ei:g#5/e5", + "$ei:f#5/c#5", + "$ei:g#5/e5", + "$ei:f5/c#5", + "$ei:g#5/f5", + "$ei:c#6/g#5", + "$ei:f5/c#5", + "$ei:g#5/f5", + "$ei:c#6/g#5", + "$ei:f5/c#5", + "$ei:g#5/f5", + "$dqu:b5/g#5", + ".967:a5/f#5" +); + +# verse 3 +push @notes, ( + "$qu:g4/d#4/a#3/g3", + "$ei:d5/g4/d#4", + "$ei:d5/a#3", + "$ei:c5/f3", + "$ei:c5/c4/a3", + "$ei:c5", + "$ei:c5" +); +sub verse3common1 { + push @notes, ( + "$dei:g4/d4/a#3/g3/d3", + "$dei:c5", + "$ei:d5", + "$dei:f5", + "$dei:d5", + "$ei:c5", + + "$qu:g4", + "$qu:d5", + "$ei:c5/f3", + "$ei:c5/c3", + "$ei:c5/a3/f3", + "$ei:c5/a3/f3" + ) +} +verse3common1(); +push @notes, ( + "$dei:g4", + "$dei:c5", + "$ei:d5/g3", + "$si:g5/a#3/g3", + "$si:f5/d4", + "$si:g5/g3", + "$si:f5", + "$ei:d5/d4/a#3/g3", + "$ei:a#4/g3/d3", + + "$qu:g4", + "$ei:d5/g4/d#4", + "$ei:d5/a#3", + "$ei:c5/f3", + "$ei:c5/c4/a3", + "$ei:c5", + "$ei:c5" +); +verse3common1(); +push @notes, ( + "$dei:g4", + "$dei:c5", + "$ei:d5/g3", + "$dei:g5", + "$dei:g6", + "$ei:d6/d4/a#3/g3" +); +sub verse3common2 { + push @notes, ( + "$qu:g4/d#4", + "$ei:d5/a#4/d#3", + "$ei:d5/a#4", + "$ei:c5/a4/f3", + "$ei:c5/a4", + "$ei:c5/a4/f3", + "$ei:c5/a4", + + "$dei:g4/d4", + "$dei:c5/g4", + "$ei:d5/a#4", + "$dei:f5/d5", + "$dei:d5/a#4", + "$ei:c5/g4", + + "$qu:g4/d#4", + "$qu:d5/a#4", + "$ei:c5/a4/f3", + "$ei:c5/a4", + "$ei:c5/a4/f3", + "$ei:c5/a4" + ) +} +verse3common2(); +push @notes, ( + "$dei:g4/d4", + "$dei:c5/g4", + "$ei:d5/a#4", + "$si:g5/d5", + "$si:f5", + "$si:g5/d5/a#3/g3", + "$si:f5", + "$ei:d5/a#4", + "$ei:a#4/g4" +); +verse3common2(); +push @notes, ( + "$dei:g4", + "$dei:c5", + "$ei:d5", + "$dei:g5", + "$dei:g6", + "$ei:d6" +); + +# verse 4 +push @notes, ( + "$ei:f#4/f#3", + "$ei:c#5", + "$ei:d#5/f#3", + "$si:f#4/d#4/b3", + "$si:a#4", + "$ei:d#5/f#3", + "$ei:f5", + "$ei:g#4/f#3", + "$ei:f5", + "$ha:f#5/c#5", + + "$dsi:g#3", + "$tsi:e5", + "$ei:f5", + "$ei:c#5", + "$ei:g#4", + + "$ei:f4/f3", + "$ei:a#4", + "$ei:c#5/f3", + "$si:g#4/c#4/a#3", + "$si:a#4", + "$ei:d5/f3", + "$ei:g#5", + "$ei:d5", + "$ei:f5", + "$dqu:f#5", + "$dqu:f5", + "$qu:c#5", + + "$ei:f#4/d#3", + "$ei:c#5", + "$ei:d#5/d#3", + "$si:f#4/b3/f#3", + "$si:c#5", + "$ei:d#5/d#3", + "$ei:f5", + "$ei:g#4/d#3", + "$ei:d#5", + "$dei:f5", + "$dei:f#5", + "$ei:g#5", + + "$dsi:f3", + "$tsi:e5", + "$ei:f5", + "$ei:d#5", + "$ei:f5", + + "$ei:d5/f3", + "$ei:f5", + "$ei:a#5/f3", + "$ei:d5", + "$ei:f5/f3", + "$ei:a#5", + "$ei:d5/f3", + "$ei:f5", + "$dqu:g#5", + ".967:f#5", + + "$ei:f#4/d#4", + "$ei:c#5/f#4", + "$ei:d#5/b4", + "$si:f#4/b3", + "$si:a#4/d#3", + "$ei:d#5/a#4", + "$ei:f5/c#5", + "$ei:g#4/d#4", + "$ei:f5/c#5", + "$ha:f#5/c#5/g#4", + + "$si:a#3", + "$tsi:c#3", + "$tsi:e5", + "$ei:f5/c#5", + "$ei:c#5/g#4", + "$ei:g#4/f4", + + "$ei:f4", + "$ei:a#4/f4", + "$ei:c#5/a#4", + "$si:g#4/f3", + "$si:a#4/a#3", + "$ei:d5/a#4", + "$ei:g#5/d5", + "$ei:d5/a#4", + "$ei:f5/d5", + "$dqu:f#5/d#5", + "$dqu:f5/c#5", + "$qu:c#5/g#4", + + "$ei:f#4/d#4", + "$ei:c#5/a#4", + "$ei:d#5/b4", + "$si:f#4/d#3", + "$si:c#5/f#3", + "$ei:d#5/b4", + "$ei:f5/c#5", + "$ei:g#4/f4", + "$ei:d#5/b4", + "$dei:f5/c#5", + "$dei:f#5/d#5", + "$ei:g#5/f5", + + "$si:f3", + "$tsi:g#3", + "$tsi:e5", + "$ei:f5/c#5", + "$ei:d#5/a#4", + "$ei:f5/c#5", + + "$ei:d5/a#4", + "$ei:f5/d5", + "$ei:a#5/f5", + "$ei:d5/a#4", + "$ei:f5/d5", + "$ei:a#5/f5", + "$ei:d5/a#4", + "$ei:f5/d5", + "$dqu:g#5/f5", + ".967:f#5/d#5" +); + +# verse 5 +push @notes, ( + "$qu:e4/c4/c3", + "$ei:b4/g4", + "$ei:b4/g4", + "$ei:a4/f#4/d3", + "$ei:a4/f#4/d3", + "$ei:a4/f#4/f#3", + "$ei:a4/f#4/d3", + + "$dei:e4/b3", + "$dei:a4/e4", + "$ei:b4/g4", + "$dei:b6/b5/d5/b4", + "$dei:b4/g4", + "$ei:a4/e4", + + "$qu:e4/c4", + "$qu:b4/g4/e3/c3", + "$ei:a6/a5/a4/f#4/d4/a3", + "$ei:a4/f#4/d4/a3", + "$ei:d6/a4/f#4/d4/a3", + "$ei:a4/f#4/d4/a3", + + "$dei:f#6/f#5/e4/b3", + "$dei:g6/g5/a4/e4", + "$ei:a6/a5/b4/g4", + "$dei:g6/g5", + "$dei:f#6/f#5", + "$ei:b5/b4/g4/e4", + + "$qu:e4/b3", + "$ei:b4/g4", + "$ei:b4/g4", + "$ei:a4/f#4", + "$ei:a4/f#4", + "$ei:a4/f#4", + "$ei:a4/f#4", + + "$dei:e4/b3", + "$dei:a4/e4", + "$ei:b4/g4/g3/e3", + "$dei:d5/b4", + "$dei:b4/g4/g3/e3", + "$ei:a4/e4/g3/e3", + + "$qu:e4/c4/e3/c3/g2", + "$qu:b6/b5/b4/g4/c4", + "$ei:a4/f#4/a3", + "$ei:a4/f#4/a3", + "$ei:a6/a5/a4/f#4/a3", + "$ei:a4/f#4/a3", + + "$dei:g6/g5/b4/e4", + "$dei:a6/a5/e5/a4", + "$ei:b6/b5/g5/b4", + "$ei:e6/b5/e5" +); +push (@notes, "$si:e3/e2"); +silence("$si"); +push (@notes, "$si:e3/e2"); +silence("$si"); +push (@notes, "$si:e3/e2"); +silence("$si"); + +# verse 6 which is almost like intro +ee4h("b", "f#", "d", 3, 3, 3, 2); +push (@notes, "$qu:b4/f#4/d4"); +ee4h("a", "f#", "d", 3, 3, 3, 2); +push (@notes, "$qu:a4/f#4/d4"); +push @notes, ( + "$dei:g#4/e4", + "$dei:a4/e4", + "$ei:g#4/e4", + "$ha:f#4/c#4" +); +ee4h("b", "f#", "d", 3, 3, 3, 2); +push @notes, ( + "$ei:f#4/c#4", + "$ei:a4/e4", + "$ei:b4/f#4/a3/f#3", + "$ei:c#5/f#4/a3/f#3", + "$qu:a4/f#4", + "$dei:g#4/e4", + "$dei:a4/f#4", + "$ei:b4/g#4", + "$ha:c#5/a#4/f#4/c#4" +); +ee4h("e", "b", "g", 4, 3, 3, 3); +push (@notes, "$qu:g5/e5/b4/g4"); +ee4h("d", "b", "g", 4, 3, 3, 3); +push (@notes, "$qu:g5/d5/b4/g4"); +push @notes, ( + "$dei:c#5/a4", + "$dei:d5/a4", + "$ei:c#5/a4", + "$ha:b4/f#4", +); +ee4h("e", "b", "g", 4, 3, 3, 3); +push @notes, ( + "$ei:e5/b4/f#4", + "$ei:e5/d4/a4", + "$ei:e5/b4/d4/b3/g3/d3", + "$ei:f#5/b4/d4/b3/g3/d3", + "$qu:d5/b4/f#4", + "$dei:c#5/a4/e4", + "$dei:d5/b4/f#4", + "$ei:e5/c#5/a4", + "$ha:f#5/d#5/b4/f#4", +); + +# verse 7 which is almost like verse 1 +push @notes, ( + "$ei:a4/a2", + "$ei:e5", + "$ei:f#5/a2", + "$si:a4/a3/f#3/d4", + "$si:c#5", + "$ei:f#5/a2", + "$ei:g#5", + "$ei:b4/a2", + "$ei:g#5", + "$ha:a5/e5", + + "$dsi:b2", + "$tsi:g5", + "$ei:g#5", + "$ei:e5", + "$ei:b4", + + "$ei:g#4/g#2", + "$ei:c#5", + "$ei:e5/g#2", + "$si:b4/g#3/e3/c#3", + "$si:c#5", + "$ei:f5/g#2", + "$ei:b5", + "$ei:f5", + "$ei:g#5", + "$dqu:a5", + "$dqu:g#5", + "$qu:e5", + + "$ei:a4/f#2", + "$ei:e5", + "$ei:f#5/f#2", + "$si:a4/f#3/d3/a2", + "$si:e5", + "$ei:f#5/f#2", + "$ei:g#5", + "$ei:b4/f#2", + "$ei:f#5", + "$dei:g#5", + "$dei:a5", + "$ei:b5", + + "$dsi:g#2", + "$tsi:g5", + "$ei:g#5", + "$ei:f#5/g#2", + "$ei:g#5", + "$ei:f5/g#2", + "$ei:g#5", + "$ei:c#6/g#2", + "$ei:f5", + "$ei:g#5/g#2", + "$ei:c#6", + "$ei:f5/g#2", + "$ei:g#5", + "$dqu:b5", + ".967:a5" +); + +# verse 8 which is almost like verse 2 +push @notes, ( + "$ei:a4/f#4/a2", + "$ei:e5/a4", + "$ei:f#5/d5/a2", + "$si:a4/a3/f#3/d3", + "$si:c#5", + "$ei:f#5/c#5/a2", + "$ei:g#5/e5", + "$ei:b4/f#4/a2", + "$ei:g#5/e5", + "$ha:a5/e5/b4", + + "$dsi:b2", + "$tsi:g5", + "$ei:g#5/e5", + "$ei:e5/b4", + "$ei:b4/g#4", + + "$ei:g#4/g#2", + "$ei:c#5/g#4", + "$ei:e5/c#5/g#2", + "$si:b4/g#3/e3/c#3", + "$si:c#5", + "$ei:f5/c#5/g#2", + "$ei:b5/f5", + "$ei:f5/c#5", + "$ei:g#5/f5", + "$dqu:a5/f#5", + "$dqu:g#5/e5", + "$qu:e5/b4", + + "$ei:a4/f#4/f#2", + "$ei:e5/c#5", + "$ei:f#5/d5/f#2", + "$si:a4/f#3/d3/a2", + "$si:e5", + "$ei:f#5/d5/f#2", + "$ei:g#5/e5", + "$ei:b4/g#4/f#2", + "$ei:f#5/d5", + "$dei:g#5/e5", + "$dei:a5/f#5", + "$ei:b5/g#5", + + "$dsi:g#2", + "$tsi:g5", + "$ei:g#5/e5", + "$ei:f#5/c#5/g#2", + "$ei:g#5/e5", + "$ei:f5/c#5/g#2", + "$ei:g#5/f5", + "$ei:c#6/g#5/g#2", + "$ei:f5/c#5", + "$ei:g#5/f5/g#2", + "$ei:c#6/g#5", + "$ei:f5/c#5/g#2", + "$ei:g#5/f5", + "$dqu:b5/g#5", + ".967:a5/f#5" +); + +# verse 9 which is a higher pitched verse 3 +push @notes, ( + "$qu:g5/d#5/d#4/a#4/g4", + "$ei:d6/a#5/g4/d#4", + "$ei:d6/a#5/a#3", + "$ei:c6/a5/f3", + "$ei:c6/a5/c4/a3", + "$ei:c6/a5", + "$ei:c6/a5", +); +sub verse9common1 { + push @notes, ( + "$dei:g5/d5", + "$dei:c6/g5", + "$ei:d6/a#5", + "$dei:f6/d6", + "$dei:d6/a#5", + "$ei:c6/g5" + ); +} +verse9common1(); +push @notes, ( + "$qu:g5/d#5", + "$qu:d6/a#5", + "$ei:c6/a5/f5/c5/f3", + "$ei:c6/a5/f5/c5/c3", + "$ei:c6/a5/f5/c5/a3/f3", + "$ei:c6/a5/f5/c5/a3/f3", + + "$dei:g5/d5", + "$dei:c6/g5", + "$ei:d6/a#5/g3", + "$si:g6/d6/a#3", + "$si:f6/d4", + "$si:g6/d6", + "$si:f6", + "$ei:d6/a#5/d4/a#3/g3", + "$ei:a#5/g5/g3/d3", + + "$qu:g5/d5", + "$ei:d6/a#5/g4/d#4", + "$ei:d6/a#5/a#3", + "$ei:c6/a5/f3", + "$ei:c6/a5/c4/a3", + "$ei:c6/a5", + "$ei:c6/a5" +); +verse9common1(); +push @notes, ( + "$qu:g5/d#5/g4", + "$qu:d6/a#5/d#5", + "$ei:c6/a5/c5/f3", + "$ei:c6/a5/c5/c3", + "$ei:c6/a5/c5/a3/f3", + "$ei:c6/a5/c5/a3/f3", + + "$dei:d6/g6", + "$dei:g6/c6", + "$ei:a#6/d6/g3", + "$ha:g6/d6", + + "$qu:g4/d#4/d#3", + "$ei:d5/a#4", + "$ei:d5/a#4", + "$ei:c5/a4/f3", + "$ei:c5/a4/f3", + "$ei:c5/a4/a3", + "$ei:c5/a4/f3", + + "$dei:g4/d4", + "$dei:c5/g4", + "$ei:d5/a#4", + "$dei:d6/f5/d5", + "$dei:d5/a#4", + "$ei:c5/g4", + + "$qu:g4/d#4", + "$qu:d5/a#4/g3/d#3", + "$ei:c6/c5/a4/f4/c4", + "$ei:c5/a4/f4/c4", + "$ei:f6/c5/a4/f4/c4", + "$ei:c5/a4/f4/c4", + + "$dei:a6/a5/g4/d4", + "$dei:a#6/a#5/c5/g4", + "$ei:c6/d5/a#4", + "$dei:a#6/a#5", + "$dei:a6/a5", + "$ei:d6/d5", + + "$qu:g4/d#4", + "$ei:d5/a#4", + "$ei:d5/a#4", + "$ei:c5/a4", + "$ei:c5/a4", + "$ei:c5/a4", + "$ei:c5/a4", + + "$dei:g4/d4", + "$dei:c5/g4", + "$ei:d5/a#4/a#3/g3", + "$dei:f5/d5", + "$dei:d5/a#4", + "$ei:c5/g4/a#3/g3", + + "$qu:g4/d#4/g3/d#3/a#2", + "$qu:d6/d5/a#4/d#4", + "$ei:c5/a4/c4", + "$ei:c5/a4/c4", + "$ei:c6/c5/a4/c4", + "$ei:c5/a4/c4", + + "$dei:a#6/a#5/d5/g4", + "$dei:c6/g5/c5", + "$ei:d6/a#5/d5", + "$ei:g6/d6/g5" +); +push (@notes, "$si:g3/g2"); +silence("$si"); +push (@notes, "$si:g3/g2"); +silence("$si"); +push (@notes, "$si:g3/g2"); +silence("$si"); + +createSynths();