Initial commit

Debut arranges: Bad Apple!!, The Rabbit Has Landed
This commit is contained in:
Job Bautista 2022-04-27 22:01:42 +08:00
commit 77c69653e8
8 changed files with 1761 additions and 0 deletions

19
LICENSE Normal file
View File

@ -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.

111
README Normal file
View File

@ -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.

130
SoXMusicGen.pm Normal file
View File

@ -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;

8
bad-apple/art.txt Normal file
View File

@ -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

339
bad-apple/piano-ver.pl Executable file
View File

@ -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();

343
bad-apple/synths-only.pl Executable file
View File

@ -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();

11
rabbit-has-landed/art.txt Normal file
View File

@ -0,0 +1,11 @@
___ ___ __ __ __ ___
| |__| |__ |__) /\ |__) |__) | |
| | | |___ | \ /~~\ |__) |__) | |
__ __ ___ __
|__| /\ /__` | /\ |\ | | \ |__ | \
| | /~~\ .__/ |___ /~~\ | \| |__/ |___ |__/
The Rabbit Has Landed
Composed by ZUN for Touhou Kanjuden: Legacy of Lunatic Kingdom
Arranged by Job Bautista

View File

@ -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();