From 6485746ee95310999a895fcbac123794d79b320d Mon Sep 17 00:00:00 2001 From: Gary Scavone Date: Tue, 24 Mar 2009 22:41:14 -0400 Subject: [PATCH] Version 0.99 --- ADSR.cpp | 173 +++++++++++++++++++ ADSR.h | 43 +++++ AgogoBel.cpp | 75 ++++++++ AgogoBel.h | 26 +++ AllPass1.cpp | 39 +++++ AllPass1.h | 24 +++ BeeThree.cpp | 71 ++++++++ BeeThree.h | 23 +++ BiQuad.cpp | 80 +++++++++ BiQuad.h | 31 ++++ BowTabl.cpp | 46 +++++ BowTabl.h | 22 +++ Bowed.cpp | 160 +++++++++++++++++ Bowed.h | 56 ++++++ Brass.cpp | 129 ++++++++++++++ Brass.h | 53 ++++++ Clarinet.cpp | 125 ++++++++++++++ Clarinet.h | 53 ++++++ DCBlock.cpp | 41 +++++ DCBlock.h | 25 +++ DLineA.cpp | 104 +++++++++++ DLineA.h | 41 +++++ DLineL.cpp | 90 ++++++++++ DLineL.h | 33 ++++ DLineN.cpp | 80 +++++++++ DLineN.h | 30 ++++ DrumSynt.cpp | 164 ++++++++++++++++++ DrumSynt.h | 37 ++++ Envelope.cpp | 113 ++++++++++++ Envelope.h | 40 +++++ FM4Alg3.cpp | 51 ++++++ FM4Alg3.h | 29 ++++ FM4Alg4.cpp | 48 ++++++ FM4Alg4.h | 29 ++++ FM4Alg5.cpp | 48 ++++++ FM4Alg5.h | 32 ++++ FM4Alg6.cpp | 54 ++++++ FM4Alg6.h | 35 ++++ FM4Alg8.cpp | 43 +++++ FM4Alg8.h | 33 ++++ FM4Op.cpp | 179 +++++++++++++++++++ FM4Op.h | 59 +++++++ FMVoices.cpp | 118 +++++++++++++ FMVoices.h | 24 +++ Filter.cpp | 24 +++ Filter.h | 28 +++ Flute.cpp | 172 ++++++++++++++++++ Flute.h | 64 +++++++ FormSwep.cpp | 170 ++++++++++++++++++ FormSwep.h | 45 +++++ HIERARCH.txt | 125 ++++++++++++++ HeavyMtl.cpp | 60 +++++++ HeavyMtl.h | 22 +++ Instrmnt.cpp | 35 ++++ Instrmnt.h | 25 +++ JetTabl.cpp | 36 ++++ JetTabl.h | 22 +++ Lacrymosa | 1 + LipFilt.cpp | 66 +++++++ LipFilt.h | 28 +++ MIDIInpt.cpp | 188 ++++++++++++++++++++ MIDIInpt.h | 48 ++++++ MIDIText.cpp | 133 ++++++++++++++ MIDIText.h | 46 +++++ Makefile | 247 ++++++++++++++++++++++++++ Mandolin.cpp | 116 +++++++++++++ Mandolin.h | 41 +++++ Marimba.cpp | 111 ++++++++++++ Marimba.h | 32 ++++ Modal4.cpp | 187 ++++++++++++++++++++ Modal4.h | 52 ++++++ Modulatr.cpp | 84 +++++++++ Modulatr.h | 36 ++++ Moog1.cpp | 108 ++++++++++++ Moog1.h | 34 ++++ NIFileIn.cpp | 163 +++++++++++++++++ NIFileIn.h | 47 +++++ NIWave1S.cpp | 119 +++++++++++++ NIWave1S.h | 34 ++++ Noise.cpp | 52 ++++++ Noise.h | 23 +++ Object.cpp | 29 ++++ Object.h | 91 ++++++++++ OnePole.cpp | 81 +++++++++ OnePole.h | 35 ++++ OneZero.cpp | 64 +++++++ OneZero.h | 35 ++++ PercFlut.cpp | 50 ++++++ PercFlut.h | 21 +++ PhonTabl.h | 189 ++++++++++++++++++++ Plucked.cpp | 84 +++++++++ Plucked.h | 40 +++++ Plucked2.cpp | 90 ++++++++++ Plucked2.h | 46 +++++ README.txt | 117 +++++++++++++ RawLoop.cpp | 155 +++++++++++++++++ RawLoop.h | 39 +++++ RawWave.cpp | 235 +++++++++++++++++++++++++ RawWave.h | 48 ++++++ RawWvIn.cpp | 163 +++++++++++++++++ RawWvIn.h | 47 +++++ RawWvOut.cpp | 115 ++++++++++++ RawWvOut.h | 60 +++++++ ReedTabl.cpp | 46 +++++ ReedTabl.h | 24 +++ Reverb.cpp | 187 ++++++++++++++++++++ Reverb.h | 41 +++++ Rhodey.cpp | 57 ++++++ Rhodey.h | 22 +++ SamplFlt.cpp | 48 ++++++ SamplFlt.h | 29 ++++ Sampler.cpp | 63 +++++++ Sampler.h | 42 +++++ SingWave.cpp | 239 +++++++++++++++++++++++++ SingWave.h | 51 ++++++ SubNoise.cpp | 52 ++++++ SubNoise.h | 25 +++ TCLSpecs/GUIPhysical | 2 + TCLSpecs/GUIPlukStruk | 2 + TCLSpecs/GUIVoice | 2 + TCLSpecs/MIDIPhysical | 2 + TCLSpecs/MIDIPlukStruk | 2 + TCLSpecs/MIDIVoice | 2 + TCLSpecs/TCLPhys.tcl | 136 +++++++++++++++ TCLSpecs/TCLStruk.tcl | 159 +++++++++++++++++ TCLSpecs/TCLVoice.tcl | 124 +++++++++++++ TCLSpecs/bitmaps/KASM.xbm | 117 +++++++++++++ TCLSpecs/bitmaps/KFMod.xbm | 117 +++++++++++++ TCLSpecs/bitmaps/KFiddl.xbm | 117 +++++++++++++ TCLSpecs/bitmaps/KFloot.xbm | 117 +++++++++++++ TCLSpecs/bitmaps/KHose.xbm | 117 +++++++++++++ TCLSpecs/bitmaps/KModal.xbm | 117 +++++++++++++ TCLSpecs/bitmaps/KPluk.xbm | 117 +++++++++++++ TCLSpecs/bitmaps/KVoicForm.xbm | 117 +++++++++++++ TCLSpecs/bitmaps/KVoiceFM.xbm | 117 +++++++++++++ TCLSpecs/bitmaps/Klar.xbm | 117 +++++++++++++ TCLSpecs/bitmaps/prc.xbm | 101 +++++++++++ TCLSpecs/bitmaps/prcFunny.xbm | 60 +++++++ TestAllNext | 65 +++++++ TestAllSGIRT | 30 ++++ ToDo.txt | 116 +++++++++++++ TubeBell.cpp | 53 ++++++ TubeBell.h | 21 +++ TwoPole.cpp | 61 +++++++ TwoPole.h | 28 +++ TwoZero.cpp | 53 ++++++ TwoZero.h | 27 +++ Vibraphn.cpp | 75 ++++++++ Vibraphn.h | 27 +++ Vocaliz | 1 + VoicForm.cpp | 228 ++++++++++++++++++++++++ VoicForm.h | 65 +++++++ VoicMang.cpp | 307 +++++++++++++++++++++++++++++++++ VoicMang.h | 69 ++++++++ Wurley.cpp | 53 ++++++ Wurley.h | 21 +++ miditabl.h | 17 ++ phonTabl.h | 189 ++++++++++++++++++++ rawwaves/MAKEFUNC.C | 55 ++++++ rawwaves/MAKEMIDI.C | 33 ++++ rawwaves/MAKEWAVS.C | 116 +++++++++++++ rawwaves/MIDITABL.H | 17 ++ rawwaves/ahh.raw | Bin 0 -> 184 bytes rawwaves/britestk.raw | Bin 0 -> 4096 bytes rawwaves/drumwavs/bass.raw | Bin 0 -> 4288 bytes rawwaves/drumwavs/cowbell.raw | Bin 0 -> 6438 bytes rawwaves/drumwavs/crash.raw | Bin 0 -> 40776 bytes rawwaves/drumwavs/hat.raw | Bin 0 -> 4976 bytes rawwaves/drumwavs/ride.raw | Bin 0 -> 32394 bytes rawwaves/drumwavs/snar.raw | Bin 0 -> 16660 bytes rawwaves/drumwavs/tamb.raw | Bin 0 -> 9240 bytes rawwaves/drumwavs/tomhi.raw | Bin 0 -> 27642 bytes rawwaves/drumwavs/tomlow.raw | Bin 0 -> 39200 bytes rawwaves/drumwavs/tommid.raw | Bin 0 -> 28292 bytes rawwaves/eee.raw | Bin 0 -> 184 bytes rawwaves/fwavblnk.raw | Bin 0 -> 512 bytes rawwaves/halfwave.raw | Bin 0 -> 512 bytes rawwaves/impuls10.raw | Bin 0 -> 512 bytes rawwaves/impuls20.raw | Bin 0 -> 512 bytes rawwaves/impuls40.raw | Bin 0 -> 512 bytes rawwaves/mandpluk.raw | Bin 0 -> 8900 bytes rawwaves/marmstk1.raw | Bin 0 -> 512 bytes rawwaves/ooo.raw | Bin 0 -> 184 bytes rawwaves/peksblnk.raw | Bin 0 -> 512 bytes rawwaves/ppksblnk.raw | Bin 0 -> 512 bytes rawwaves/silence.aiff | Bin 0 -> 518 bytes rawwaves/silence.raw | Bin 0 -> 448 bytes rawwaves/sineblnk.raw | Bin 0 -> 512 bytes rawwaves/sinewave.raw | Bin 0 -> 512 bytes rawwaves/snglpeak.raw | Bin 0 -> 512 bytes rawwaves/twopeaks.raw | Bin 0 -> 512 bytes scores/Instructions | 5 + scores/bookert.ski | 90 ++++++++++ scores/doogie.ski | 32 ++++ scores/duelingb.ski | 24 +++ scores/fiddle.ski | 111 ++++++++++++ scores/funicula.ski | 125 ++++++++++++++ scores/instructions | 29 ++++ scores/lacrymos.ski | 34 ++++ scores/mandtune.ski | 45 +++++ scores/misacrio.ski | 58 +++++++ scores/morazbel.ski | 43 +++++ scores/organs.ski | 221 ++++++++++++++++++++++++ scores/pictures.ski | 30 ++++ scores/riderson.ski | 63 +++++++ scores/simplgft.ski | 47 +++++ scores/spain.ski | 23 +++ scores/streetsf.ski | 56 ++++++ scores/thecars.ski | 38 ++++ scores/tstloops.sco | 60 +++++++ scores/tubebell.ski | 19 ++ scores/vocaliz.ski | 158 +++++++++++++++++ sgio.C | 58 +++++++ testMIDI.cpp | 71 ++++++++ testMono.cpp | 110 ++++++++++++ testMult.cpp | 87 ++++++++++ testTextIn.cpp | 187 ++++++++++++++++++++ textVoic.cpp | 80 +++++++++ 218 files changed, 13786 insertions(+) create mode 100644 ADSR.cpp create mode 100644 ADSR.h create mode 100644 AgogoBel.cpp create mode 100644 AgogoBel.h create mode 100644 AllPass1.cpp create mode 100644 AllPass1.h create mode 100644 BeeThree.cpp create mode 100644 BeeThree.h create mode 100644 BiQuad.cpp create mode 100644 BiQuad.h create mode 100644 BowTabl.cpp create mode 100644 BowTabl.h create mode 100644 Bowed.cpp create mode 100644 Bowed.h create mode 100644 Brass.cpp create mode 100644 Brass.h create mode 100644 Clarinet.cpp create mode 100644 Clarinet.h create mode 100644 DCBlock.cpp create mode 100644 DCBlock.h create mode 100644 DLineA.cpp create mode 100644 DLineA.h create mode 100644 DLineL.cpp create mode 100644 DLineL.h create mode 100644 DLineN.cpp create mode 100644 DLineN.h create mode 100644 DrumSynt.cpp create mode 100644 DrumSynt.h create mode 100644 Envelope.cpp create mode 100644 Envelope.h create mode 100644 FM4Alg3.cpp create mode 100644 FM4Alg3.h create mode 100644 FM4Alg4.cpp create mode 100644 FM4Alg4.h create mode 100644 FM4Alg5.cpp create mode 100644 FM4Alg5.h create mode 100644 FM4Alg6.cpp create mode 100644 FM4Alg6.h create mode 100644 FM4Alg8.cpp create mode 100644 FM4Alg8.h create mode 100644 FM4Op.cpp create mode 100644 FM4Op.h create mode 100644 FMVoices.cpp create mode 100644 FMVoices.h create mode 100644 Filter.cpp create mode 100644 Filter.h create mode 100644 Flute.cpp create mode 100644 Flute.h create mode 100644 FormSwep.cpp create mode 100644 FormSwep.h create mode 100644 HIERARCH.txt create mode 100644 HeavyMtl.cpp create mode 100644 HeavyMtl.h create mode 100644 Instrmnt.cpp create mode 100644 Instrmnt.h create mode 100644 JetTabl.cpp create mode 100644 JetTabl.h create mode 100755 Lacrymosa create mode 100644 LipFilt.cpp create mode 100644 LipFilt.h create mode 100644 MIDIInpt.cpp create mode 100644 MIDIInpt.h create mode 100644 MIDIText.cpp create mode 100644 MIDIText.h create mode 100644 Makefile create mode 100644 Mandolin.cpp create mode 100644 Mandolin.h create mode 100644 Marimba.cpp create mode 100644 Marimba.h create mode 100644 Modal4.cpp create mode 100644 Modal4.h create mode 100644 Modulatr.cpp create mode 100644 Modulatr.h create mode 100644 Moog1.cpp create mode 100644 Moog1.h create mode 100644 NIFileIn.cpp create mode 100644 NIFileIn.h create mode 100644 NIWave1S.cpp create mode 100644 NIWave1S.h create mode 100644 Noise.cpp create mode 100644 Noise.h create mode 100644 Object.cpp create mode 100644 Object.h create mode 100644 OnePole.cpp create mode 100644 OnePole.h create mode 100644 OneZero.cpp create mode 100644 OneZero.h create mode 100644 PercFlut.cpp create mode 100644 PercFlut.h create mode 100644 PhonTabl.h create mode 100644 Plucked.cpp create mode 100644 Plucked.h create mode 100644 Plucked2.cpp create mode 100644 Plucked2.h create mode 100644 README.txt create mode 100644 RawLoop.cpp create mode 100644 RawLoop.h create mode 100644 RawWave.cpp create mode 100644 RawWave.h create mode 100644 RawWvIn.cpp create mode 100644 RawWvIn.h create mode 100644 RawWvOut.cpp create mode 100644 RawWvOut.h create mode 100644 ReedTabl.cpp create mode 100644 ReedTabl.h create mode 100644 Reverb.cpp create mode 100644 Reverb.h create mode 100644 Rhodey.cpp create mode 100644 Rhodey.h create mode 100644 SamplFlt.cpp create mode 100644 SamplFlt.h create mode 100644 Sampler.cpp create mode 100644 Sampler.h create mode 100644 SingWave.cpp create mode 100644 SingWave.h create mode 100644 SubNoise.cpp create mode 100644 SubNoise.h create mode 100755 TCLSpecs/GUIPhysical create mode 100755 TCLSpecs/GUIPlukStruk create mode 100755 TCLSpecs/GUIVoice create mode 100755 TCLSpecs/MIDIPhysical create mode 100755 TCLSpecs/MIDIPlukStruk create mode 100755 TCLSpecs/MIDIVoice create mode 100644 TCLSpecs/TCLPhys.tcl create mode 100644 TCLSpecs/TCLStruk.tcl create mode 100644 TCLSpecs/TCLVoice.tcl create mode 100644 TCLSpecs/bitmaps/KASM.xbm create mode 100644 TCLSpecs/bitmaps/KFMod.xbm create mode 100644 TCLSpecs/bitmaps/KFiddl.xbm create mode 100644 TCLSpecs/bitmaps/KFloot.xbm create mode 100644 TCLSpecs/bitmaps/KHose.xbm create mode 100644 TCLSpecs/bitmaps/KModal.xbm create mode 100644 TCLSpecs/bitmaps/KPluk.xbm create mode 100644 TCLSpecs/bitmaps/KVoicForm.xbm create mode 100644 TCLSpecs/bitmaps/KVoiceFM.xbm create mode 100644 TCLSpecs/bitmaps/Klar.xbm create mode 100644 TCLSpecs/bitmaps/prc.xbm create mode 100644 TCLSpecs/bitmaps/prcFunny.xbm create mode 100755 TestAllNext create mode 100755 TestAllSGIRT create mode 100644 ToDo.txt create mode 100644 TubeBell.cpp create mode 100644 TubeBell.h create mode 100644 TwoPole.cpp create mode 100644 TwoPole.h create mode 100644 TwoZero.cpp create mode 100644 TwoZero.h create mode 100644 Vibraphn.cpp create mode 100644 Vibraphn.h create mode 100755 Vocaliz create mode 100644 VoicForm.cpp create mode 100644 VoicForm.h create mode 100644 VoicMang.cpp create mode 100644 VoicMang.h create mode 100644 Wurley.cpp create mode 100644 Wurley.h create mode 100644 miditabl.h create mode 100644 phonTabl.h create mode 100644 rawwaves/MAKEFUNC.C create mode 100644 rawwaves/MAKEMIDI.C create mode 100644 rawwaves/MAKEWAVS.C create mode 100644 rawwaves/MIDITABL.H create mode 100644 rawwaves/ahh.raw create mode 100644 rawwaves/britestk.raw create mode 100644 rawwaves/drumwavs/bass.raw create mode 100644 rawwaves/drumwavs/cowbell.raw create mode 100644 rawwaves/drumwavs/crash.raw create mode 100644 rawwaves/drumwavs/hat.raw create mode 100644 rawwaves/drumwavs/ride.raw create mode 100644 rawwaves/drumwavs/snar.raw create mode 100644 rawwaves/drumwavs/tamb.raw create mode 100644 rawwaves/drumwavs/tomhi.raw create mode 100644 rawwaves/drumwavs/tomlow.raw create mode 100644 rawwaves/drumwavs/tommid.raw create mode 100644 rawwaves/eee.raw create mode 100644 rawwaves/fwavblnk.raw create mode 100644 rawwaves/halfwave.raw create mode 100644 rawwaves/impuls10.raw create mode 100644 rawwaves/impuls20.raw create mode 100644 rawwaves/impuls40.raw create mode 100644 rawwaves/mandpluk.raw create mode 100644 rawwaves/marmstk1.raw create mode 100644 rawwaves/ooo.raw create mode 100644 rawwaves/peksblnk.raw create mode 100644 rawwaves/ppksblnk.raw create mode 100644 rawwaves/silence.aiff create mode 100644 rawwaves/silence.raw create mode 100644 rawwaves/sineblnk.raw create mode 100644 rawwaves/sinewave.raw create mode 100644 rawwaves/snglpeak.raw create mode 100644 rawwaves/twopeaks.raw create mode 100644 scores/Instructions create mode 100644 scores/bookert.ski create mode 100644 scores/doogie.ski create mode 100644 scores/duelingb.ski create mode 100644 scores/fiddle.ski create mode 100644 scores/funicula.ski create mode 100644 scores/instructions create mode 100644 scores/lacrymos.ski create mode 100644 scores/mandtune.ski create mode 100644 scores/misacrio.ski create mode 100644 scores/morazbel.ski create mode 100644 scores/organs.ski create mode 100644 scores/pictures.ski create mode 100644 scores/riderson.ski create mode 100644 scores/simplgft.ski create mode 100644 scores/spain.ski create mode 100644 scores/streetsf.ski create mode 100644 scores/thecars.ski create mode 100644 scores/tstloops.sco create mode 100644 scores/tubebell.ski create mode 100644 scores/vocaliz.ski create mode 100644 sgio.C create mode 100644 testMIDI.cpp create mode 100644 testMono.cpp create mode 100644 testMult.cpp create mode 100644 testTextIn.cpp create mode 100644 textVoic.cpp diff --git a/ADSR.cpp b/ADSR.cpp new file mode 100644 index 0000000..f010ef7 --- /dev/null +++ b/ADSR.cpp @@ -0,0 +1,173 @@ +/*******************************************/ +/* ADSR Subclass of the Envelope Class, */ +/* by Perry R. Cook, 1995-96 */ +/* This is the traditional ADSR (Attack */ +/* Decay, Sustain, Release) ADSR. */ +/* It responds to simple KeyOn and KeyOff */ +/* messages, keeping track of it's state. */ +/* There are two tick (update value) */ +/* methods, one returns the value, and */ +/* other returns the state (0 = A, 1 = D, */ +/* 2 = S, 3 = R) */ +/*******************************************/ + +#include "ADSR.h" + +ADSR :: ADSR() : Envelope() +{ + target = 0.0; + value = 0.0; + attackRate = 0.001; + decayRate = 0.001; + sustainLevel = 0.5; + releaseRate = 0.01; + state = 0; +} + +ADSR :: ~ADSR() +{ + /* Nothing to do here */ +} + +void ADSR :: keyOn() +{ + target = 1.0; + rate = attackRate; + state = 0; +} + +void ADSR :: keyOff() +{ + target = 0.0; + rate = releaseRate; + state = 3; +} + +void ADSR :: setAttackRate(MY_FLOAT aRate) +{ + if (aRate < 0.0) { + printf("negative rates not allowed!!, correcting\n"); + attackRate = -aRate; + } + else attackRate = aRate; + attackRate = attackRate * RATE_NORM; /* SEE Object.h */ +} + +void ADSR :: setDecayRate(MY_FLOAT aRate) +{ + if (aRate < 0.0) { + printf("negative rates not allowed!!, correcting\n"); + decayRate = -aRate; + } + else decayRate = aRate; + decayRate = decayRate * RATE_NORM; /* SEE Object.h */ +} + +void ADSR :: setSustainLevel(MY_FLOAT aLevel) +{ + if (aLevel < 0.0 ) { + printf("Sustain level out of range!!, correcting\n"); + sustainLevel = 0.0; + } + else sustainLevel = aLevel; +} + +void ADSR :: setReleaseRate(MY_FLOAT aRate) +{ + if (aRate < 0.0) { + printf("negative rates not allowed!!, correcting\n"); + releaseRate = -aRate; + } + else releaseRate = aRate; + releaseRate = releaseRate * RATE_NORM; /* SEE Object.h */ +} + +void ADSR :: setAll(MY_FLOAT attRate, MY_FLOAT decRate, MY_FLOAT susLevel, MY_FLOAT relRate) +{ + this->setAttackRate(attRate); + this->setDecayRate(decRate); + this->setSustainLevel(susLevel); + this->setReleaseRate(relRate); +} + +void ADSR :: setTarget(MY_FLOAT aTarget) +{ + target = aTarget; + if (value < target) { + state = ATTACK; + this->setSustainLevel(target); + rate = attackRate; + } + if (value > target) { + this->setSustainLevel(target); + state = DECAY; + rate = decayRate; + } +} + +void ADSR :: setValue(MY_FLOAT aValue) +{ + state = SUSTAIN; + target = aValue; + value = aValue; + this->setSustainLevel(aValue); + rate = 0.0; +} + +MY_FLOAT ADSR :: tick() +{ + if (state==ATTACK) { + value += rate; + if (value >= target) { + value = target; + rate = decayRate; + target = sustainLevel; + state = DECAY; + } + } + else if (state==DECAY) { + value -= decayRate; + if (value <= sustainLevel) { + value = sustainLevel; + rate = 0.0; + state = SUSTAIN; + } + } + else if (state==RELEASE) { + value -= releaseRate; + if (value <= 0.0) { + value = 0.0; + state = 4; + } + } + return value; +} + +int ADSR :: informTick() +{ + this->tick(); + return state; +} + +MY_FLOAT ADSR :: lastOut() +{ + return value; +} + +/************ Test Main ************************/ +/* +void main() +{ + long i; + ADSR test; + + test.setAttackRate(0.15); + test.keyOn(); + while(test.informTick()==ATTACK) printf("%lf\n",test.tick()); + test.setDecayRate(0.1); + while (test.informTick()==DECAY) printf("%lf\n",test.lastOut()); + test.setReleaseRate(0.05); + test.keyOff(); + while(test.informTick()==RELEASE) printf("%lf\n",test.lastOut()); +} +*/ diff --git a/ADSR.h b/ADSR.h new file mode 100644 index 0000000..3783904 --- /dev/null +++ b/ADSR.h @@ -0,0 +1,43 @@ +/*******************************************/ +/* ADSR Subclass of the Envelope Class, */ +/* by Perry R. Cook, 1995-96 */ +/* This is the traditional ADSR (Attack */ +/* Decay, Sustain, Release) envelope. */ +/* It responds to simple KeyOn and KeyOff */ +/* messages, keeping track of it's state. */ +/* There are two tick (update value) */ +/* methods, one returns the value, and */ +/* other returns the state (0 = A, 1 = D, */ +/* 2 = S, 3 = R) */ +/*******************************************/ + +#if !defined(__ADSR_h) +#define __ADSR_h + +#include "Envelope.h" + +class ADSR : public Envelope +{ + protected: + MY_FLOAT attackRate; + MY_FLOAT decayRate; + MY_FLOAT sustainLevel; + MY_FLOAT releaseRate; + public: + ADSR(); + ~ADSR(); + void keyOn(); + void keyOff(); + void setAttackRate(MY_FLOAT aRate); + void setDecayRate(MY_FLOAT aRate); + void setSustainLevel(MY_FLOAT aLevel); + void setReleaseRate(MY_FLOAT aRate); + void setAll(MY_FLOAT attRate, MY_FLOAT decRate, MY_FLOAT susLevel, MY_FLOAT relRate); + void setTarget(MY_FLOAT aTarget); + void setValue(MY_FLOAT aValue); + MY_FLOAT tick(); + int informTick(); + MY_FLOAT lastOut(); +}; + +#endif diff --git a/AgogoBel.cpp b/AgogoBel.cpp new file mode 100644 index 0000000..a777eed --- /dev/null +++ b/AgogoBel.cpp @@ -0,0 +1,75 @@ +/*******************************************/ +/* AgogoBell SubClass of Modal4 Instrument*/ +/* by Perry R. Cook, 1995-96 */ +/* */ +/* Controls: CONTROL1 = stickHardness */ +/* CONTROL2 = strikePosition*/ +/* CONTROL3 = vibFreq */ +/* MOD_WHEEL= vibAmt */ +/*******************************************/ + +/* Modes measured from my Agogo Bell by FFT: */ +/* 360, 1470, 2401, 4600 */ + +#include "AgogoBel.h" + +AgogoBel :: AgogoBel() : Modal4() +{ + wave = new RawWave("rawwaves/britestk.raw"); + wave->normalize(); + wave->setRate(7.0); /* hardstick */ + this->setRatioAndReson(0, 1.00,0.999); /* Set our */ + this->setRatioAndReson(1, 4.08,0.999); /* resonances */ + this->setRatioAndReson(2,6.669,0.999); /* here */ + this->setRatioAndReson(3,-3725.0,0.999); /* (One fixed) */ + this->setFiltGain(0,0.07); /* And filter */ + this->setFiltGain(1,0.06); /* gains too */ + this->setFiltGain(2,0.04); + this->setFiltGain(3,0.02); + directGain = 0.3; +} + +AgogoBel :: ~AgogoBel() +{ + delete wave; +} + +void AgogoBel :: setStickHardness(MY_FLOAT hardness) +{ + stickHardness = hardness; /* To an approximation, */ + wave->setRate(3.0 + (8.0 * stickHardness)); /* hardness <-> center */ + masterGain = 1.0; /* freq and amplitude */ +} + +void AgogoBel :: setStrikePosition(MY_FLOAT position) +{ + MY_FLOAT temp,temp2; + temp2 = position * PI; + strikePosition = position; /* Hack only first */ + temp = sin(0.7 * temp2); /* three modes, */ + this->setFiltGain(0,0.08 * temp); /* leave the other */ + temp = sin(0.1 + (5.0 * temp2)); /* fixed. Why? */ + this->setFiltGain(1,0.07 * temp); /* So it doesn't */ + temp = sin(0.2 + (7.0 * temp2)); /* sound like a */ + this->setFiltGain(2,0.04 * temp); /* sample! */ +} + +void AgogoBel :: controlChange(int number, MY_FLOAT value) +{ +#if defined(_debug_) + printf("AgogoBel : ControlChange: Number=%i Value=%f\n",number,value); +#endif + if (number == MIDI_control1) + this->setStickHardness(value * NORM_7); + else if (number == MIDI_control2) + this->setStrikePosition(value * NORM_7); + else if (number == MIDI_control3) + vibr->setFreq((value * NORM_7 * 12.0)); + else if (number == MIDI_mod_wheel) + vibrGain = (value * NORM_7); + else if (number == MIDI_after_touch) + this->strike(value * NORM_7); + else { + printf("AgogoBel : Undefined Control Number!!\n"); + } +} diff --git a/AgogoBel.h b/AgogoBel.h new file mode 100644 index 0000000..a8c2656 --- /dev/null +++ b/AgogoBel.h @@ -0,0 +1,26 @@ +/*******************************************/ +/* AgogoBell SubClass of Modal4 Instrument*/ +/* by Perry R. Cook, 1995-96 */ +/* */ +/* Controls: CONTROL1 = stickHardness */ +/* CONTROL2 = strikePosition*/ +/* CONTROL3 = vibFreq */ +/* MOD_WHEEL= vibAmt */ +/*******************************************/ + +#if !defined(__AgogoBel_h) +#define __AgogoBel_h + +#include "Modal4.h" + +class AgogoBel : public Modal4 +{ + public: + AgogoBel(); + ~AgogoBel(); + void setStickHardness(MY_FLOAT hardness); + void setStrikePosition(MY_FLOAT position); + virtual void controlChange(int number, MY_FLOAT value); +}; + +#endif diff --git a/AllPass1.cpp b/AllPass1.cpp new file mode 100644 index 0000000..50281ee --- /dev/null +++ b/AllPass1.cpp @@ -0,0 +1,39 @@ +/*******************************************/ +/* 1st order allpass filter. */ +/* by Perry R. Cook, 1995-96 */ +/* A special case of the one pole */ +/* one zero filter. */ +/*******************************************/ + +#include "AllPass1.h" + +AllPass1 :: AllPass1() +{ + inputs = (MY_FLOAT *) malloc(MY_FLOAT_SIZE); + outputs = (MY_FLOAT *) malloc(MY_FLOAT_SIZE); + this->clear(); + +} + +AllPass1 :: ~AllPass1() +{ + free(inputs); + free(outputs); +} + +void AllPass1 :: clear() +{ + outputs[0] = 0.0; + inputs[0] = 0.0; + lastOutput = 0.0; +} + +MY_FLOAT AllPass1 :: tick(MY_FLOAT sample) +{ + outputs[0] = sample - inputs[0] + (0.99 * outputs[0]); + inputs[0] = sample; + lastOutput = outputs[0]; + return lastOutput; +} + + diff --git a/AllPass1.h b/AllPass1.h new file mode 100644 index 0000000..164679a --- /dev/null +++ b/AllPass1.h @@ -0,0 +1,24 @@ +/*******************************************/ +/* 1st order allpass filter. */ +/* by Perry R. Cook, 1995-96 */ +/* A special case of the one pole */ +/* one zero filter. */ +/*******************************************/ + +#include "Filter.h" + +#if !defined(__AllPass1_h) +#define __AllPass1_h + +#include "Filter.h" + +class AllPass1 : Filter +{ + public: + AllPass1(); + ~AllPass1(); + void clear(); + MY_FLOAT tick(MY_FLOAT sample); +}; + +#endif diff --git a/BeeThree.cpp b/BeeThree.cpp new file mode 100644 index 0000000..374d609 --- /dev/null +++ b/BeeThree.cpp @@ -0,0 +1,71 @@ +/******************************************/ +/* Hammond(OID) Organ Subclass */ +/* of Algorithm 8 (TX81Z) Subclass of */ +/* 4 Operator FM Synth */ +/* by Perry R. Cook, 1995-96 */ +/******************************************/ + +#include "BeeThree.h" + +BeeThree :: BeeThree() : FM4Alg8() +{ + this->loadWaves("rawwaves/sinewave.raw", + "rawwaves/sinewave.raw", + "rawwaves/sinewave.raw", + "rawwaves/sinewave.raw"); + this->setRatio(0,0.999); + this->setRatio(1,1.997); + this->setRatio(2,3.006); + this->setRatio(3,6.009); + gains[0] = __FM4Op_gains[95]; + gains[1] = __FM4Op_gains[95]; + gains[2] = __FM4Op_gains[99]; + gains[3] = __FM4Op_gains[95]; + adsr[0]->setAll(0.05,0.03,1.0,0.04); + adsr[1]->setAll(0.05,0.03,1.0,0.04); + adsr[2]->setAll(0.05,0.03,1.0,0.04); + adsr[3]->setAll(0.05,0.001,0.4,0.06); + twozero->setGain(0.1); +} + +BeeThree :: ~BeeThree() +{ + +} + +void BeeThree :: setFreq(MY_FLOAT frequency) +{ + baseFreq = frequency; + waves[0]->setFreq(baseFreq * ratios[0]); + waves[1]->setFreq(baseFreq * ratios[1]); + waves[2]->setFreq(baseFreq * ratios[2]); + waves[3]->setFreq(baseFreq * ratios[3]); +} + +MY_FLOAT BeeThree :: tick() +{ + MY_FLOAT temp; + if (modDepth > 0.0) { + temp = 1.0 + (modDepth * vibWave->tick() * 0.1); + waves[0]->setFreq(baseFreq * ratios[0] * temp); + waves[1]->setFreq(baseFreq * ratios[1] * temp); + waves[2]->setFreq(baseFreq * ratios[2] * temp); + waves[3]->setFreq(baseFreq * ratios[3] * temp); + } + lastOutput = FM4Alg8 :: tick(); + return lastOutput; +} + +void BeeThree :: noteOn(MY_FLOAT freq, MY_FLOAT amp) +{ + gains[0] = amp * __FM4Op_gains[95]; + gains[1] = amp * __FM4Op_gains[95]; + gains[2] = amp * __FM4Op_gains[99]; + gains[3] = amp * __FM4Op_gains[95]; + this->setFreq(freq); + this->keyOn(); +#if defined(_debug_) + printf("BeeThree : NoteOn: Freq=%lf Amp=%lf\n",freq,amp); +#endif +} + diff --git a/BeeThree.h b/BeeThree.h new file mode 100644 index 0000000..298572f --- /dev/null +++ b/BeeThree.h @@ -0,0 +1,23 @@ +/******************************************/ +/* HammondOid Organ Subclass */ +/* of Algorithm 8 (TX81Z) Subclass of */ +/* 4 Operator FM Synth */ +/* by Perry R. Cook, 1995-96 */ +/******************************************/ + +#if !defined(__BeeThree_h) +#define __BeeThree_h + +#include "FM4Alg8.h" + +class BeeThree : public FM4Alg8 +{ + public: + BeeThree(); + ~BeeThree(); + virtual void setFreq(MY_FLOAT frequency); + MY_FLOAT tick(); + virtual void noteOn(MY_FLOAT freq, MY_FLOAT amp); +}; + +#endif diff --git a/BiQuad.cpp b/BiQuad.cpp new file mode 100644 index 0000000..c03137a --- /dev/null +++ b/BiQuad.cpp @@ -0,0 +1,80 @@ +/*******************************************/ +/* BiQuad (2-pole, 2-zero) Filter Class, */ +/* by Perry R. Cook, 1995-96 */ +/* See books on filters to understand */ +/* more about how this works. Nothing */ +/* out of the ordinary in this version. */ +/*******************************************/ + +#include "BiQuad.h" + +BiQuad :: BiQuad() : Filter() +{ + inputs = (MY_FLOAT *) malloc(2 * MY_FLOAT_SIZE); + zeroCoeffs[0] = 0.0; + zeroCoeffs[1] = 0.0; + poleCoeffs[0] = 0.0; + poleCoeffs[1] = 0.0; + gain = 1.0; + this->clear(); +} + +BiQuad :: ~BiQuad() +{ + free(inputs); +} + +void BiQuad :: clear() +{ + inputs[0] = 0.0; + inputs[1] = 0.0; + lastOutput = 0.0; +} + +void BiQuad :: setPoleCoeffs(MY_FLOAT *coeffs) +{ + poleCoeffs[0] = coeffs[0]; + poleCoeffs[1] = coeffs[1]; +} + +void BiQuad :: setZeroCoeffs(MY_FLOAT *coeffs) +{ + zeroCoeffs[0] = coeffs[0]; + zeroCoeffs[1] = coeffs[1]; +} + +void BiQuad :: setFreqAndReson(MY_FLOAT freq, MY_FLOAT reson) +{ + poleCoeffs[1] = - (reson * reson); + poleCoeffs[0] = 2.0 * reson * cos(TWO_PI * freq / SRATE); +} + +void BiQuad :: setEqualGainZeroes() +{ + zeroCoeffs[1] = -1.0; + zeroCoeffs[0] = 0.0; +} + +void BiQuad :: setGain(MY_FLOAT aValue) +{ + gain = aValue; +} + +MY_FLOAT BiQuad :: tick(MY_FLOAT sample) /* Perform Filter Operation */ +{ /* Biquad is two pole, two zero filter */ + MY_FLOAT temp; /* Look it up in your favorite DSP text */ + + temp = sample * gain; /* Here's the math for the */ + temp += inputs[0] * poleCoeffs[0]; /* version which implements */ + temp += inputs[1] * poleCoeffs[1]; /* only 2 state variables. */ + + lastOutput = temp; /* This form takes */ + lastOutput += (inputs[0] * zeroCoeffs[0]); /* 5 multiplies and */ + lastOutput += (inputs[1] * zeroCoeffs[1]); /* 4 adds */ + inputs[1] = inputs[0]; /* and 3 moves */ + inputs[0] = temp; /* like the 2 state-var form*/ + + return lastOutput; + +} + diff --git a/BiQuad.h b/BiQuad.h new file mode 100644 index 0000000..b8178f2 --- /dev/null +++ b/BiQuad.h @@ -0,0 +1,31 @@ +/*******************************************/ +/* BiQuad (2-pole, 2-zero) Filter Class, */ +/* by Perry R. Cook, 1995-96 */ +/* See books on filters to understand */ +/* more about how this works. Nothing */ +/* out of the ordinary in this version. */ +/*******************************************/ + +#if !defined(__BiQuad_h) +#define __BiQuad_h + +#include "Filter.h" + +class BiQuad : public Filter +{ + protected: + MY_FLOAT poleCoeffs[2]; + MY_FLOAT zeroCoeffs[2]; + public: + BiQuad(); + ~BiQuad(); + void clear(); + void setPoleCoeffs(MY_FLOAT *coeffs); + void setZeroCoeffs(MY_FLOAT *coeffs); + void setGain(MY_FLOAT aValue); + void setFreqAndReson(MY_FLOAT freq, MY_FLOAT reson); + void setEqualGainZeroes(); + MY_FLOAT tick(MY_FLOAT sample); +}; + +#endif diff --git a/BowTabl.cpp b/BowTabl.cpp new file mode 100644 index 0000000..85538f6 --- /dev/null +++ b/BowTabl.cpp @@ -0,0 +1,46 @@ +/***********************************************/ +/* Simple Bow Table Object, after Smith */ +/* by Perry R. Cook, 1995-96 */ +/***********************************************/ + +#include "BowTabl.h" + +BowTabl :: BowTabl() +{ + offSet = 0.0; /* offset is a bias, really not needed unless */ + /* friction is different in each direction */ + slope = 0.1; /* controls width of friction pulse, */ + /* related to bowForce */ +} + +BowTabl :: ~BowTabl() +{ +} + +void BowTabl :: setOffset(MY_FLOAT aValue) +{ + offSet = aValue; +} + +void BowTabl :: setSlope(MY_FLOAT aValue) +{ + slope = aValue; +} + +MY_FLOAT BowTabl :: lookup(MY_FLOAT sample) /* Perform Table Lookup */ +{ /* sample is differential */ + /* string vs. bow velocity */ + MY_FLOAT input; + input = sample + offSet; /* add bias to sample */ + input *= slope; /* scale it */ + lastOutput = fabs(input) + 0.75; /* below min delta, friction = 1 */ + lastOutput = pow(lastOutput,-4.0); +// if (lastOutput < 0.0 ) lastOutput = 0.0; /* minimum friction is 0.0 */ + if (lastOutput > 1.0 ) lastOutput = 1.0; /* maximum friction is 1.0 */ + return lastOutput; +} + +MY_FLOAT BowTabl :: lastOut() +{ + return lastOutput; +} diff --git a/BowTabl.h b/BowTabl.h new file mode 100644 index 0000000..28c17f1 --- /dev/null +++ b/BowTabl.h @@ -0,0 +1,22 @@ +/***********************************************/ +/* Simple Bow Table Object, after Smith */ +/* by Perry R. Cook, 1995-96 */ +/***********************************************/ + +#include "Object.h" + +class BowTabl : public Object +{ + protected: + MY_FLOAT offSet; + MY_FLOAT slope; + MY_FLOAT lastOutput; + public: + BowTabl(); + ~BowTabl(); + void setOffset(MY_FLOAT aValue); + void setSlope(MY_FLOAT aValue); + MY_FLOAT lookup(MY_FLOAT sample); + MY_FLOAT lastOut(); +}; + diff --git a/Bowed.cpp b/Bowed.cpp new file mode 100644 index 0000000..8aeb046 --- /dev/null +++ b/Bowed.cpp @@ -0,0 +1,160 @@ +/******************************************/ +/* Bowed String model ala Smith */ +/* after McIntyre, Schumacher, Woodhouse */ +/* by Perry Cook, 1995-96 */ +/* */ +/* This is a waveguide model, and thus */ +/* relates to various Stanford Univ. */ +/* and possibly Yamaha and other patents.*/ +/* */ +/* Controls: CONTROL1 = bowPressure */ +/* CONTROL2 = bowPosition */ +/* CONTROL3 = vibrFreq */ +/* MOD_WHEEL= vibrGain */ +/* */ +/******************************************/ + +#include "Bowed.h" + +Bowed :: Bowed(MY_FLOAT lowestFreq) +{ + long length; + length = (long) (SRATE / lowestFreq + 1); + neckDelay = new DLineL(length); + length >> 1; + bridgeDelay = new DLineL(length); + bowTabl = new BowTabl; + reflFilt = new OnePole; + bodyFilt = new BiQuad; + vibr = new RawLoop("rawwaves/sinewave.raw"); + adsr = new ADSR; + vibrGain = 0.0; + + neckDelay->setDelay(100.0); + bridgeDelay->setDelay(29.0); + + bowTabl->setSlope(3.0); + + reflFilt->setPole(0.6 - (0.1 * RATE_NORM)); + reflFilt->setGain(0.95); + + bodyFilt->setFreqAndReson(500.0, 0.85); + bodyFilt->setEqualGainZeroes(); + bodyFilt->setGain(0.2); + + vibr->normalize(); + vibr->setFreq(6.12723); + + adsr->setAll(0.002,0.01,0.9,0.01); + + betaRatio = 0.127236; +} + +Bowed :: ~Bowed() +{ + delete neckDelay; + delete bridgeDelay; + delete bowTabl; + delete reflFilt; + delete bodyFilt; + delete vibr; + delete adsr; +} + +void Bowed :: clear() +{ + neckDelay->clear(); + bridgeDelay->clear(); +} + +void Bowed :: setFreq(MY_FLOAT frequency) +{ + baseDelay = (MY_FLOAT) SRATE / frequency - 4.0; /* delay - approx. filter delay */ + bridgeDelay->setDelay(baseDelay * betaRatio); /* bow to bridge length */ + neckDelay->setDelay(baseDelay * (1.0 - betaRatio)); /* bow to nut (finger) length */ +} + +void Bowed :: startBowing(MY_FLOAT amplitude, MY_FLOAT rate) +{ + adsr->setRate(rate); + adsr->keyOn(); + maxVelocity = 0.03 + (0.2 * amplitude); +} + +void Bowed :: stopBowing(MY_FLOAT rate) +{ + adsr->setRate(rate); + adsr->keyOff(); +} + +void Bowed :: noteOn(MY_FLOAT freq, MY_FLOAT amp) +{ + this->startBowing(amp,amp * 0.001); + this->setFreq(freq); +#if defined(_debug_) + printf("Bowed : NoteOn: Freq=%lf Amp=%lf\n",freq,amp); +#endif +} + +void Bowed :: noteOff(MY_FLOAT amp) +{ + this->stopBowing((1.0 - amp) * 0.005); +#if defined(_debug_) + printf("Bowed : NoteOff: Amp=%lf\n",amp); +#endif +} + +void Bowed :: setVibrato(MY_FLOAT amount) +{ + vibrGain = amount; +} + +MY_FLOAT Bowed :: tick() +{ + MY_FLOAT bowVelocity; + MY_FLOAT bridgeRefl=0,nutRefl=0; + MY_FLOAT newVel=0,velDiff=0,stringVel=0; + + bowVelocity = maxVelocity * adsr->tick(); + + bridgeRefl = -reflFilt->tick( + bridgeDelay->lastOut()); /* Bridge Reflection */ + nutRefl = -neckDelay->lastOut(); /* Nut Reflection */ + stringVel = bridgeRefl + nutRefl; /* Sum is String Velocity */ + velDiff = bowVelocity - stringVel; /* Differential Velocity */ + newVel = velDiff * bowTabl->lookup(velDiff); /* Non-Lin Bow Function */ + neckDelay->tick(bridgeRefl + newVel); /* Do string */ + bridgeDelay->tick(nutRefl + newVel); /* propagations */ + + if (vibrGain > 0.0) { + neckDelay->setDelay((baseDelay * (1.0 - betaRatio)) + + (baseDelay * vibrGain*vibr->tick())); + } + + lastOutput = bodyFilt->tick(bridgeDelay->lastOut()); + + return lastOutput; +} + +void Bowed :: controlChange(int number, MY_FLOAT value) +{ +#if defined(_debug_) + printf("Bowed : ControlChange: Number=%i Value=%f\n",number,value); +#endif + if (number == MIDI_control1) + bowTabl->setSlope(5.0 - (4.0 * value * NORM_7)); + else if (number == MIDI_control2) { + betaRatio = 0.027236 + (0.2 * value * NORM_7); + bridgeDelay->setDelay(baseDelay * betaRatio); /* bow to bridge length */ + neckDelay->setDelay(baseDelay * (1.0 - betaRatio)); /* bow to nut (finger) length */ + } + else if (number == MIDI_control3) + vibr->setFreq((value * NORM_7 * 12.0)); + else if (number == MIDI_mod_wheel) + vibrGain = (value * NORM_7 * 0.4); + else if (number == MIDI_after_touch) + adsr->setTarget(value * NORM_7); + else { + printf("Bowed : Undefined Control Number!!\n"); + } +} diff --git a/Bowed.h b/Bowed.h new file mode 100644 index 0000000..92d2174 --- /dev/null +++ b/Bowed.h @@ -0,0 +1,56 @@ +/******************************************/ +/* Bowed String model ala Smith */ +/* after McIntyre, Schumacher, Woodhouse */ +/* by Perry Cook, 1995-96 */ +/* */ +/* This is a waveguide model, and thus */ +/* relates to various Stanford Univ. */ +/* and possibly Yamaha and other patents.*/ +/* */ +/* Controls: CONTROL1 = bowPressure */ +/* CONTROL2 = bowPosition */ +/* CONTROL3 = vibrFreq */ +/* MOD_WHEEL= vibrGain */ +/* */ +/******************************************/ + +#if !defined(__Bowed_h) +#define __Bowed_h + +#include "Instrmnt.h" +#include "DLineL.h" +#include "BowTabl.h" +#include "OnePole.h" +#include "BiQuad.h" +#include "RawLoop.h" +#include "ADSR.h" + +class Bowed : public Instrmnt +{ + protected: + DLineL *neckDelay; + DLineL *bridgeDelay; + BowTabl *bowTabl; + OnePole *reflFilt; + BiQuad *bodyFilt; + RawLoop *vibr; + ADSR *adsr; + MY_FLOAT maxVelocity; + MY_FLOAT baseDelay; + MY_FLOAT vibrGain; + MY_FLOAT betaRatio; + public: + Bowed(MY_FLOAT lowestFreq); + ~Bowed(); + void clear(); + void startBowing(MY_FLOAT amplitude,MY_FLOAT rate); + void stopBowing(MY_FLOAT rate); + virtual void noteOn(MY_FLOAT freq, MY_FLOAT amp); + virtual void noteOff(MY_FLOAT amp); + virtual void setFreq(MY_FLOAT frequency); + void setVibrato(MY_FLOAT amount); + virtual void controlChange(int number, MY_FLOAT value); + virtual MY_FLOAT tick(); +}; + +#endif diff --git a/Brass.cpp b/Brass.cpp new file mode 100644 index 0000000..4f7e318 --- /dev/null +++ b/Brass.cpp @@ -0,0 +1,129 @@ +/******************************************/ +/* Waveguide Brass Instrument Model ala */ +/* Cook (TBone, HosePlayer) */ +/* by Perry R. Cook, 1995-96 */ +/* */ +/* This is a waveguide model, and thus */ +/* relates to various Stanford Univ. */ +/* and possibly Yamaha and other patents.*/ +/* */ +/* Controls: CONTROL1 = lipTension */ +/* CONTROL2 = slideLength */ +/* CONTROL3 = vibFreq */ +/* MOD_WHEEL= vibAmt */ +/******************************************/ + +#include "Brass.h" + +Brass :: Brass(MY_FLOAT lowestFreq) +{ + length = (long) (SRATE / lowestFreq + 1); + delayLine = new DLineA(length); + lipFilter = new LipFilt; + dcBlock = new DCBlock; + adsr = new ADSR; + adsr->setAll(0.02, 0.05, 1.0, 0.001); + vibr = new RawLoop("rawwaves/sinewave.raw"); + this->clear(); + + vibr->normalize(); + vibr->setFreq(6.137); + vibrGain = 0.05; /* breath periodic vibrato component */ +} + +Brass :: ~Brass() +{ + delete delayLine; + delete lipFilter; + delete dcBlock; + delete adsr; + delete vibr; +} + +void Brass :: clear() +{ + delayLine->clear(); + lipFilter->clear(); + dcBlock->clear(); +/* adsr->reset(); */ +} + +void Brass :: setFreq(MY_FLOAT frequency) +{ + slideTarget = ((MY_FLOAT) SRATE / frequency * 2.0) + 3.0; + /* fudge correction for filter delays */ + delayLine->setDelay(slideTarget); /* we'll play a harmonic */ + lipTarget = frequency; + lipFilter->setFreq(frequency); +} + +void Brass :: setLip(MY_FLOAT frequency) +{ + lipFilter->setFreq(frequency); +} + +void Brass :: startBlowing(MY_FLOAT amplitude,MY_FLOAT rate) +{ + adsr->setAttackRate(rate); + maxPressure = amplitude; + adsr->keyOn(); +} + +void Brass :: stopBlowing(MY_FLOAT rate) +{ + adsr->setReleaseRate(rate); + adsr->keyOff(); +} + +void Brass :: noteOn(MY_FLOAT freq, MY_FLOAT amp) +{ + this->setFreq(freq); + this->startBlowing(amp, amp * 0.001); +#if defined(_debug_) + printf("Brass : NoteOn: Freq=%lf Amp=%lf\n",freq,amp); +#endif +} + +void Brass :: noteOff(MY_FLOAT amp) +{ + this->stopBlowing(amp * 0.005); +#if defined(_debug_) + printf("Brass : NoteOff: Amp=%lf\n",amp); +#endif +} + +MY_FLOAT Brass :: tick() +{ + MY_FLOAT breathPressure; + + breathPressure = maxPressure * adsr->tick(); + breathPressure += vibrGain * vibr->tick(); + lastOutput = delayLine->tick( /* bore delay */ + dcBlock->tick( /* block DC */ + lipFilter->tick(0.3 * breathPressure, /* mouth input */ + 0.85 * delayLine->lastOut()))); /* and bore reflection */ + return lastOutput; +} + +void Brass :: controlChange(int number, MY_FLOAT value) +{ + MY_FLOAT temp; +#if defined(_debug_) + printf("Brass : ControlChange: Number=%i Value=%f\n",number,value); +#endif + if (number == MIDI_control1) { + temp = lipTarget * pow(4.0,(2.0*value*NORM_7) - 1.0); + this->setLip(temp); + } + else if (number == MIDI_control2) + delayLine->setDelay(slideTarget * (0.5 + (value * NORM_7))); + else if (number == MIDI_control3) + vibr->setFreq((value * NORM_7 * 12.0)); + else if (number == MIDI_mod_wheel) + vibrGain = (value * NORM_7 * 0.4); + else if (number == MIDI_after_touch) + adsr->setTarget(value * NORM_7); + else { + printf("Brass : Undefined Control Number!!\n"); + } +} diff --git a/Brass.h b/Brass.h new file mode 100644 index 0000000..c3b8635 --- /dev/null +++ b/Brass.h @@ -0,0 +1,53 @@ +/******************************************/ +/* Simple Brass Instrument Model ala */ +/* Cook (TBone, HosePlayer) */ +/* by Perry R. Cook, 1995-96 */ +/* */ +/* This is a waveguide model, and thus */ +/* relates to various Stanford Univ. */ +/* and possibly Yamaha and other patents.*/ +/* */ +/* Controls: CONTROL1 = lipTension */ +/* CONTROL2 = slideLength */ +/* CONTROL3 = vibFreq */ +/* MOD_WHEEL= vibAmt */ +/******************************************/ + +#if !defined(__Brass_h) +#define __Brass_h + +#include "Instrmnt.h" +#include "DLineA.h" +#include "LipFilt.h" +#include "DCBlock.h" +#include "ADSR.h" +#include "RawLoop.h" + +class Brass: public Instrmnt +{ + protected: + DLineA *delayLine; + LipFilt *lipFilter; + DCBlock *dcBlock; + ADSR *adsr; + RawLoop *vibr; + long length; + MY_FLOAT lipTarget; + MY_FLOAT slideTarget; + MY_FLOAT vibrGain; + MY_FLOAT maxPressure; + public: + Brass(MY_FLOAT lowestFreq); + ~Brass(); + void clear(); + virtual void setFreq(MY_FLOAT frequency); + void setLip(MY_FLOAT frequency); + void startBlowing(MY_FLOAT amplitude,MY_FLOAT rate); + void stopBlowing(MY_FLOAT rate); + virtual void noteOn(MY_FLOAT freq, MY_FLOAT amp); + virtual void noteOff(MY_FLOAT amp); + virtual void controlChange(int number, MY_FLOAT value); + virtual MY_FLOAT tick(); +}; + +#endif diff --git a/Clarinet.cpp b/Clarinet.cpp new file mode 100644 index 0000000..8e8df86 --- /dev/null +++ b/Clarinet.cpp @@ -0,0 +1,125 @@ +/******************************************/ +/* Waveguide Clarinet model ala Smith */ +/* after McIntyre, Schumacher, Woodhouse */ +/* by Perry Cook, 1995-96 */ +/* */ +/* This is a waveguide model, and thus */ +/* relates to various Stanford Univ. */ +/* and possibly Yamaha and other patents.*/ +/* */ +/* Controls: CONTROL1 = reedStiffns */ +/* CONTROL2 = noiseGain */ +/* CONTROL3 = vibFreq */ +/* MOD_WHEEL= vibAmt */ +/******************************************/ + +#include "Clarinet.h" + +Clarinet :: Clarinet(MY_FLOAT lowestFreq) +{ + length = (long) (SRATE / lowestFreq + 1); + delayLine = new DLineL(length); + reedTable = new ReedTabl; + reedTable->setOffset(0.7); + reedTable->setSlope(-0.3); + filter = new OneZero; + envelope = new Envelope; + noise = new Noise; + vibr = new RawLoop("rawwaves/sinewave.raw"); + vibr->normalize(); + vibr->setFreq(5.735); + outputGain = 1.0; + noiseGain = 0.2; + vibrGain = 0.1; +} + +Clarinet :: ~Clarinet() +{ + delete delayLine; + delete reedTable; + delete filter; + delete envelope; + delete noise; + delete vibr; +} + +void Clarinet :: clear() +{ + delayLine->clear(); + filter->tick(0.0); +} + +void Clarinet :: setFreq(MY_FLOAT frequency) +{ + delayLine->setDelay /* length - approx filter delay */ + ((SRATE / frequency) * 0.5 - 1.5); +} + +void Clarinet :: startBlowing(MY_FLOAT amplitude,MY_FLOAT rate) +{ + envelope->setRate(rate); + envelope->setTarget(amplitude); +} + +void Clarinet :: stopBlowing(MY_FLOAT rate) +{ + envelope->setRate(rate); + envelope->setTarget(0.0); +} + +void Clarinet :: noteOn(MY_FLOAT freq, MY_FLOAT amp) +{ + this->setFreq(freq); + this->startBlowing(0.55 + (amp * 0.30),amp * 0.005); + outputGain = amp + 0.001; +#if defined(_debug_) + printf("Clarinet : NoteOn: Freq=%lf Amp=%lf\n",freq,amp); +#endif +} + +void Clarinet :: noteOff(MY_FLOAT amp) +{ + this->stopBlowing(amp * 0.01); +#if defined(_debug_) + printf("Clarinet : NoteOff: Amp=%lf\n",amp); +#endif +} + +MY_FLOAT Clarinet :: tick() +{ + MY_FLOAT pressureDiff; + MY_FLOAT breathPressure; + + breathPressure = envelope->tick(); + breathPressure += breathPressure * + noiseGain * noise->tick(); + breathPressure += breathPressure * + vibrGain * vibr->tick(); + pressureDiff = filter->tick(delayLine->lastOut()); /* differential pressure */ + pressureDiff = (pressureDiff * -0.95) - breathPressure; /* of reflected and mouth */ + lastOutput = delayLine->tick(breathPressure + /* perform scattering */ + pressureDiff * reedTable->lookup(pressureDiff)); /* in economical way */ + lastOutput *= outputGain; + return lastOutput; +} + +void Clarinet :: controlChange(int number, MY_FLOAT value) +{ +#if defined(_debug_) + printf("Clarinet : ControlChange: Number=%i Value=%f\n",number,value); +#endif + if (number == MIDI_control1) + reedTable->setSlope(-0.44 + (0.26 * value * NORM_7)); + else if (number == MIDI_control2) + noiseGain = (value * NORM_7 * 0.4); + else if (number == MIDI_control3) + vibr->setFreq((value * NORM_7 * 12.0)); + else if (number == MIDI_mod_wheel) + vibrGain = (value * NORM_7 * 0.5); + else if (number == MIDI_after_touch) { + envelope->setValue(value * NORM_7); + } + else { + printf("Clarinet : Undefined Control Number!!\n"); + } +} diff --git a/Clarinet.h b/Clarinet.h new file mode 100644 index 0000000..d64aa3f --- /dev/null +++ b/Clarinet.h @@ -0,0 +1,53 @@ +/******************************************/ +/* Clarinet model ala Smith */ +/* after McIntyre, Schumacher, Woodhouse */ +/* by Perry Cook, 1995-96 */ +/* */ +/* This is a waveguide model, and thus */ +/* relates to various Stanford Univ. */ +/* and possibly Yamaha and other patents.*/ +/* */ +/* Controls: CONTROL1 = reedStiffns */ +/* CONTROL2 = noiseGain */ +/* CONTROL3 = vibFreq */ +/* MOD_WHEEL= vibAmt */ +/******************************************/ + +#if !defined(__Clarinet_h) +#define __Clarinet_h + +#include "Instrmnt.h" +#include "DLineL.h" +#include "ReedTabl.h" +#include "OneZero.h" +#include "Envelope.h" +#include "Noise.h" +#include "RawLoop.h" + +class Clarinet : public Instrmnt +{ + protected: + DLineL *delayLine; + ReedTabl *reedTable; + OneZero *filter; + Envelope *envelope; + Noise *noise; + RawLoop *vibr; + long length; + MY_FLOAT outputGain; + MY_FLOAT noiseGain; + MY_FLOAT vibrGain; + public: + Clarinet(MY_FLOAT lowestFreq); + ~Clarinet(); + void clear(); + virtual void setFreq(MY_FLOAT frequency); + void startBlowing(MY_FLOAT amplitude,MY_FLOAT rate); + void stopBlowing(MY_FLOAT rate); + virtual void noteOn(MY_FLOAT freq, MY_FLOAT amp); + virtual void noteOff(MY_FLOAT amp); + virtual MY_FLOAT tick(); + virtual void controlChange(int number, MY_FLOAT value); +}; + +#endif diff --git a/DCBlock.cpp b/DCBlock.cpp new file mode 100644 index 0000000..6cf5e29 --- /dev/null +++ b/DCBlock.cpp @@ -0,0 +1,41 @@ +/*******************************************/ +/* DC Blocking Filter */ +/* by Perry R. Cook, 1995-96 */ +/* This guy is very helpful in, uh, */ +/* blocking DC. Needed because a simple */ +/* low-pass reflection filter allows DC */ +/* to build up inside recursive */ +/* structures. */ +/*******************************************/ + +#include "DCBlock.h" + +DCBlock :: DCBlock() +{ + inputs = (MY_FLOAT *) malloc(MY_FLOAT_SIZE); + outputs = (MY_FLOAT *) malloc(MY_FLOAT_SIZE); + this->clear(); + +} + +DCBlock :: ~DCBlock() +{ + free(inputs); + free(outputs); +} + +void DCBlock :: clear() +{ + outputs[0] = 0.0; + inputs[0] = 0.0; + lastOutput = 0.0; +} + +MY_FLOAT DCBlock :: tick(MY_FLOAT sample) +{ + outputs[0] = sample - inputs[0] + (0.99 * outputs[0]); + inputs[0] = sample; + lastOutput = outputs[0]; + return lastOutput; +} + diff --git a/DCBlock.h b/DCBlock.h new file mode 100644 index 0000000..55deb9f --- /dev/null +++ b/DCBlock.h @@ -0,0 +1,25 @@ +/*******************************************/ +/* DC Blocking Filter */ +/* by Perry R. Cook, 1995-96 */ +/* This guy is very helpful in, uh, */ +/* blocking DC. Needed because a simple */ +/* low-pass reflection filter allows DC */ +/* to build up inside recursive */ +/* structures. */ +/*******************************************/ + +#if !defined(__DCBlock_h) +#define __DCBlock_h + +#include "Filter.h" + +class DCBlock : public Filter +{ + public: + DCBlock(); + ~DCBlock(); + void clear(); + MY_FLOAT tick(MY_FLOAT sample); +}; + +#endif diff --git a/DLineA.cpp b/DLineA.cpp new file mode 100644 index 0000000..b273803 --- /dev/null +++ b/DLineA.cpp @@ -0,0 +1,104 @@ +/*******************************************/ +/* */ +/* AllPass Interpolating Delay Line */ +/* Object by Perry R. Cook 1995-96 */ +/* This one uses a delay line of maximum */ +/* length specified on creation, and */ +/* interpolates fractional length using */ +/* an all-pass filter. This version is */ +/* more efficient for computing static */ +/* length delay lines (alpha and coeff */ +/* are computed only when the length */ +/* is set, there probably is a more */ +/* efficient computational form if alpha */ +/* is changed often (each sample)). */ +/* */ +/*******************************************/ + +#include "DLineA.h" + +DLineA :: DLineA(long max_length) +{ + long i; + length = max_length; + inputs = (MY_FLOAT *) malloc(length * MY_FLOAT_SIZE); + for (i=0;iclear(); + inPoint = 0; + outPoint = length >> 1; +} + +DLineA :: ~DLineA() +{ + free(inputs); +} + +void DLineA :: clear() +{ + long i; + for (i=0;iclear(); + outPoint = 0; + inPoint = length >> 1; +} + +DLineL :: ~DLineL() +{ + free(inputs); +} + +void DLineL :: clear() +{ + long i; + for (i=0;iclear(); + this->setDelay(length * 0.5); + inPoint = 0; + outPoint = 0; +} + +DLineN :: ~DLineN() +{ + free(inputs); +} + +void DLineN :: clear() +{ + long i; + for (i=0;i=length) { // Check for end condition */ + outPoint -= length; + } + return lastOutput; +} + +/************ Test Main Program *****************/ +/* +void main() +{ + DLineN delay(140); + FILE *fd; + MY_FLOAT temp; + short data; + long i; + + fd = fopen("test.raw","wb"); + + delay.setDelay(128); + for (i=0;i<4096;i++) { + if (i%256 != 0) temp = 0.0; else temp = 1.0; + data = (temp + delay.tick(temp)) * 16000.0; + fwrite(&data,2,1,fd); + } + delay.setDelay(64.5); + for (i=0;i<4096;i++) { + if (i%256 != 0) temp = 0.0; else temp = 1.0; + data = (temp + delay.tick(temp)) * 16000.0; + fwrite(&data,2,1,fd); + } + + fclose(fd); +} +*/ diff --git a/DLineN.h b/DLineN.h new file mode 100644 index 0000000..657c001 --- /dev/null +++ b/DLineN.h @@ -0,0 +1,30 @@ +/*******************************************/ +/* Non-Interpolating Delay Line */ +/* Object by Perry R. Cook 1995-96 */ +/* This one uses a delay line of maximum */ +/* length specified on creation. A non- */ +/* interpolating delay line should be */ +/* used in non-time varying (reverb) or */ +/* non-critical (????) applications. */ +/*******************************************/ + +#if !defined(__DLineN_h) +#define __DLineN_h + +#include "Filter.h" + +class DLineN : public Filter +{ + protected: + long inPoint; + long outPoint; + long length; + public: + DLineN(long max_length); + ~DLineN(); + void clear(); + void setDelay(MY_FLOAT length); + MY_FLOAT tick(MY_FLOAT sample); +}; + +#endif diff --git a/DrumSynt.cpp b/DrumSynt.cpp new file mode 100644 index 0000000..e5c8d55 --- /dev/null +++ b/DrumSynt.cpp @@ -0,0 +1,164 @@ +/*******************************************/ +/* Master Class for Drum Synthesizer */ +/* by Perry R. Cook, 1995-96 */ +/* This instrument contains a bunch of */ +/* RawWvIn objects (Non-Interpolating, */ +/* 1 shot players), run through a bunch */ +/* of one-pole filters. You can specify */ +/* the maximum Polyphony (maximum number */ +/* of simultaneous voices) in a #define */ +/* in the .h file. */ +/*******************************************/ + +#include "DrumSynt.h" +#include + +char waveNames[DRUM_NUMWAVES][16] = { + "bass.raw", + "snar.raw", + "tomlow.raw", + "tommid.raw", + "tomhi.raw", + "hat.raw", + "ride.raw", + "crash.raw", + "cowbell.raw", + "tamb.raw" +}; + +DrumSynt :: DrumSynt() : Object() +{ + int i; +/* char temp[64]; */ + +/* for (i=0;ifinish(); */ +/* waves[i]->normalize(0.2); */ +/* } */ + + for (i=0;iclear(); /* then */ + tempWv = waves[0]; + tempFilt = filters[0]; + for (i=0;inormalize(0.2); + filters[numSounding-1]->setPole(0.999 - (vel / 32.0)); + filters[numSounding-1]->setGain(vel / 128.0); + } + else { + waves[notDone]->reset(); + filters[notDone]->setPole(0.999 - (vel / 32.0)); + filters[notDone]->setGain(vel / 128.0); + } + + printf("Number Sounding = %i\n",numSounding); + for (i=0;ilastOut(); + + if (waves[i]->informTick() == 1) { + + printf("Wave %i %i down here\n",i,sounding[i]); + + delete waves[i]; + tempFilt = filters[i]; + + for (j=i;jclear(); + sounding[j] = -1; + numSounding -= 1; + if (numSounding == 0) notDone = 0; + i -= 1; + } + i++; + } + + return output; +} + +/************** Test Main Program *********************/ + +#include "miditabl.h" +#include "RawWvOut.h" +#include "Reverb.h" +#include "Noise.h" + +int main() +{ + long i,j; + DrumSynt instrument; + RawWvOut output("test.snd"); + Reverb reverb(2137); + Noise noise; + + for (j=0;j<100;j++) { + i = (int) (fabs(noise.tick()) * DRUM_NUMWAVES); + instrument.noteOn(i,127); + for (i=0;i<2000;i++) output.tick(reverb.tick(instrument.tick())); + } + + for (i=0;i<22000;i++) output.tick(reverb.tick(instrument.tick())); + +} diff --git a/DrumSynt.h b/DrumSynt.h new file mode 100644 index 0000000..ab66517 --- /dev/null +++ b/DrumSynt.h @@ -0,0 +1,37 @@ +/*******************************************/ +/* Master Class for Drum Synthesizer */ +/* by Perry R. Cook, 1995-96 */ +/* This instrument contains a bunch of */ +/* RawWvIn objects (Non-Interpolating, */ +/* 1 shot players), run through a bunch */ +/* of one-pole filters. You can specify */ +/* the maximum Polyphony (maximum number */ +/* of simultaneous voices) in a #define */ +/* in the .h file. */ +/*******************************************/ + +#if !defined(__DrumSynt_h) +#define __DrumSynt_h + +#include "Object.h" +#include "RawWvIn.h" +#include "OnePole.h" + +#define DRUM_NUMWAVES 10 +#define DRUM_POLYPHONY 4 + +class DrumSynt : public Object +{ + protected: + RawWvIn *waves[DRUM_POLYPHONY]; + OnePole *filters[DRUM_POLYPHONY]; + int sounding[DRUM_POLYPHONY]; + int numSounding; + public: + DrumSynt(); +/* ~DrumSynt(); */ + void noteOn(int noteNum, int vel); + MY_FLOAT tick(); +}; + +#endif diff --git a/Envelope.cpp b/Envelope.cpp new file mode 100644 index 0000000..9dc50c1 --- /dev/null +++ b/Envelope.cpp @@ -0,0 +1,113 @@ +/*******************************************/ +/* Envelope Class, Perry R. Cook, 1995-96 */ +/* This is the base class for envelopes. */ +/* This one is capable of ramping state */ +/* from where it is to a target value by */ +/* a rate. It also responds to simple */ +/* KeyOn and KeyOff messages, ramping to */ +/* 1.0 on keyon and to 0.0 on keyoff. */ +/* There are two tick (update value) */ +/* methods, one returns the value, and */ +/* other returns 0 if the envelope is at */ +/* the target value (the state bit). */ +/*******************************************/ + +#include "Envelope.h" + +Envelope :: Envelope() : Object() +{ + target = 0.0; + value = 0.0; + rate = 0.001; + state = 0; +} + +Envelope :: ~Envelope() +{ +} + +void Envelope :: keyOn() +{ + target = 1.0; + if (value != target) state = 1; +} + +void Envelope :: keyOff() +{ + target = 0.0; + if (value != target) state = 1; +} + +void Envelope :: setRate(MY_FLOAT aRate) +{ + if (aRate < 0.0) { + printf("negative rates not allowed!!, correcting\n"); + rate = -aRate; + } + else rate = aRate; + rate = rate * RATE_NORM; /* SEE Object.h */ +} + +void Envelope :: setTarget(MY_FLOAT aTarget) +{ + target = aTarget; + if (value != target) state = 1; +} + +void Envelope :: setValue(MY_FLOAT aValue) +{ + state = 0; + target = aValue; + value = aValue; +} + +MY_FLOAT Envelope :: tick() +{ + if (state) { + if (target > value) { + value += rate; + if (value >= target) { + value = target; + state = 0; + } + } + else { + value -= rate; + if (value <= target) { + value = target; + state = 0; + } + } + } + return value; +} + +int Envelope :: informTick() +{ + this->tick(); + return state; +} + +MY_FLOAT Envelope :: lastOut() +{ + return value; +} + +/************ Test Main ************************/ +/* +void main() +{ + long i; + Envelope test; + + test.setRate(0.15); + test.keyOn(); + for (i=0;i<10;i++) printf("%lf\n",test.tick()); + test.setRate(0.1); + test.setTarget(0.5); + while (test.informTick()) printf("%lf\n",test.lastOut()); + test.setRate(0.05); + test.keyOff(); + while(test.informTick()) printf("%lf\n",test.lastOut()); +} +*/ diff --git a/Envelope.h b/Envelope.h new file mode 100644 index 0000000..8294a0d --- /dev/null +++ b/Envelope.h @@ -0,0 +1,40 @@ +/*******************************************/ +/* Envelope Class, Perry R. Cook, 1995-96 */ +/* This is the base class for envelopes. */ +/* This one is capable of ramping state */ +/* from where it is to a target value by */ +/* a rate. It also responds to simple */ +/* KeyOn and KeyOff messages, ramping to */ +/* 1.0 on keyon and to 0.0 on keyoff. */ +/* There are two tick (update value) */ +/* methods, one returns the value, and */ +/* other returns 0 if the envelope is at */ +/* the target value (the state bit). */ +/*******************************************/ + +#if !defined(__Envelope_h) +#define __Envelope_h + +#include "Object.h" + +class Envelope : public Object +{ + protected: + MY_FLOAT value; + MY_FLOAT target; + MY_FLOAT rate; + int state; + public: + Envelope(); + ~Envelope(); + void keyOn(); + void keyOff(); + void setRate(MY_FLOAT aRate); + void setTarget(MY_FLOAT aTarget); + void setValue(MY_FLOAT aValue); + MY_FLOAT tick(); + int informTick(); + MY_FLOAT lastOut(); +}; + +#endif diff --git a/FM4Alg3.cpp b/FM4Alg3.cpp new file mode 100644 index 0000000..93f3433 --- /dev/null +++ b/FM4Alg3.cpp @@ -0,0 +1,51 @@ +/******************************************/ +/* Algorithm 3 (TX81Z) Subclass of */ +/* 4 Operator FM Synth */ +/* by Perry R. Cook, 1995-96 */ +/* */ +/* Alg 3 is : 4--\ */ +/* 3-->2-- + -->1-->Out */ +/* */ +/* Controls: control1 = total mod index */ +/* control2 = crossfade of two */ +/* modulators */ +/* control3 = LFO speed */ +/* modWheel = LFO amount */ +/* */ +/******************************************/ + +#include "FM4Alg3.h" + +FM4Alg3 :: FM4Alg3() : FM4Op() +{ + /* We still don't make the waves here yet, because */ + /* we still don't know what they will be. */ +} + +MY_FLOAT FM4Alg3 :: tick() +{ + MY_FLOAT temp; + + temp = vibWave->tick() * modDepth * 0.2; + waves[0]->setFreq(baseFreq * (1.0 + temp) * ratios[0]); + waves[1]->setFreq(baseFreq * (1.0 + temp) * ratios[1]); + waves[2]->setFreq(baseFreq * (1.0 + temp) * ratios[2]); + waves[3]->setFreq(baseFreq * (1.0 + temp) * ratios[3]); + + temp = gains[2] * adsr[2]->tick() * waves[2]->tick(); + waves[1]->addPhaseOffset(temp); + + waves[3]->addPhaseOffset(twozero->lastOut()); + temp = (1.0 - (control2 * 0.5)) * gains[3] * adsr[3]->tick() * waves[3]->tick(); + twozero->tick(temp); + + temp += control2 * 0.5 * gains[1] * adsr[1]->tick() * waves[1]->tick(); + temp = temp * control1; + + waves[0]->addPhaseOffset(temp); + temp = gains[0] * adsr[0]->tick() * waves[0]->tick(); + + lastOutput = temp * 0.5; + return lastOutput; +} + diff --git a/FM4Alg3.h b/FM4Alg3.h new file mode 100644 index 0000000..ad8a530 --- /dev/null +++ b/FM4Alg3.h @@ -0,0 +1,29 @@ +/******************************************/ +/* Algorithm 3 (TX81Z) Subclass of */ +/* 4 Operator FM Synth */ +/* by Perry R. Cook, 1995-96 */ +/* */ +/* Alg 3 is : 4--\ */ +/* 3-->2-- + -->1-->Out */ +/* */ +/* Controls: control1 = total mod index */ +/* control2 = crossfade of two */ +/* modulators */ +/* control3 = LFO speed */ +/* modWheel = LFO amount */ +/* */ +/******************************************/ + +#if !defined(__FM4Alg3_h) +#define __FM4Alg3_h + +#include "FM4Op.h" + +class FM4Alg3 : public FM4Op +{ + public: + FM4Alg3(); + MY_FLOAT tick(); +}; + +#endif diff --git a/FM4Alg4.cpp b/FM4Alg4.cpp new file mode 100644 index 0000000..53d3e6b --- /dev/null +++ b/FM4Alg4.cpp @@ -0,0 +1,48 @@ +/******************************************/ +/* Algorithm 4 (TX81Z) Subclass of */ +/* 4 Operator FM Synth */ +/* by Perry R. Cook, 1995-96 */ +/* */ +/* Alg 4 is : 4->3--\ */ +/* 2-- + -->1-->Out */ +/* */ +/* Controls: control1 = total mod index */ +/* control2 = crossfade of two */ +/* modulators */ +/* control3 = LFO speed */ +/* modWheel = LFO amount */ +/* */ +/******************************************/ + +#include "FM4Alg4.h" + +FM4Alg4 :: FM4Alg4() : FM4Op() +{ + /* We still don't make the waves here yet, because */ + /* we still don't know what they will be. */ +} + +MY_FLOAT FM4Alg4 :: tick() +{ + MY_FLOAT temp; + + temp = vibWave->tick() * modDepth * 0.2; + waves[0]->setFreq(baseFreq * (1.0 + temp) * ratios[0]); + waves[1]->setFreq(baseFreq * (1.0 + temp) * ratios[1]); + waves[2]->setFreq(baseFreq * (1.0 + temp) * ratios[2]); + waves[3]->setFreq(baseFreq * (1.0 + temp) * ratios[3]); + + waves[3]->addPhaseOffset(twozero->lastOut()); + temp = gains[3] * adsr[3]->tick() * waves[3]->tick(); + twozero->tick(temp); + waves[2]->addPhaseOffset(temp); + temp = (1.0 - (control2 * 0.5)) * gains[2] * adsr[2]->tick() * waves[2]->tick(); + temp += control2 * 0.5 * gains[1] * adsr[1]->tick() * waves[1]->tick(); + temp = temp * control1; + waves[0]->addPhaseOffset(temp); + temp = gains[0] * adsr[0]->tick() * waves[0]->tick(); + + lastOutput = temp * 0.5; + return lastOutput; +} + diff --git a/FM4Alg4.h b/FM4Alg4.h new file mode 100644 index 0000000..6a21da3 --- /dev/null +++ b/FM4Alg4.h @@ -0,0 +1,29 @@ +/******************************************/ +/* Algorithm 4 (TX81Z) Subclass of */ +/* 4 Operator FM Synth */ +/* by Perry R. Cook, 1995-96 */ +/* */ +/* Alg 4 is : 4->3--\ */ +/* 2-- + -->1-->Out */ +/* */ +/* Controls: control1 = total mod index */ +/* control2 = crossfade of two */ +/* modulators */ +/* control3 = LFO speed */ +/* modWheel = LFO amount */ +/* */ +/******************************************/ + +#if !defined(__FM4Alg4_h) +#define __FM4Alg4_h + +#include "FM4Op.h" + +class FM4Alg4 : public FM4Op +{ + public: + FM4Alg4(); + MY_FLOAT tick(); +}; + +#endif diff --git a/FM4Alg5.cpp b/FM4Alg5.cpp new file mode 100644 index 0000000..c6eaca7 --- /dev/null +++ b/FM4Alg5.cpp @@ -0,0 +1,48 @@ +/******************************************/ +/* Algorithm 5 (TX81Z) Subclass of */ +/* 4 Operator FM Synth */ +/* by Perry R. Cook, 1995-96 */ +/* This connection topology is 2 simple */ +/* FM Pairs summed together, like: */ +/* */ +/* Alg 5 is : 4->3--\ */ +/* + --> Out */ +/* 2->1--/ */ +/* */ +/* Controls: control1 = mod index 1 */ +/* control2 = crossfade of two */ +/* outputs */ +/* control3 = LFO speed */ +/* modWheel = LFO amount */ +/* */ +/******************************************/ + +#include "FM4Alg5.h" + +FM4Alg5 :: FM4Alg5() : FM4Op() +{ + /* We still don't make the waves here yet, because */ + /* we still don't know what they will be. */ +} + +MY_FLOAT FM4Alg5 :: tick() +{ + MY_FLOAT temp,temp2; + + temp = gains[1] * adsr[1]->tick() * waves[1]->tick(); + temp = temp * control1; + waves[0]->addPhaseOffset(temp); + waves[3]->addPhaseOffset(twozero->lastOut()); + temp = gains[3] * adsr[3]->tick() * waves[3]->tick(); + twozero->tick(temp); + waves[2]->addPhaseOffset(temp); + temp = (1.0 - (control2 * 0.5)) * gains[0] * adsr[0]->tick() * waves[0]->tick(); + temp += control2 * 0.5 * gains[2] * adsr[2]->tick() * waves[2]->tick(); + + temp2 = vibWave->tick() * modDepth; /* Calculate amplitude mod */ + temp = temp * (1.0 + temp2); /* and apply it to output */ + + lastOutput = temp * 0.5; + return lastOutput; +} + diff --git a/FM4Alg5.h b/FM4Alg5.h new file mode 100644 index 0000000..00ad570 --- /dev/null +++ b/FM4Alg5.h @@ -0,0 +1,32 @@ +/******************************************/ +/* Algorithm 5 (TX81Z) Subclass of */ +/* 4 Operator FM Synth */ +/* by Perry R. Cook, 1995-96 */ +/* This connection topology is 2 simple */ +/* FM Pairs summed together, like: */ +/* */ +/* 1 -> 2 -\ */ +/* +-> Out */ +/* 3 -> 4 -/ */ +/* */ +/* Controls: control1 = mod index 1 */ +/* control2 = crossfade of two */ +/* outputs */ +/* control3 = LFO speed */ +/* modWheel = LFO amount */ +/* */ +/******************************************/ + +#if !defined(__FM4Alg5_h) +#define __FM4Alg5_h + +#include "FM4Op.h" + +class FM4Alg5 : public FM4Op +{ + public: + FM4Alg5(); + MY_FLOAT tick(); +}; + +#endif diff --git a/FM4Alg6.cpp b/FM4Alg6.cpp new file mode 100644 index 0000000..ce071c1 --- /dev/null +++ b/FM4Alg6.cpp @@ -0,0 +1,54 @@ +/******************************************/ +/* Algorithm 6 (TX81Z) Subclass of */ +/* 4 Operator FM Synth */ +/* by Perry R. Cook, 1995-96 */ +/* This connection topology is three */ +/* Carriers and a common Modulator */ +/* */ +/* /->1 -\ */ +/* 4-|-->2 - +-> Out */ +/* \->3 -/ */ +/* */ +/* Controls: control1 = vowel */ +/* control2 = spectral tilt */ +/* control3 = LFO speed */ +/* modWheel = LFO amount */ +/* */ +/******************************************/ + +#include "FM4Alg6.h" + +FM4Alg6 :: FM4Alg6() : FM4Op() +{ + /* We still don't make the waves here yet, because */ + /* we still don't know what they will be. */ +} + +MY_FLOAT FM4Alg6 :: tick() +{ + MY_FLOAT temp,temp2; + + temp = gains[3] * adsr[3]->tick() * waves[3]->tick(); + temp2 = vibWave->tick() * modDepth * 0.1; /* Calculate frequency mod */ + + waves[0]->setFreq(baseFreq * (1.0 + temp2) * ratios[0]); + waves[1]->setFreq(baseFreq * (1.0 + temp2) * ratios[1]); + waves[2]->setFreq(baseFreq * (1.0 + temp2) * ratios[2]); + waves[3]->setFreq(baseFreq * (1.0 + temp2) * ratios[3]); + + waves[0]->addPhaseOffset(temp * mods[0]); + waves[1]->addPhaseOffset(temp * mods[1]); + waves[2]->addPhaseOffset(temp * mods[2]); + waves[3]->addPhaseOffset(twozero->lastOut()); + twozero->tick(temp); + temp = gains[0] * tilt[0] * adsr[0]->tick() * waves[0]->tick(); + temp += gains[1] * tilt[1] * adsr[1]->tick() * waves[1]->tick(); + temp += gains[2] * tilt[2] * adsr[2]->tick() * waves[2]->tick(); + + return temp * 0.33; +} + +void FM4Alg6 :: controlChange(int number, MY_FLOAT value) +{ + +} diff --git a/FM4Alg6.h b/FM4Alg6.h new file mode 100644 index 0000000..a48f644 --- /dev/null +++ b/FM4Alg6.h @@ -0,0 +1,35 @@ +/******************************************/ +/* Algorithm 6 (TX81Z) Subclass of */ +/* 4 Operator FM Synth */ +/* by Perry R. Cook, 1995-96 */ +/* This connection topology is three */ +/* Carriers and a common Modulator */ +/* */ +/* /->1 -\ */ +/* 4-|-->2 - +-> Out */ +/* \->3 -/ */ +/* */ +/* Controls: control1 = vowel */ +/* control2 = spectral tilt */ +/* control3 = LFO speed */ +/* modWheel = LFO amount */ +/* */ +/******************************************/ + +#if !defined(__FM4Alg6_h) +#define __FM4Alg6_h + +#include "FM4Op.h" + +class FM4Alg6 : public FM4Op +{ + protected: + MY_FLOAT tilt[3]; + MY_FLOAT mods[3]; + public: + FM4Alg6(); + MY_FLOAT tick(); + virtual void controlChange(int number, MY_FLOAT value); +}; + +#endif diff --git a/FM4Alg8.cpp b/FM4Alg8.cpp new file mode 100644 index 0000000..6743eee --- /dev/null +++ b/FM4Alg8.cpp @@ -0,0 +1,43 @@ +/******************************************/ +/* Algorithm 8 (TX81Z) Subclass of */ +/* 4 Operator FM Synth */ +/* by Perry R. Cook, 1995-96 */ +/* This connection topology is simple */ +/* Additive Synthesis, like: */ +/* */ +/* 1 --. */ +/* 2 -\| */ +/* +-> Out */ +/* 3 -/| */ +/* 4 -- */ +/* */ +/* Controls: control1 = op4 (fb) gain */ +/* control2 = op3 gain */ +/* control3 = LFO speed */ +/* modWheel = LFO amount */ +/* */ +/******************************************/ + +#include "FM4Alg8.h" + +FM4Alg8 :: FM4Alg8() : FM4Op() +{ + /* We still don't make the waves here yet, because */ + /* we still don't know what they will be. */ +} + +MY_FLOAT FM4Alg8 :: tick() +{ + MY_FLOAT temp; + + waves[3]->addPhaseOffset(twozero->lastOut()); + temp = control1 * 2.0 * gains[3] * adsr[3]->tick() * waves[3]->tick(); + twozero->tick(temp); + temp += control2 * 2.0 * gains[2] * adsr[2]->tick() * waves[2]->tick(); + temp += gains[1] * adsr[1]->tick() * waves[1]->tick(); + temp += gains[0] * adsr[0]->tick() * waves[0]->tick(); + + lastOutput = temp * 0.125; + return lastOutput; +} + diff --git a/FM4Alg8.h b/FM4Alg8.h new file mode 100644 index 0000000..864a9d2 --- /dev/null +++ b/FM4Alg8.h @@ -0,0 +1,33 @@ +/******************************************/ +/* Algorithm 8 (TX81Z) Subclass of */ +/* 4 Operator FM Synth */ +/* by Perry R. Cook, 1995-96 */ +/* This connection topology is simple */ +/* Additive Synthesis, like: */ +/* */ +/* 1 --. */ +/* 2 -\| */ +/* +-> Out */ +/* 3 -/| */ +/* 4 -- */ +/* */ +/* Controls: control1 = op4 (fb) gain */ +/* control2 = op3 gain */ +/* control3 = LFO speed */ +/* modWheel = LFO amount */ +/* */ +/******************************************/ + +#if !defined(__FM4Alg8_h) +#define __FM4Alg8_h + +#include "FM4Op.h" + +class FM4Alg8 : public FM4Op +{ + public: + FM4Alg8(); + virtual MY_FLOAT tick(); +}; + +#endif diff --git a/FM4Op.cpp b/FM4Op.cpp new file mode 100644 index 0000000..5c858e3 --- /dev/null +++ b/FM4Op.cpp @@ -0,0 +1,179 @@ +/*******************************************/ +/* Master Class for 4 Operator FM Synth */ +/* by Perry R. Cook, 1995-96 */ +/* This instrument contains 4 waves, */ +/* 4 adsr, and various state vars. */ +/* */ +/* The basic Chowning/Stanford FM patent */ +/* expired April 1995, but there exist */ +/* follow-on patents, mostly assigned to */ +/* Yamaha. If you are of the type who */ +/* should worry about this (making money) */ +/* worry away. */ +/* */ +/*******************************************/ + +#include "FM4Op.h" + +FM4Op :: FM4Op() +{ + int i; + MY_FLOAT temp; + MY_FLOAT tempCoeffs[2] = {0.0, -1.0}; + adsr[0] = new ADSR; + adsr[1] = new ADSR; + adsr[2] = new ADSR; + adsr[3] = new ADSR; + twozero = new TwoZero; + vibWave = new RawLoop("rawwaves/sinewave.raw"); + vibWave->normalize(); + vibWave->setFreq(6.0); /* should make this random?? */ + modDepth = 0.0; + /* We don't make the waves here yet, because */ + /* we don't know what they will be. */ + baseFreq = 440.0; + ratios[0] = 1.0; + ratios[1] = 1.0; + ratios[2] = 1.0; + ratios[3] = 1.0; + gains[0] = 1.0; + gains[1] = 1.0; + gains[2] = 1.0; + gains[3] = 1.0; + twozero->setZeroCoeffs(tempCoeffs); + twozero->setGain(0.0); + control1 = 1.0; + control2 = 1.0; + temp = 1.0; + for (i=99;i>=0;i--) { + __FM4Op_gains[i] = temp; + temp *= 0.933033; + } + temp = 1.0; + for (i=15;i>=0;i--) { + __FM4Op_susLevels[i] = temp; + temp *= 0.707101; + } + temp = 8.498186; + for (i=0;i<32;i++) { + __FM4Op_attTimes[i] = temp; + temp *= 0.707101; + } +} + +FM4Op :: ~FM4Op() +{ + delete adsr[0]; + delete adsr[1]; + delete adsr[2]; + delete adsr[3]; + delete waves[0]; + delete waves[1]; + delete waves[2]; + delete waves[3]; + delete vibWave; + delete twozero; +} + +void FM4Op :: loadWaves(char* wave1, char* wave2, char* wave3, char* wave4) +{ + int i; + waves[0] = new RawLoop(wave1); + waves[1] = new RawLoop(wave2); + waves[2] = new RawLoop(wave3); + waves[3] = new RawLoop(wave4); + for (i=0;i<4;i++) { + waves[i]->normalize(); + } +} +void FM4Op :: setFreq(MY_FLOAT frequency) +{ + baseFreq = frequency; + waves[0]->setFreq(baseFreq * ratios[0]); + waves[1]->setFreq(baseFreq * ratios[1]); + waves[2]->setFreq(baseFreq * ratios[2]); + waves[3]->setFreq(baseFreq * ratios[3]); +} + +void FM4Op :: setRatio(int whichOne, MY_FLOAT ratio) +{ + ratios[whichOne] = ratio; + if (ratio>0.0) + waves[whichOne]->setFreq(baseFreq * ratio); + else + waves[whichOne]->setFreq(ratio); +} + +void FM4Op :: setGain(int whichOne, MY_FLOAT gain) +{ + gains[whichOne]=gain; +} + +void FM4Op :: keyOn() +{ + adsr[0]->keyOn(); + adsr[1]->keyOn(); + adsr[2]->keyOn(); + adsr[3]->keyOn(); +} + +void FM4Op :: keyOff() +{ + adsr[0]->keyOff(); + adsr[1]->keyOff(); + adsr[2]->keyOff(); + adsr[3]->keyOff(); +} + +void FM4Op :: noteOff(MY_FLOAT amp) +{ + this->keyOff(); +#if defined(_debug_) + printf("FM4Op : NoteOff: Amp=%lf\n",amp); +#endif +} + +void FM4Op :: setModulationSpeed(MY_FLOAT mSpeed) +{ + vibWave->setFreq(mSpeed); +} + +void FM4Op :: setModulationDepth(MY_FLOAT mDepth) +{ + modDepth = mDepth; +} + +void FM4Op :: setControl1(MY_FLOAT cVal) +{ + control1 = cVal*2.0; +} + +void FM4Op :: setControl2(MY_FLOAT cVal) +{ + control2 = cVal*2.0; +} + +void FM4Op :: controlChange(int number, MY_FLOAT value) +{ +#if defined(_debug_) + printf("FM4Op : ControlChange: Number=%i Value=%f\n",number,value); +#endif + if (number == MIDI_control1) + this->setControl1(value * NORM_7); + else if (number == MIDI_control2) + this->setControl2(value * NORM_7); + else if (number == MIDI_control3) + this->setModulationSpeed(value * NORM_7 * 12.0); /* 0 to 12 Hz */ + else if (number == MIDI_mod_wheel) + this->setModulationDepth(value * NORM_7); + else if (number == MIDI_after_touch) { + adsr[0]->setTarget(value * NORM_7); + adsr[1]->setTarget(value * NORM_7); + adsr[2]->setTarget(value * NORM_7); + adsr[3]->setTarget(value * NORM_7); + } + else { + printf("FM4Op : Undefined Control Number!!\n"); + } +} + diff --git a/FM4Op.h b/FM4Op.h new file mode 100644 index 0000000..87d56a5 --- /dev/null +++ b/FM4Op.h @@ -0,0 +1,59 @@ +/*******************************************/ +/* Master Class for 4 Operator FM Synth */ +/* by Perry R. Cook, 1995-96 */ +/* This instrument contains an 4 waves, */ +/* 4 envelopes, and various state vars. */ +/* */ +/* The basic Chowning/Stanford FM patent */ +/* expired April 1995, but there exist */ +/* follow-on patents, mostly assigned to */ +/* Yamaha. If you are of the type who */ +/* should worry about this (making money) */ +/* worry away. */ +/* */ +/*******************************************/ + +#if !defined(__FM4Op_h) +#define __FM4Op_h + +#include "Instrmnt.h" +#include "ADSR.h" +#include "RawLoop.h" +#include "TwoZero.h" + +class FM4Op : public Instrmnt +{ + protected: + ADSR *adsr[4]; + RawLoop *waves[4]; + RawLoop *vibWave; + TwoZero *twozero; + MY_FLOAT baseFreq; + MY_FLOAT ratios[4]; + MY_FLOAT gains[4]; + MY_FLOAT modDepth; + MY_FLOAT control1; + MY_FLOAT control2; + MY_FLOAT __FM4Op_gains[100]; + MY_FLOAT __FM4Op_susLevels[16]; + MY_FLOAT __FM4Op_attTimes[32]; + public: + FM4Op(); + ~FM4Op(); + void loadWaves(char* wave1, char* wave2, char* wave3, char* wave4); + void clear(); + void setFreq(MY_FLOAT frequency); + void setRatio(int whichOne, MY_FLOAT ratio); + void setGain(int whichOne, MY_FLOAT gain); + void keyOn(); + void keyOff(); + void noteOff(MY_FLOAT amp); + /* There's no tick() method here, because that depends on the algorithm */ + void setModulationSpeed(MY_FLOAT mSpeed); + void setModulationDepth(MY_FLOAT mDepth); + void setControl1(MY_FLOAT cVal); + void setControl2(MY_FLOAT cVal); + virtual void controlChange(int number, MY_FLOAT value); +}; + +#endif diff --git a/FMVoices.cpp b/FMVoices.cpp new file mode 100644 index 0000000..463e9e5 --- /dev/null +++ b/FMVoices.cpp @@ -0,0 +1,118 @@ +/******************************************/ +/* Singing Voice Synthesis Subclass */ +/* of Algorithm 6 (TX81Z) Subclass of */ +/* 4 Operator FM Synth */ +/* by Perry R. Cook, 1996 */ +/******************************************/ + +#include "FMVoices.h" + +FMVoices :: FMVoices() : FM4Alg6() +{ + this->loadWaves("rawwaves/sinewave.raw", + "rawwaves/sinewave.raw", + "rawwaves/sinewave.raw", + "rawwaves/sinewave.raw"); + + this->setRatio(0,2.00); + this->setRatio(1,4.00); + this->setRatio(2,12.0); + this->setRatio(3,1.00); + gains[3] = __FM4Op_gains[80]; + adsr[0]->setAll(0.001,0.001,__FM4Op_susLevels[15],0.001); + adsr[1]->setAll(0.001,0.001,__FM4Op_susLevels[15],0.001); + adsr[2]->setAll(0.001,0.001,__FM4Op_susLevels[15],0.001); + adsr[3]->setAll(0.05,0.05,__FM4Op_susLevels[15],0.0001); + twozero->setGain(0.0); + modDepth = 0.005; + currentVowel = 0; + tilt[0] = 1.0; + tilt[1] = 0.5; + tilt[2] = 0.2; + mods[0] = 1.0; + mods[1] = 1.1; + mods[2] = 1.1; + baseFreq = 110.0; + this->setFreq(110.0); +} + +#include "phonTabl.h" + +void FMVoices :: setFreq(MY_FLOAT frequency) +{ + MY_FLOAT temp,temp2; + int tempi,tempi2; + + if (currentVowel < 16) { + tempi2 = currentVowel; + temp2 = 0.9; + } + else if (currentVowel < 32) { + tempi2 = currentVowel - 16; + temp2 = 1.0; + } + else if (currentVowel < 48) { + tempi2 = currentVowel - 32; + temp2 = 1.1; + } + else if (currentVowel < 64) { + tempi2 = currentVowel - 48; + temp2 = 1.2; + } + baseFreq = frequency; + temp = (temp2 * phonParams[tempi2][0][0] / baseFreq) + 0.5; + tempi = (int) temp; + this->setRatio(0,(MY_FLOAT) tempi); + temp = (temp2 * phonParams[tempi2][1][0] / baseFreq) + 0.5; + tempi = (int) temp; + this->setRatio(1,(MY_FLOAT) tempi); + temp = (temp2 * phonParams[tempi2][2][0] / baseFreq) + 0.5; + tempi = (int) temp; + this->setRatio(2,(MY_FLOAT) tempi); + gains[0] = 1.0; // pow(10.0,phonParams[tempi2][0][2] * 0.05); + gains[1] = 1.0; // pow(10.0,phonParams[tempi2][1][2] * 0.05); + gains[2] = 1.0; // pow(10.0,phonParams[tempi2][2][2] * 0.05); +} + +void FMVoices :: noteOn(MY_FLOAT freq, MY_FLOAT amp) +{ + this->setFreq(freq); + tilt[0] = amp; + tilt[1] = amp * amp; + tilt[2] = amp * amp * amp; + this->keyOn(); +#if defined(_debug_) + printf("FMVoices : NoteOn: Freq=%lf Amp=%lf\n",freq,amp); +#endif +} + +void FMVoices :: controlChange(int number, MY_FLOAT value) +{ + MY_FLOAT temp; + int tempi; + +#if defined(_debug_) + printf("FM4Op : ControlChange: Number=%i Value=%f\n",number,value); +#endif + if (number == MIDI_control1) + gains[3] = __FM4Op_gains[(int) (value * 0.78125)]; + else if (number == MIDI_control2) { + tempi = (int) (value / 2); + currentVowel = tempi; + this->setFreq(baseFreq); + } + else if (number == MIDI_control3) + this->setModulationSpeed(value * NORM_7 * 12.0); /* 0 to 12 Hz */ + else if (number == MIDI_mod_wheel) + this->setModulationDepth(value * NORM_7); + else if (number == MIDI_after_touch) { + temp = value * NORM_7; + tilt[0] = temp; + tilt[1] = temp * temp; + tilt[2] = temp * temp * temp; + } + else { + printf("FM4Op : Undefined Control Number!!\n"); + } +} + diff --git a/FMVoices.h b/FMVoices.h new file mode 100644 index 0000000..33e4723 --- /dev/null +++ b/FMVoices.h @@ -0,0 +1,24 @@ +/******************************************/ +/* Singing Voice Synthesis Subclass */ +/* of Algorithm 6 (TX81Z) Subclass of */ +/* 4 Operator FM Synth */ +/* by Perry R. Cook, 1996 */ +/******************************************/ + +#if !defined(__FMVoices_h) +#define __FMVoices_h + +#include "FM4Alg6.h" + +class FMVoices : public FM4Alg6 +{ + protected: + int currentVowel; + public: + FMVoices(); + virtual void setFreq(MY_FLOAT frequency); + virtual void noteOn(MY_FLOAT freq, MY_FLOAT amp); + virtual void controlChange(int number, MY_FLOAT value); +}; + +#endif diff --git a/Filter.cpp b/Filter.cpp new file mode 100644 index 0000000..6b8c11c --- /dev/null +++ b/Filter.cpp @@ -0,0 +1,24 @@ +/*******************************************/ +/* Filter Class, by Perry R. Cook, 1995-96*/ +/* This is the base class for all filters.*/ +/* To me, most anything is a filter, but */ +/* I'll be a little less general here, and*/ +/* define a filter as something which has */ +/* input(s), output(s), and gain. */ +/*******************************************/ + +#include "Filter.h" + +Filter :: Filter() : Object() +{ +} + +Filter :: ~Filter() +{ +} + +MY_FLOAT Filter :: lastOut() +{ + return lastOutput; +} + diff --git a/Filter.h b/Filter.h new file mode 100644 index 0000000..727c6f6 --- /dev/null +++ b/Filter.h @@ -0,0 +1,28 @@ +/*******************************************/ +/* Filter Class, by Perry R. Cook, 1995-96*/ +/* This is the base class for all filters.*/ +/* To me, most anything is a filter, but */ +/* I'll be a little less general here, and*/ +/* define a filter as something which has */ +/* input(s), output(s), and gain. */ +/*******************************************/ + +#if !defined(__Filter_h) +#define __Filter_h + +#include "Object.h" + +class Filter : public Object +{ + protected: + MY_FLOAT gain; + MY_FLOAT *outputs; + MY_FLOAT *inputs; + MY_FLOAT lastOutput; + public: + Filter(); + ~Filter(); + MY_FLOAT lastOut(); +}; + +#endif diff --git a/Flute.cpp b/Flute.cpp new file mode 100644 index 0000000..00ec943 --- /dev/null +++ b/Flute.cpp @@ -0,0 +1,172 @@ +/******************************************/ +/* WaveGuide Flute ala Karjalainen, */ +/* Smith, Waryznyk, etc. */ +/* with polynomial Jet ala Cook */ +/* by Perry Cook, 1995-96 */ +/* */ +/* This is a waveguide model, and thus */ +/* relates to various Stanford Univ. */ +/* and possibly Yamaha and other patents.*/ +/* */ +/* Controls: CONTROL1 = jetDelay */ +/* CONTROL2 = noiseGain */ +/* CONTROL3 = vibFreq */ +/* MOD_WHEEL= vibAmt */ +/******************************************/ + +#include "Flute.h" + +Flute :: Flute(MY_FLOAT lowestFreq) +{ + long length; + length = (long) (SRATE / lowestFreq + 1); + boreDelay = new DLineL(length); + length >> 1; + jetDelay = new DLineL(length); + jetTable = new JetTabl; + filter = new OnePole; + dcBlock = new DCBlock; + noise = new Noise; + adsr = new ADSR; + vibr = new RawLoop("rawwaves/sinewave.raw"); + this->clear(); + + boreDelay->setDelay(100.0); + jetDelay->setDelay(49.0); + + filter->setPole(0.7 - (0.1 * RATE_NORM)); + filter->setGain(-1.0); + vibr->normalize(); + vibr->setFreq(5.925); + adsr->setAll(0.02, 0.05, 0.8, 0.001); + endRefl = 0.5; + jetRefl = 0.5; + noiseGain = 0.15; /* Breath pressure random component */ + vibrGain = 0.05; /* breath periodic vibrato component */ + jetRatio = 0.32; +} + +Flute :: ~Flute() +{ + delete jetDelay; + delete boreDelay; + delete jetTable; + delete filter; + delete dcBlock; + delete noise; + delete adsr; + delete vibr; +} + +void Flute :: clear() +{ + jetDelay->clear(); + boreDelay->clear(); + filter->clear(); + dcBlock->clear(); +/* adsr->reset(); */ +} + +void Flute :: setFreq(MY_FLOAT frequency) +{ + MY_FLOAT temp; + lastFreq = frequency * 0.66666; /* we're overblowing here */ + temp = SRATE / lastFreq - 2.0; /* Length - approx. filter delay */ + boreDelay->setDelay(temp); /* Length of bore tube */ + jetDelay->setDelay(temp * jetRatio); /* jet delay shorter */ +} + +void Flute :: startBlowing(MY_FLOAT amplitude, MY_FLOAT rate) +{ + adsr->setAttackRate(rate); + maxPressure = amplitude / 0.8; + adsr->keyOn(); +} + +void Flute :: stopBlowing(MY_FLOAT rate) +{ + adsr->setReleaseRate(rate); + adsr->keyOff(); +} + +void Flute :: noteOn(MY_FLOAT freq, MY_FLOAT amp) +{ + this->setFreq(freq); + this->startBlowing(1.1 + (amp * 0.20),amp * 0.02); + outputGain = amp + 0.001; +#if defined(_debug_) + printf("Flute : NoteOn: Freq=%lf Amp=%lf\n",freq,amp); +#endif +} + +void Flute :: noteOff(MY_FLOAT amp) +{ + this->stopBlowing(amp * 0.02); +#if defined(_debug_) + printf("Flute : NoteOff: Amp=%lf\n",amp); +#endif +} + +void Flute :: setJetRefl(MY_FLOAT refl) +{ + jetRefl = refl; +} + +void Flute :: setEndRefl(MY_FLOAT refl) +{ + endRefl = refl; +} + +void Flute :: setJetDelay(MY_FLOAT aRatio) +{ + MY_FLOAT temp; + temp = SRATE / lastFreq - 2.0; /* Length - approx. filter delay */ + jetRatio = aRatio; + jetDelay->setDelay(temp * aRatio); /* Scaled by ratio */ +} + +MY_FLOAT Flute :: tick() +{ + MY_FLOAT temp; + MY_FLOAT pressureDiff; + MY_FLOAT randPressure; + MY_FLOAT breathPressure; + + breathPressure = maxPressure * adsr->tick(); /* Breath Pressure */ + randPressure = noiseGain * noise->tick(); /* Random Deviation */ + randPressure += vibrGain * vibr->tick(); /* + breath vibrato */ + randPressure *= breathPressure; /* All scaled by Breath Pressure */ + + temp = filter->tick(boreDelay->lastOut()); + temp = dcBlock->tick(temp); /* Block DC on reflection */ + pressureDiff = breathPressure + randPressure - /* Breath Pressure */ + (jetRefl * temp); /* - reflected */ + pressureDiff = jetDelay->tick(pressureDiff); /* Jet Delay Line */ + pressureDiff = jetTable->lookup(pressureDiff) /* Non-Lin Jet + reflected */ + + (endRefl * temp); + lastOutput = 0.3 * boreDelay->tick(pressureDiff); /* Bore Delay and "bell" filter */ + + lastOutput *= outputGain; + return lastOutput; + +} + +void Flute :: controlChange(int number, MY_FLOAT value) +{ +#if defined(_debug_) + printf("Flute : ControlChange: Number=%i Value=%f\n",number,value); +#endif + if (number == MIDI_control1) + this->setJetDelay(0.08 + (0.48 * value * NORM_7)); + else if (number == MIDI_control2) + noiseGain = (value * NORM_7 * 0.4); + else if (number == MIDI_control3) + vibr->setFreq((value * NORM_7 * 12.0)); + else if (number == MIDI_mod_wheel) + vibrGain = (value * NORM_7 * 0.4); + else if (number == MIDI_after_touch) + adsr->setTarget(value * NORM_7); + else { + printf("Flute : Undefined Control Number!!\n"); + } +} diff --git a/Flute.h b/Flute.h new file mode 100644 index 0000000..3f9b00a --- /dev/null +++ b/Flute.h @@ -0,0 +1,64 @@ +/******************************************/ +/* WaveGuide Flute ala Karjalainen, */ +/* Smith, Waryznyk, etc. */ +/* with polynomial Jet ala Cook */ +/* by Perry Cook, 1995-96 */ +/* */ +/* This is a waveguide model, and thus */ +/* relates to various Stanford Univ. */ +/* and possibly Yamaha and other patents.*/ +/* */ +/* Controls: CONTROL1 = jetDelay */ +/* CONTROL2 = noiseGain */ +/* CONTROL3 = vibFreq */ +/* MOD_WHEEL= vibAmt */ +/******************************************/ + +#if !defined(__Flute_h) +#define __Flute_h + +#include "Instrmnt.h" +#include "JetTabl.h" +#include "DLineL.h" +#include "OnePole.h" +#include "DCBlock.h" +#include "Noise.h" +#include "ADSR.h" +#include "RawLoop.h" + +class Flute : public Instrmnt +{ + protected: + DLineL *jetDelay; + DLineL *boreDelay; + JetTabl *jetTable; + OnePole *filter; + DCBlock *dcBlock; + Noise *noise; + ADSR *adsr; + RawLoop *vibr; + MY_FLOAT lastFreq; + MY_FLOAT maxPressure; + MY_FLOAT jetRefl; + MY_FLOAT endRefl; + MY_FLOAT noiseGain; + MY_FLOAT vibrGain; + MY_FLOAT outputGain; + MY_FLOAT jetRatio; + public: + Flute(MY_FLOAT lowestFreq); + ~Flute(); + void clear(); + void startBlowing(MY_FLOAT amplitude,MY_FLOAT rate); + void stopBlowing(MY_FLOAT rate); + virtual void noteOn(MY_FLOAT freq, MY_FLOAT amp); + virtual void noteOff(MY_FLOAT amp); + void setJetRefl(MY_FLOAT refl); + void setEndRefl(MY_FLOAT refl); + virtual void setFreq(MY_FLOAT frequency); + virtual MY_FLOAT tick(); + virtual void controlChange(int number, MY_FLOAT value); + void setJetDelay(MY_FLOAT aLength); +}; + +#endif diff --git a/FormSwep.cpp b/FormSwep.cpp new file mode 100644 index 0000000..be1c4d8 --- /dev/null +++ b/FormSwep.cpp @@ -0,0 +1,170 @@ +/*******************************************/ +/* Sweepable Formant (2-pole) */ +/* Filter Class, by Perry R. Cook, 1995-96*/ +/* See books on filters to understand */ +/* more about how this works. This drives*/ +/* to a target at speed set by rate. */ +/*******************************************/ + +#include "FormSwep.h" + +FormSwep :: FormSwep() : Filter() +{ + outputs = (MY_FLOAT *) malloc(2 * MY_FLOAT_SIZE); + poleCoeffs[0] = 0.0; + poleCoeffs[1] = 0.0; + gain = 1.0; + freq = 0.0; + reson = 0.0; + currentGain = 1.0; + currentFreq = 0.0; + currentReson = 0.0; + targetGain = 1.0; + targetFreq = 0.0; + targetReson = 0.0; + deltaGain = 0.0; + deltaFreq = 0.0; + deltaReson = 0.0; + sweepState = 0; + sweepRate = 0.002; + dirty = 0; + this->clear(); +} + +FormSwep :: ~FormSwep() +{ + free(outputs); +} + +void FormSwep :: clear() +{ + outputs[0] = 0.0; + outputs[1] = 0.0; +} + +void FormSwep :: setPoleCoeffs(MY_FLOAT *coeffs) +{ + dirty = 0; + poleCoeffs[0] = coeffs[0]; + poleCoeffs[1] = coeffs[1]; +} + +void FormSwep :: setFreqAndReson(MY_FLOAT aFreq, MY_FLOAT aReson) +{ + dirty = 0; + reson = aReson; + freq = aFreq; + currentReson = aReson; + currentFreq = aFreq; + poleCoeffs[1] = - (reson * reson); + poleCoeffs[0] = 2.0 * reson * cos(TWO_PI * freq / SRATE); +} + +void FormSwep :: setStates(MY_FLOAT aFreq, MY_FLOAT aReson, MY_FLOAT aGain) +{ + dirty = 0; + freq = aFreq; + reson = aReson; + gain = aGain; + targetFreq = aFreq; + targetReson = aReson; + targetGain = aGain; + currentFreq = aFreq; + currentReson = aReson; + currentGain = aGain; +} + +void FormSwep :: setTargets(MY_FLOAT aFreq, MY_FLOAT aReson, MY_FLOAT aGain) +{ + dirty = 1; + targetFreq = aFreq; + targetReson = aReson; + targetGain = aGain; + deltaFreq = aFreq - currentFreq; + deltaReson = aReson - currentReson; + deltaGain = aGain - currentGain; + sweepState = 0.0; +} + +void FormSwep :: setSweepRate(MY_FLOAT aRate) +{ + sweepRate = aRate; +} + +void FormSwep :: setGain(MY_FLOAT aValue) +{ + gain = aValue; +} + +MY_FLOAT FormSwep :: tick(MY_FLOAT sample) /* Perform Filter Operation */ +{ + MY_FLOAT temp; + + if (dirty) { + sweepState += sweepRate; + if (sweepState>= 1.0) { + sweepState = 1.0; + dirty = 0; + currentReson = targetReson; + reson = targetReson; + currentFreq = targetFreq; + freq = targetFreq; + currentGain = targetGain; + gain = targetGain; + } + else { + currentReson = reson + (deltaReson * sweepState); + currentFreq = freq + (deltaFreq * sweepState); + currentGain = gain + (deltaGain * sweepState); + } + poleCoeffs[1] = - (currentReson * currentReson); + poleCoeffs[0] = 2.0 * currentReson * cos(TWO_PI * currentFreq / SRATE); + } + + temp = currentGain * sample; + temp += poleCoeffs[0] * outputs[0]; + temp += poleCoeffs[1] * outputs[1]; + outputs[1] = outputs[0]; + outputs[0] = temp; + lastOutput = outputs[0]; + return lastOutput; +} + +/************ Test Main Program *****************/ +/* + +void main() +{ + FormSwep filter; + FILE *fd; + MY_FLOAT temp; + short data; + long i; + + fd = fopen("test.raw","wb"); + + filter.setTargets(100.0,0.99,0.01); + for (i=0;i<20000;i++) { + if (i%100 != 0) temp = 0.0; else temp = 1.0; + data = filter.tick(temp) * 32000.0; + fwrite(&data,2,1,fd); + } + + filter.setTargets(1000.0,0.99,0.01); + for (i=0;i<20000;i++) { + if (i%100 != 0) temp = 0.0; else temp = 1.0; + data = filter.tick(temp) * 32000.0; + fwrite(&data,2,1,fd); + } + + filter.setTargets(500.0,0.9999,0.001); + for (i=0;i<20000;i++) { + if (i%100 != 0) temp = 0.0; else temp = 1.0; + data = filter.tick(temp) * 32000.0; + fwrite(&data,2,1,fd); + } + + fclose(fd); +} +*/ + diff --git a/FormSwep.h b/FormSwep.h new file mode 100644 index 0000000..7a46c83 --- /dev/null +++ b/FormSwep.h @@ -0,0 +1,45 @@ +/*******************************************/ +/* Sweepable Formant (2-pole) */ +/* Filter Class, by Perry R. Cook, 1995-96*/ +/* See books on filters to understand */ +/* more about how this works. Nothing */ +/* out of the ordinary in this version. */ +/*******************************************/ + +#if !defined(__FormSwep_h) +#define __FormSwep_h + +#include "Filter.h" + +class FormSwep : public Filter +{ + protected: + MY_FLOAT poleCoeffs[2]; + MY_FLOAT freq; + MY_FLOAT reson; + int dirty; + MY_FLOAT targetFreq; + MY_FLOAT targetReson; + MY_FLOAT targetGain; + MY_FLOAT currentFreq; + MY_FLOAT currentReson; + MY_FLOAT currentGain; + MY_FLOAT deltaFreq; + MY_FLOAT deltaReson; + MY_FLOAT deltaGain; + MY_FLOAT sweepState; + MY_FLOAT sweepRate; + public: + FormSwep(); + ~FormSwep(); + void clear(); + void setPoleCoeffs(MY_FLOAT *coeffs); + void setGain(MY_FLOAT aValue); + void setFreqAndReson(MY_FLOAT aFreq, MY_FLOAT aReson); + void setStates(MY_FLOAT aFreq, MY_FLOAT aReson, MY_FLOAT aGain); + void setTargets(MY_FLOAT aFreq, MY_FLOAT aReson, MY_FLOAT aGain); + void setSweepRate(MY_FLOAT aRate); + MY_FLOAT tick(MY_FLOAT sample); +}; + +#endif diff --git a/HIERARCH.txt b/HIERARCH.txt new file mode 100644 index 0000000..6c13687 --- /dev/null +++ b/HIERARCH.txt @@ -0,0 +1,125 @@ +Brief Descriptions of Classes in TK96CPP +A ToolKit of Sound Synthesis Classes + and Instruments in C++ +Perry Cook, 1995-96, free distribution for +academic, instructional, tutorial, etc. purposes. +Please read README.txt for more information. + +<-----Building Blocks----->|<----------------Instruments------------------> + +SourcSink Filters Non-Lin ModalSyn FM Physical Sampling PhISM + & Formant + +Object---------------------------Instrmnt----------. + | | | | | | +Envelope| Filter BowTabl | .------------------|---------------------. + | | | JetTabl | | | | | | | | | +ADSR | OneZero ReedTabl| Modal4 | FM4Op---.| | | | PhISEM + | OnePole | | | | || | | | | + ._____| TwoZero .____| Marimba | FM4Alg3 || Plucked Sampler | Maracha + | | TwoPole | Vibraphn| | || Clarinet | | Whistle +Noise | DCBlock LipFilt AgogoBel| HeavyMtl|| Brass SamplFlt| VibraSlp + | | BiQuad | || Flute | | Tambourn +SubNoise| AllPass1 .____| .____|| Bowed Moog1 | + | DLineA | | || | + ._____| DLineL VoicForm FM4Alg4 ||____. | + | | DLineN | | | | +RawWave | FormSwep PercFlut| Plucked2 | + | | | | + ._____| .____| Mandolin .____| + | | | | | +RawLoop | FM4Alg5 | DrumSynt + | | | + ._____| Rhodey | + | | Wurley | +NiWave1S| TubeBell | + | .____| + ._____| | | + | | FM4Alg6 | +Modulatr| | | + | FMVoices| + ._____| | + | | .____| +SingWave| | + | FM4Alg8 + ._____| | + | | BeeThree +RawWvOut| + | + ._____| + | | +RawWvIn | + ._____| + | +NIFileIn + +********** Instruments and Algorithms ************** +Each Class will be listed either with all UGs it uses, +or the <> of which it is a flavor. +All inherit from Instrmnt, which inherits from Object. + +Plucked.cpp Basic Plucked String DLineA,OneZero,OnePole,Noise +Plucked2.cpp Not so Basic Pluck DLineL,DlineA,OneZero +Mandolin.cpp My Own Mandolin <> +Bowed.cpp Not Hideous Bowed String DlineL,BowTabl,OnePole,BiQuad,RawWave,ADSR +Brass.cpp Not So Bad Brass Inst. DLineA,LipFilt,DCBlock,ADSR,BiQuad +Clarinet.cpp Pretty Good Clarinet DLineL,ReedTabl,OneZero,Envelope,Noise.h +Flute.cpp Pretty Good Flute JetTabl,DLineL,OnePole,DCBlock,Noise,ADSR,RawWave +Modal4.cpp 4 Resonances Envelope,RawWave,BiQuad,OnePole +Marimba.cpp <> +Vibraphn.cpp <> +Agogobel.cpp <> +FM4Op.cpp 4 Operator FM Master ADSR,RawLoop,TwoZero +FM4Alg3.cpp 3 Cascade w/ FB Mod. <> +FM4Alg4.cpp Like Alg3 but diff. <> +FM4Alg5.cpp 2 Parallel Simple FMs <> +FM4Alg6.cpp 3 Carr. with 1 Mod. <> +FM4Alg8.cpp 4 Osc. Additive <> +HeavyMtl.cpp Distorted Synth <> +PercFlut.cpp Perc. Flute <> +Rhodey.cpp Rhodes-Like Elec. Piano <> +Wurley.cpp Wurlitz. Elec. Piano <> +TubeBell.cpp Classic FM Bell <> +FMVoices.cpp 3-Formant Voice Synth. <> +BeeThree.cpp Cheezy Organ for Paul <> +Sampler.cpp Sampling Synth. 4 each ADSR, RawWave (att), RawWave (loop), OnePole +SamplFlt.cpp Sampler with Swept Filt.<> +Moog1.cpp Swept filter flavor of <> +Voicform.cpp Source/Filter Voice Envelope,Noise,SingWave,FormSwep,OnePole,OneZero +DrumSynt.cpp Drum Synthesizer bunch of NIFileIn, and OnePole + +*********** Basic Unit Generators ************** + +Master Object: Object.cpp for compatibility with Objective C + +Source&Sink: RawWave.cpp Lin-Interp Wavetable, Looped or 1 Shot + NIWave1S.cpp Non-Interp Wavetable, 1 Shot + RawLoop.cpp Lin-Interp Wavetable, Looping + RawWvIn.cpp Lin-Interp Wave In streaming 'device' + NIFileIn.cpp Non-Interp Wave In streamer, closes & opens + RawWvOut.cpp Non-Interp Wave Out streaming 'device' + Envelope.cpp Linearly Goes to Target by Rate, + noteOn/Off + ADSR.cpp ADSR Flavor of Envelope + Noise.cpp Random Number Generator + SubNoise.cpp Random Numbers each N samples + +Filters: Filter.cpp Filter Master Class + OneZero.cpp One Zero Filter + OnePole.cpp One Pole Filter + AllPass1.cpp 1st Order All-Pass (phase) Filter + DCBlock.cpp DC Blocking 1Pole/1Zero Filter + TwoZero.cpp Two Zero Filter + TwoPole.cpp Two Pole Filter + BiQuad.cpp 2Pole/2Zero Filter + FormSwep.cpp Sweepable 2Pole filter, go to target by rate + DLineL.cpp Linearly Interpolating Delay Line + DLineA.cpp AllPass Interpolating Delay Line + DLineN.cpp Non Interpolating Delay Line + +NonLin&Lookup: JetTabl.cpp Cubic Jet NonLinearity + BowTabl.cpp 1/x^3-like Bow NonLinearity + ReedTabl.cpp 1 break point Reed NonLinearity + LipFilt.cpp Pressure Controlled BiQuad with NonLin + +Derived: Modulatr.cpp Per. and Rnd. Vibrato: RawWave,SubNoise,OnePole + SingWave.cpp Looping Wavetable with: Modulatr,Envelope diff --git a/HeavyMtl.cpp b/HeavyMtl.cpp new file mode 100644 index 0000000..230c3c1 --- /dev/null +++ b/HeavyMtl.cpp @@ -0,0 +1,60 @@ +/******************************************/ +/* Heavy Metal Synth Subclass */ +/* of Algorithm 3 (TX81Z) Subclass of */ +/* 3 Operator FM Synth */ +/* by Perry R. Cook, 1995-96 */ +/******************************************/ + +#include "HeavyMtl.h" + +HeavyMtl :: HeavyMtl() : FM4Alg3() +{ + this->loadWaves("rawwaves/sinewave.raw", + "rawwaves/twopeaks.raw", + "rawwaves/twopeaks.raw", + "rawwaves/sinewave.raw"); + + this->setRatio(0,1.00 ); + this->setRatio(1,4.00 * 0.999); + this->setRatio(2,3.00 * 1.001); + this->setRatio(3,0.50 * 1.002); + gains[0] = __FM4Op_gains[92]; + gains[1] = __FM4Op_gains[76]; + gains[2] = __FM4Op_gains[91]; + gains[3] = __FM4Op_gains[68]; + adsr[0]->setAll(0.050,0.0100,1.0,0.001); + adsr[1]->setAll(0.050,0.0010,1.0,0.0001); + adsr[2]->setAll(0.001,0.0020,1.0,0.0002); + adsr[3]->setAll(0.050,0.0010,0.2,0.0002); + twozero->setGain(2.0); + vibWave->setFreq(5.5); + modDepth = 0.00; +} + +HeavyMtl :: ~HeavyMtl() +{ + +} + +void HeavyMtl :: setFreq(MY_FLOAT frequency) +{ + baseFreq = frequency; + waves[0]->setFreq(baseFreq * ratios[0]); + waves[1]->setFreq(baseFreq * ratios[1]); + waves[2]->setFreq(baseFreq * ratios[2]); + waves[3]->setFreq(baseFreq * ratios[3]); +} + +void HeavyMtl :: noteOn(MY_FLOAT freq, MY_FLOAT amp) +{ + gains[0] = amp * __FM4Op_gains[92]; + gains[1] = amp * __FM4Op_gains[76]; + gains[2] = amp * __FM4Op_gains[91]; + gains[3] = amp * __FM4Op_gains[68]; + this->setFreq(freq); + this->keyOn(); +#if defined(_debug_) + printf("HeavyMtl : NoteOn: Freq=%lf Amp=%lf\n",freq,amp); +#endif +} + diff --git a/HeavyMtl.h b/HeavyMtl.h new file mode 100644 index 0000000..685080f --- /dev/null +++ b/HeavyMtl.h @@ -0,0 +1,22 @@ +/******************************************/ +/* Heavy Metal Synth Subclass */ +/* of Algorithm 3 (TX81Z) Subclass of */ +/* 3 Operator FM Synth */ +/* by Perry R. Cook, 1995-96 */ +/******************************************/ + +#if !defined(__HeavyMtl_h) +#define __HeavyMtl_h + +#include "FM4Alg3.h" + +class HeavyMtl : public FM4Alg3 +{ + public: + HeavyMtl(); + ~HeavyMtl(); + virtual void setFreq(MY_FLOAT frequency); + virtual void noteOn(MY_FLOAT freq, MY_FLOAT amp); +}; + +#endif diff --git a/Instrmnt.cpp b/Instrmnt.cpp new file mode 100644 index 0000000..46b59fc --- /dev/null +++ b/Instrmnt.cpp @@ -0,0 +1,35 @@ +/******************************************/ +/* Instrument SuperClass for Toolkit96 */ +/* Perry R. Cook, Princeton University */ +/******************************************/ + +#include "Instrmnt.h" + +Instrmnt :: Instrmnt() +{ +} + +void Instrmnt :: noteOn(MY_FLOAT freq, MY_FLOAT amp) +{ +} + +void Instrmnt :: noteOff(MY_FLOAT amp) +{ +} + +void Instrmnt :: setFreq(MY_FLOAT freq) +{ +} + +MY_FLOAT Instrmnt :: tick() +{ +} + +MY_FLOAT Instrmnt :: lastOut() +{ + return lastOutput; +} + +void Instrmnt :: controlChange(int number, MY_FLOAT value) +{ +} diff --git a/Instrmnt.h b/Instrmnt.h new file mode 100644 index 0000000..db604d4 --- /dev/null +++ b/Instrmnt.h @@ -0,0 +1,25 @@ +/******************************************/ +/* Instrument SuperClass for Toolkit96 */ +/* Perry R. Cook, Princeton University */ +/******************************************/ + +#if !defined(__Instrmnt_h) +#define __Instrmnt_h + +#include "Object.h" + +class Instrmnt : public Object +{ + protected: + MY_FLOAT lastOutput; + public: + Instrmnt(); + MY_FLOAT lastOut(); + virtual void noteOn(MY_FLOAT freq, MY_FLOAT amp); + virtual void noteOff(MY_FLOAT amp); + virtual void setFreq(MY_FLOAT frequency); + virtual MY_FLOAT tick(); + virtual void controlChange(int number, MY_FLOAT value); +}; + +#endif diff --git a/JetTabl.cpp b/JetTabl.cpp new file mode 100644 index 0000000..373f813 --- /dev/null +++ b/JetTabl.cpp @@ -0,0 +1,36 @@ +/**********************************************/ +/* Jet Table Object by Perry R. Cook, 1995-96 */ +/* Consult Fletcher and Rossing, Karjalainen, */ +/* Cook, more, for information. */ +/* This, as with many other of my "tables", */ +/* is not a table, but is computed by poly- */ +/* nomial calculation. */ +/**********************************************/ + +#include "JetTabl.h" + +JetTabl :: JetTabl() +{ + lastOutput = 0.0; +} + +JetTabl :: ~JetTabl() +{ +} + +MY_FLOAT JetTabl :: lookup(double sample) /* Perform "Table Lookup" */ +{ /* By Polynomial Calculation */ + lastOutput = sample * + (sample*sample - 1.0); /* (x^3 - x) approximates sigmoid of jet */ + if (lastOutput > 1.0) + lastOutput = 1.0; /* Saturation at +/- 1.0 */ + if (lastOutput < -1.0) + lastOutput = -1.0; + return lastOutput; +} + +MY_FLOAT JetTabl :: lastOut() +{ + return lastOutput; +} + diff --git a/JetTabl.h b/JetTabl.h new file mode 100644 index 0000000..bb80376 --- /dev/null +++ b/JetTabl.h @@ -0,0 +1,22 @@ +/**********************************************/ +/* Jet Table Object by Perry R. Cook, 1995-96 */ +/* Consult Fletcher and Rossing, Karjalainen, */ +/* Cook, more, for information. */ +/* This, as with many other of my "tables", */ +/* is not a table, but is computed by poly- */ +/* nomial calculation. */ +/**********************************************/ + +#include "Object.h" + +class JetTabl : public Object +{ + protected: + double lastOutput; + public: + JetTabl(); + ~JetTabl(); + double lookup(double deltaP); + double lastOut(); +}; + diff --git a/Lacrymosa b/Lacrymosa new file mode 100755 index 0000000..a31dad3 --- /dev/null +++ b/Lacrymosa @@ -0,0 +1 @@ +time textVoic =100.00 lll ahh ...... =133 .... xxx rrr + + eee .. mmm + ohh ..... sss ahh ..... ddd - eee .. - - ... + + ehh .. + ... sss - - - eee ..... lll =100.0 ahh ....... diff --git a/LipFilt.cpp b/LipFilt.cpp new file mode 100644 index 0000000..3afddb9 --- /dev/null +++ b/LipFilt.cpp @@ -0,0 +1,66 @@ +/**********************************************/ +/* Lip Filter Object by Perry R. Cook, 1995-96*/ +/* The lip of the brass player has dynamics */ +/* which are controlled by the mass, spring */ +/* constant, and damping of the lip. This */ +/* filter simulates that behavior and the */ +/* transmission/reflection properties as */ +/* well. See Cook TBone and HosePlayer */ +/* instruments and articles. */ +/**********************************************/ + +#include "LipFilt.h" + +LipFilt :: LipFilt() +{ + MY_FLOAT coeffs[2]; + filter = new BiQuad; + coeffs[0] = 0.0; + coeffs[1] = 0.0; + filter->setZeroCoeffs(coeffs); + this->clear(); +} + +LipFilt :: ~LipFilt() +{ + delete filter; +} + +void LipFilt :: clear() +{ + filter->clear(); + lastOutput = 0.0; +} + +void LipFilt :: setFreq(MY_FLOAT frequency) +{ + MY_FLOAT coeffs[2]; + coeffs[0] = 2.0 * 0.997 * + cos(TWO_PI * frequency / SRATE); /* damping should change with */ + coeffs[1] = -0.997 * 0.997; /* lip parameters, but not yet.*/ + filter->setPoleCoeffs(coeffs); + filter->setGain(0.03); +} + +/* NOTE: Here we should add lip tension */ +/* settings based on Mass/Spring/Damping */ +/* Maybe in TookKit97 */ + +MY_FLOAT LipFilt :: tick(MY_FLOAT mouthSample,MY_FLOAT boreSample) + /* Perform "Table Lookup" By Polynomial Calculation */ +{ + MY_FLOAT temp; + temp = mouthSample - boreSample; /* Differential pressure */ + temp = filter->tick(temp); /* Force -> position */ + temp = temp*temp; /* Simple position to area mapping */ + if (temp > 1.0) temp = 1.0; /* Saturation at + 1.0 */ + lastOutput = temp * mouthSample; /* Assume mouth input = area */ + lastOutput += (1.0 - temp) * boreSample; /* and Bore reflection is compliment. */ + return lastOutput; +} + +MY_FLOAT LipFilt :: lastOut() +{ + return lastOutput; +} + diff --git a/LipFilt.h b/LipFilt.h new file mode 100644 index 0000000..23a891e --- /dev/null +++ b/LipFilt.h @@ -0,0 +1,28 @@ +/**********************************************/ +/* Lip Filter Object by Perry R. Cook, 1995-96*/ +/* The lip of the brass player has dynamics */ +/* which are controlled by the mass, spring */ +/* constant, and damping of the lip. This */ +/* filter simulates that behavior and the */ +/* transmission/reflection properties as */ +/* well. See Cook TBone and HosePlayer */ +/* instruments and articles. */ +/**********************************************/ + +#include "Object.h" +#include "BiQuad.h" + +class LipFilt : public Object +{ + protected: + BiQuad *filter; + MY_FLOAT lastOutput; + public: + LipFilt(); + ~LipFilt(); + void clear(); + void setFreq(MY_FLOAT frequency); + MY_FLOAT tick(MY_FLOAT mouthSample,MY_FLOAT boreSample); + MY_FLOAT lastOut(); +}; + diff --git a/MIDIInpt.cpp b/MIDIInpt.cpp new file mode 100644 index 0000000..3cc742e --- /dev/null +++ b/MIDIInpt.cpp @@ -0,0 +1,188 @@ +/******************************************/ +/* Simple RealTime MIDI Input Object, */ +/* by Perry R. Cook, 1996 */ +/* */ +/* This object takes MIDI from the input */ +/* , parses it, turns it into TSIDI */ +/* messages, and buffers it up for use by*/ +/* any object that asks for it later. */ +/* */ +/* TSIDI (ToolKit Synthesis Instrument */ +/* Digital Interfaceis like MIDI, but */ +/* allows for floating point control */ +/* changes, note numbers, etc. Example: */ +/* noteOn(1,60.01,111.132) plays a sharp */ +/* middle C with a velocity of 111.132 */ +/* */ +/******************************************/ + +#include "MIDIInpt.h" + +int onePending; +MDport inport; +MDevent lastEvent; + + +// void pollMessage(void *) +// { +// int status; +// while (1) { +// while (onePending == 0) { +// mdReceive(inport, &lastEvent, 1); +// status = mdGetStatus(lastEvent.msg); +// if (status==MD_NOTEON || status==MD_NOTEOFF) +// onePending = 1; +// } +// } +// } + +MIDIInpt :: MIDIInpt() +{ + int nports; + nports = mdInit(); + printf("%d MIDI devices available\n", nports); + inport = mdOpenInPort(0); + if (inport == NULL) { + printf("open failed\n"); + exit(0); + } + mdSetStampMode(inport, MD_NOSTAMP); + onePending = 0; +// midi_pid = sproc(pollMessage, PR_SALL); +// if (midi_pid == -1) +// { +// fprintf(stderr, "unable to create midi input thread...aborting.\n"); +// exit(-1); +// } +} + +#define _BSD_SIGNALS +#include + +MIDIInpt :: ~MIDIInpt() +{ + mdClosePort(inport); +// kill(midi_pid, SIGKILL); +} + +/* MIDI File Code + if (byte > 15) { + if (byte == 248) printf("MIDI Clock,"); + else if (byte == 249) printf("Undefined,"); + else if (byte == 250) printf("Song Start,"); + else if (byte == 251) printf("Continue,"); + else if (byte == 252) printf("Song Stop,"); + else if (byte == 253) printf("Undefined,"); + else if (byte == 254) printf("ActiveSen,"); + else if (byte == 255) printf("SystReset,"); + else printf("BEATSME"); + } + else { + if (byte == 8) printf("NoteOff"); + if (byte == 9) printf("NoteOn"); + if (byte == 10) printf("Poly Pressure"); + if (byte == 11) printf("Control Change"); + if (byte == 12) printf("Program Change"); + if (byte == 13) printf("Channel Pressure"); + if (byte == 14) printf("Pitch Wheel"); + } +*/ + +int MIDIInpt :: nextMessage() +{ + int status; + int byte1; + int byte2; + + messageType = -1; + + mdReceive(inport, &lastEvent, 1); + +// if (onePending == 1) { + + status = mdGetStatus(lastEvent.msg); + byte1 = mdGetByte1(lastEvent.msg); + byte2 = mdGetByte2(lastEvent.msg); + channel = mdGetChannel(lastEvent.msg); + + if (status==MD_NOTEON) { + byteTwo = (float) byte1; + byteThree = (float) byte2; + if (byte2==0) + messageType = 8; + else + messageType = 9; + } + else if (status==MD_NOTEOFF) { + byteTwo = (float) byte1; + byteThree = (float) byte2; + messageType = 8; + } + else if (status==MD_CONTROLCHANGE) { + byteTwo = (float) byte1; + byteThree = (float) byte2; + messageType = 11; + } + else if (status==MD_PROGRAMCHANGE) { + byteTwo = (float) byte1; + messageType = 12; + } + else if (status==MD_CHANNELPRESSURE) { + byteTwo = (float) byte1; + messageType = 13; + } + else if (status==MD_PITCHBENDCHANGE) { + byteTwo = (float) byte1; + byteTwo += (float) byte2 * NORM_7; + messageType = 14; + } + else { + messageType = -1; + } +// onePending = 0; + +// } + + return messageType; +} + +void MIDIInpt :: printMessage() +{ + char buffer[128]; + mdPrintEvent(buffer,&lastEvent,1); + printf(buffer); +} + +int MIDIInpt :: getType() +{ + return messageType; +} + +int MIDIInpt :: getChannel() +{ + return channel; +} + +MY_FLOAT MIDIInpt :: getByteTwo() +{ + return byteTwo; +} + +MY_FLOAT MIDIInpt :: getByteThree() +{ + return byteThree; +} + +/************ Test Main Program *****************/ +/* +void main(int argc,char *argv[]) +{ + MIDIInpt testMIDI; + + while(1) { + if (testMIDI.nextMessage() > 0) + testMIDI.printMessage(); + } +} +*/ + diff --git a/MIDIInpt.h b/MIDIInpt.h new file mode 100644 index 0000000..19d18ab --- /dev/null +++ b/MIDIInpt.h @@ -0,0 +1,48 @@ +/******************************************/ +/* Simple MIDI Text File Reader Class, */ +/* by Perry R. Cook, 1996 */ +/* This Object can open a MIDI Text File */ +/* and parse it. The file spec is mine */ +/* and mine alone, but it's all text so */ +/* you should be able to figure it out. */ +/* */ +/* TSIDI (ToolKit Synthesis Instrument */ +/* Digital Interfaceis like MIDI, but */ +/* allows for floating point control */ +/* changes, note numbers, etc. Example: */ +/* noteOn(1,60.01,111.132) plays a sharp */ +/* middle C with a velocity of 111.132 */ +/* */ +/* Warning: Obey column spacing in the */ +/* text file if you try to edit it or */ +/* create your own files. */ +/******************************************/ + +#if !defined(__MIDIInpt_h) +#define __MIDIInpt_h + +#include "Object.h" +#include "dmedia/midi.h" +#include +#include + +class MIDIInpt : public Object +{ + protected: + int midi_pid; + int messageType; + int channel; + float byteTwo; + float byteThree; + public: + MIDIInpt(); + ~MIDIInpt(); + void printMessage(); + int nextMessage(); + int getType(); + int getChannel(); + MY_FLOAT getByteTwo(); + MY_FLOAT getByteThree(); +}; + +#endif diff --git a/MIDIText.cpp b/MIDIText.cpp new file mode 100644 index 0000000..53cb6dd --- /dev/null +++ b/MIDIText.cpp @@ -0,0 +1,133 @@ +/******************************************/ +/* Simple MIDI Text File Reader Class, */ +/* by Perry R. Cook, 1996 */ +/* This Object can open a MIDI Text File */ +/* and parse it. The file spec is mine */ +/* and mine alone, but it's all text so */ +/* you should be able to figure it out. */ +/* */ +/* SKINI (Synthesis toolKit Instrument */ +/* Network Interface) is like MIDI, but */ +/* allows for floating point control */ +/* changes, note numbers, etc. Example: */ +/* noteOn 60.01 111.132 plays a sharp */ +/* middle C with a velocity of 111.132 */ +/* See SKINI.txt for more information */ +/* Warning: Obey columns in the text */ +/* file if you try to edit it or create */ +/* your own files. */ +/******************************************/ + +#include "MIDIText.h" + +MIDIText :: MIDIText(char *fileName) +{ + myFile = fopen(fileName,"r"); + this->nextMessage(); +} + +MIDIText :: ~MIDIText() +{ +} + +/* MIDI File Codes + if (byte > 15) { + if (byte == 248) printf("MIDI Clock,"); + else if (byte == 249) printf("Undefined,"); + else if (byte == 250) printf("Song Start,"); + else if (byte == 251) printf("Continue,"); + else if (byte == 252) printf("Song Stop,"); + else if (byte == 253) printf("Undefined,"); + else if (byte == 254) printf("ActiveSen,"); + else if (byte == 255) printf("SystReset,"); + else printf("BEATSME"); + } + else { // these are all nybbles of status bytes // + if (byte == 8) printf("NoteOff"); + if (byte == 9) printf("NoteOn"); + if (byte == 10) printf("Poly Pressure"); + if (byte == 11) printf("Control Change"); + if (byte == 12) printf("Program Change"); + if (byte == 13) printf("Channel Pressure"); + if (byte == 14) printf("Pitch Wheel"); + } +*/ + +int MIDIText :: nextMessage() +{ + int notDone = 1,point; + char inputString[1024]; + char tempString[32]; + + while (notDone) { + notDone = 0; + if (fgets(inputString,1000,myFile)) { + sscanf(inputString,"%s %lf %i %f %f",tempString,&deltaTime,&channel,&byteTwo,&byteThree); + point = 5; + if (tempString[0]=='%') point = 1; + if (tempString[point] == 'n') { // NoteO'n' + messageType = 9; + } + else if (inputString[point] == 'f') { // NoteO'f'f + messageType = 8; + } + else if (inputString[point] == 'B') { // Pitch'B'end + byteThree = byteTwo; + messageType = 14; + } + else if (inputString[point] == 'a') { // Progr'a'mChange + messageType = 12; + } + else if (inputString[point] == 'T') { // After'T'ouch + messageType = 11; + } + else if (inputString[point] == 'o') { // Contr'o'lChange + messageType = 11; + } + else if (inputString[0] == '/' || inputString[0] == ' ') { + notDone = 1; + } + } + else { + messageType = -1; + } + } + return messageType; +} + +int MIDIText :: getType() +{ + return messageType; +} + +int MIDIText :: getChannel() +{ + return channel; +} + +MY_FLOAT MIDIText :: getDelta() +{ + return deltaTime; +} + +MY_FLOAT MIDIText :: getByteTwo() +{ + return byteTwo; +} + +MY_FLOAT MIDIText :: getByteThree() +{ + return byteThree; +} + +/************ Test Main Program *****************/ +/* +void main(int argc,char *argv[]) +{ + MIDIText testFile(argv[1]); + + while(testFile.nextMessage() > 0) ; + +} +*/ + diff --git a/MIDIText.h b/MIDIText.h new file mode 100644 index 0000000..0a2aabf --- /dev/null +++ b/MIDIText.h @@ -0,0 +1,46 @@ +/******************************************/ +/* Simple MIDI Text File Reader Class, */ +/* by Perry R. Cook, 1996 */ +/* This Object can open a MIDI Text File */ +/* and parse it. The file spec is mine */ +/* and mine alone, but it's all text so */ +/* you should be able to figure it out. */ +/* */ +/* SKINI (Synthesis toolKit Instrument */ +/* Network Interface) is like MIDI, but */ +/* allows for floating point control */ +/* changes, note numbers, etc. Example: */ +/* noteOn 60.01 111.132 plays a sharp */ +/* middle C with a velocity of 111.132 */ +/* See SKINI.txt for more information */ +/* Warning: Obey columns in the text */ +/* file if you try to edit it or create */ +/* your own files. */ +/******************************************/ + +#if !defined(__MIDIText_h) +#define __MIDIText_h + +#include "Object.h" + +class MIDIText : public Object +{ + protected: + FILE *myFile; + int messageType; + int channel; + MY_FLOAT deltaTime; + float byteTwo; + float byteThree; + public: + MIDIText(char *fileName); + ~MIDIText(); + int nextMessage(); + int getType(); + int getChannel(); + MY_FLOAT getDelta(); + MY_FLOAT getByteTwo(); + MY_FLOAT getByteThree(); +}; + +#endif diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..7760806 --- /dev/null +++ b/Makefile @@ -0,0 +1,247 @@ +O_FILES = Object.o Envelope.o ADSR.o Noise.o SubNoise.o RawWave.o RawLoop.o \ + NIWave1S.o Modulatr.o SingWave.o RawWvOut.o RawWvIn.o Filter.o \ + OneZero.o OnePole.o TwoZero.o TwoPole.o DCBlock.o BiQuad.o AllPass1.o \ + DLineA.o DLineL.o DLineN.o FormSwep.o BowTabl.o JetTabl.o ReedTabl.o \ + LipFilt.o Modal4.o FM4Op.o FM4Alg3.o FM4Alg4.o FM4Alg5.o FM4Alg6.o \ + FM4Alg8.o Plucked2.o SamplFlt.o Sampler.o VoicForm.o\ + MIDIText.o Reverb.o VoicMang.o \ + \ + Instrmnt.o Marimba.o Vibraphn.o AgogoBel.o Plucked.o Mandolin.o \ + Clarinet.o Flute.o Brass.o Bowed.o Rhodey.o Wurley.o TubeBell.o \ + HeavyMtl.o PercFlut.o BeeThree.o FMVoices.o Moog1.o + +RM = /bin/rm + +# This is for NeXT +# CC = cc -O +# INSTR = testMono testMult DrumSynt textVoic + + +# These are for SGI +INSTR = testTextIn testMono testMIDI testMult DrumSynt textVoic + CC = gcc -O + MEDIALINK = -lmd + TCLLIB = /usr/local/lib/libtcl.so.7.4 /usr/local/lib/libtk.so.4.0 /usr/lib/libX11.so + LIBRARY = /usr/lib/libmx.so /usr/lib/libaudio.a + +# .cpp.o: +# $(CC) -c $*.cpp + +all: $(INSTR) + +testTextIn: $(LIBRARY) testTextIn.cpp $(O_FILES) MIDIInpt.o + $(CC) $(MEDIALINK) -o testTextIn testTextIn.cpp $(O_FILES) $(LIBRARY) + +testMono: $(LIBRARY) testMono.cpp $(O_FILES) + $(CC) $(MEDIALINK) -o testMono testMono.cpp $(O_FILES) $(LIBRARY) + +testMIDI: $(LIBRARY) testMIDI.cpp Object.o MIDIInpt.o + $(CC) $(MEDIALINK) -o testMIDI testMIDI.cpp Object.o MIDIInpt.o $(LIBRARY) /usr/lib/libmidi.so + +testMult: $(LIBRARY) testMult.cpp $(O_FILES) + $(CC) $(MEDIALINK) -o testMult testMult.cpp $(O_FILES) $(LIBRARY) + +textVoic: $(LIBRARY) textVoic.cpp $(O_FILES) + $(CC) $(MEDIALINK) -o textVoic textVoic.cpp $(O_FILES) $(LIBRARY) + +Instrmnt.o: Instrmnt.cpp + $(CC) -c Instrmnt.cpp + +Marimba.o: Marimba.cpp + $(CC) -c Marimba.cpp + +Vibraphn.o: Vibraphn.cpp + $(CC) -c Vibraphn.cpp + +AgogoBel.o: AgogoBel.cpp + $(CC) -c AgogoBel.cpp + +Plucked.o: Plucked.cpp + $(CC) -c Plucked.cpp + +Mandolin.o: Mandolin.cpp + $(CC) -c Mandolin.cpp + +Clarinet.o: Clarinet.cpp + $(CC) -c Clarinet.cpp + +Flute.o: Flute.cpp + $(CC) -c Flute.cpp + +Brass.o: Brass.cpp + $(CC) -c Brass.cpp + +Bowed.o: Bowed.cpp + $(CC) -c Bowed.cpp + +Rhodey.o: Rhodey.cpp + $(CC) -c Rhodey.cpp + +Wurley.o: Wurley.cpp + $(CC) -c Wurley.cpp + +TubeBell.o: TubeBell.cpp + $(CC) -c TubeBell.cpp + +HeavyMtl.o: HeavyMtl.cpp + $(CC) -c HeavyMtl.cpp + +PercFlut.o: PercFlut.cpp + $(CC) -c PercFlut.cpp + +BeeThree.o: BeeThree.cpp + $(CC) -c BeeThree.cpp + +FMVoices.o: FMVoices.cpp + $(CC) -c FMVoices.cpp + +Moog1.o: Moog1.cpp + $(CC) -c Moog1.cpp + +DrumSynt: $(LIBRARY) DrumSynt.cpp $(O_FILES) + $(CC) -o DrumSynt DrumSynt.cpp $(O_FILES) $(LIBRARY) + +testVoic: $(LIBRARY) testVoic.cpp $(O_FILES) + $(CC) -o testVoic testVoic.cpp $(O_FILES) $(LIBRARY) + +# $(O_FILES) : +# $(CC) -c -o $@ $*.cpp + +Object.o : Object.cpp + $(CC) -c Object.cpp + +Envelope.o : Envelope.cpp + $(CC) -c Envelope.cpp + +ADSR.o : ADSR.cpp + $(CC) -c ADSR.cpp + +Noise.o : Noise.cpp + $(CC) -c Noise.cpp + +SubNoise.o : SubNoise.cpp + $(CC) -c SubNoise.cpp + +RawWave.o : RawWave.cpp + $(CC) -c RawWave.cpp + +RawLoop.o : RawLoop.cpp + $(CC) -c RawLoop.cpp + +NIWave1S.o : NIWave1S.cpp + $(CC) -c NIWave1S.cpp + +Modulatr.o : Modulatr.cpp + $(CC) -c Modulatr.cpp + +SingWave.o : SingWave.cpp + $(CC) -c SingWave.cpp + +RawWvOut.o : RawWvOut.cpp + $(CC) -c RawWvOut.cpp + +RawWvIn.o : RawWvIn.cpp + $(CC) -c RawWvIn.cpp + +Filter.o : Filter.cpp + $(CC) -c Filter.cpp + +OneZero.o : OneZero.cpp + $(CC) -c OneZero.cpp + +OnePole.o : OnePole.cpp + $(CC) -c OnePole.cpp + +TwoZero.o : TwoZero.cpp + $(CC) -c TwoZero.cpp + +TwoPole.o : TwoPole.cpp + $(CC) -c TwoPole.cpp + +DCBlock.o : DCBlock.cpp + $(CC) -c DCBlock.cpp + +BiQuad.o : BiQuad.cpp + $(CC) -c BiQuad.cpp + +AllPass1.o : AllPass1.cpp + $(CC) -c AllPass1.cpp + +DLineA.o : DLineA.cpp + $(CC) -c DLineA.cpp + +DLineL.o : DLineL.cpp + $(CC) -c DLineL.cpp + +DLineN.o : DLineN.cpp + $(CC) -c DLineN.cpp + +FormSwep.o : FormSwep.cpp + $(CC) -c FormSwep.cpp + +BowTabl.o : BowTabl.cpp + $(CC) -c BowTabl.cpp + +JetTabl.o : JetTabl.cpp + $(CC) -c JetTabl.cpp + +ReedTabl.o : ReedTabl.cpp + $(CC) -c ReedTabl.cpp + +LipFilt.o : LipFilt.cpp + $(CC) -c LipFilt.cpp + +Modal4.o : Modal4.cpp + $(CC) -c Modal4.cpp + +FM4Op.o : FM4Op.cpp + $(CC) -c FM4Op.cpp + +FM4Alg3.o : FM4Alg3.cpp + $(CC) -c FM4Alg3.cpp + +FM4Alg4.o : FM4Alg4.cpp + $(CC) -c FM4Alg4.cpp + +FM4Alg5.o : FM4Alg5.cpp + $(CC) -c FM4Alg5.cpp + +FM4Alg6.o : FM4Alg6.cpp + $(CC) -c FM4Alg6.cpp + +FM4Alg8.o : FM4Alg8.cpp + $(CC) -c FM4Alg8.cpp + +Plucked2.o : Plucked2.cpp + $(CC) -c Plucked2.cpp + +SamplFlt.o : SamplFlt.cpp + $(CC) -c SamplFlt.cpp + +Sampler.o : Sampler.cpp + $(CC) -c Sampler.cpp + +VoicForm.o : VoicForm.cpp + $(CC) -c VoicForm.cpp + +MIDIText.o : MIDIText.cpp + $(CC) -c MIDIText.cpp + +MIDIInpt.o : MIDIInpt.cpp + $(CC) -c MIDIInpt.cpp + +VoicMang.o : VoicMang.cpp + $(CC) -c VoicMang.cpp + +Reverb.o : Reverb.cpp + $(CC) -c Reverb.cpp + +clean : + rm $(INSTR) + rm *.o + +cleanIns : + rm $(INSTR) + +strip : + strip $(INSTR) diff --git a/Mandolin.cpp b/Mandolin.cpp new file mode 100644 index 0000000..e1cfdc4 --- /dev/null +++ b/Mandolin.cpp @@ -0,0 +1,116 @@ +/********************************************/ +/* Commuted Mandolin Subclass of enhanced */ +/* dual plucked-string model */ +/* by Perry Cook, 1995-96 */ +/* Controls: CONTROL1 = bodySize */ +/* CONTROL2 = pluckPosition */ +/* CONTROL3 = loopGain */ +/* MOD_WHEEL= deTuning */ +/* */ +/* Note: Commuted Synthesis, as with many */ +/* other WaveGuide techniques, is covered */ +/* by patents, granted, pending, and/or */ +/* applied-for. Many are assigned to the */ +/* Board of Trustees, Stanford University. */ +/* For information, contact the Office of */ +/* Technology Licensing, Stanford U. */ +/********************************************/ + +#include "Mandolin.h" + +Mandolin :: Mandolin(MY_FLOAT lowestFreq) : Plucked2(lowestFreq) +{ + soundfile = new RawWave("rawwaves/mandpluk.raw"); + soundfile->normalize(0.05); /* Empirical hack here */ + soundfile->setLooping(0); + dampTime = 0; + waveDone = 1; +} + +void Mandolin :: pluck(MY_FLOAT amplitude) +{ /* this function gets interesting here, */ + soundfile->reset(); /* because pluck may be longer than */ + pluckAmp = amplitude; /* string length, so we just reset the */ + /* soundfile and add in the pluck in */ + /* the tick method. */ + combDelay->setDelay( + 0.5 * pluckPos * lastLength); /* Set Pick Position */ + /* which puts zeroes at pos*length */ + dampTime = (long) lastLength; /* See tick method below */ + waveDone = 0; +} + +void Mandolin :: pluck(MY_FLOAT amplitude, MY_FLOAT position) +{ + pluckPos = position; /* pluck position is zeroes at pos*length */ + this->pluck(amplitude); +} + +void Mandolin :: noteOn(MY_FLOAT freq, MY_FLOAT amp) +{ + this->setFreq(freq); + this->pluck(amp); +#if defined(_debug_) + printf("Mandolin : NoteOn: Freq=%lf Amp=%lf\n",freq,amp); +#endif +} + +void Mandolin :: setBodySize(MY_FLOAT size) +{ + soundfile->setRate(size); +} + +MY_FLOAT Mandolin :: tick() +{ + MY_FLOAT temp = 0; + if (!waveDone) { + waveDone = soundfile->informTick(); /* as long as it goes . . . */ + temp = soundfile->lastOut() * pluckAmp; /* scaled pluck excitation */ + temp = temp - combDelay->tick(temp); /* with comb filtering */ + } + if (dampTime>=0) { /* Damping hack to help avoid */ + dampTime -= 1; /* overflow on replucking */ + lastOutput = delayLine->tick( /* Calculate 1st delay */ + filter->tick( /* filterered reflection */ + temp + /* plus pluck excitation */ + (delayLine->lastOut() * 0.7))); + lastOutput += delayLine2->tick( /* and 2nd delay */ + filter2->tick( /* just like the 1st */ + temp + + (delayLine2->lastOut() * 0.7))); /* that's the whole thing!! */ + } + else { /* No damping hack after 1 period */ + lastOutput = delayLine->tick( /* Calculate 1st delay */ + filter->tick( /* filtered reflection */ + temp + /* plus pluck excitation */ + (delayLine->lastOut() + * loopGain))); + lastOutput += delayLine2->tick( /* and 2nd delay */ + filter2->tick( /* just like the 1st */ + temp + + (delayLine2->lastOut() + * loopGain))); + } + lastOutput *= 2.0; + return lastOutput; +} + +void Mandolin :: controlChange(int number, MY_FLOAT value) +{ +#if defined(_debug_) + printf("Mandolin : ControlChange: Number=%i Value=%f\n",number,value); +#endif + if (number == MIDI_control1) + this->setBodySize(value * NORM_7 * 2.0); + else if (number == MIDI_control2) + this->setPluckPos(value * NORM_7); + else if (number == MIDI_control3) + this->setBaseLoopGain(0.97 + (value * NORM_7 * 0.03)); + else if (number == MIDI_mod_wheel) + this->setDetune(1.0 - (value * NORM_7 * 0.1)); + else if (number == MIDI_after_touch) + this->pluck(value * NORM_7); + else { + printf("Mandolin : Undefined Control Number!!\n"); + } +} diff --git a/Mandolin.h b/Mandolin.h new file mode 100644 index 0000000..77b1d4f --- /dev/null +++ b/Mandolin.h @@ -0,0 +1,41 @@ +/********************************************/ +/* Commuted Mandolin Subclass of enhanced */ +/* dual plucked-string model */ +/* by Perry Cook, 1995-96 */ +/* Controls: CONTROL1 = bodySize */ +/* CONTROL2 = pluckPosition */ +/* CONTROL3 = loopGain */ +/* MOD_WHEEL= deTuning */ +/* */ +/* Note: Commuted Synthesis, as with many */ +/* other WaveGuide techniques, is covered */ +/* by patents, granted, pending, and/or */ +/* applied-for. All are assigned to the */ +/* Board of Trustees, Stanford University. */ +/* For information, contact the Office of */ +/* Technology Licensing, Stanford U. */ +/********************************************/ + +#if !defined(__Mandolin_h) +#define __Mandolin_h + +#include "Plucked2.h" +#include "RawWave.h" + +class Mandolin : public Plucked2 +{ + protected: + RawWave *soundfile; + long dampTime; + int waveDone; + public: + Mandolin(MY_FLOAT lowestFreq); + void pluck(MY_FLOAT amplitude); + void pluck(MY_FLOAT amplitude,MY_FLOAT position); + virtual void noteOn(MY_FLOAT freq, MY_FLOAT amp); + void setBodySize(MY_FLOAT size); + virtual void controlChange(int number, MY_FLOAT value); + virtual MY_FLOAT tick(); +}; + +#endif diff --git a/Marimba.cpp b/Marimba.cpp new file mode 100644 index 0000000..cfa97d1 --- /dev/null +++ b/Marimba.cpp @@ -0,0 +1,111 @@ +/*******************************************/ +/* Marimba SubClass of Modal4 Instrument, */ +/* by Perry R. Cook, 1995-96 */ +/* */ +/* Controls: CONTROL1 = stickHardness */ +/* CONTROL2 = strikePosition*/ +/* CONTROL3 = vibFreq */ +/* MOD_WHEEL= vibAmt */ +/*******************************************/ + +#include "Marimba.h" + +Marimba :: Marimba() : Modal4() +{ + wave = new RawWave("rawwaves/marmstk1.raw"); + wave->normalize(); + wave->setRate(0.5); /* normal stick */ + this->setRatioAndReson(0, 1.00,0.9996); /* Set all 132.0 */ + this->setRatioAndReson(1, 3.99,0.9994); /* of our 523.0 */ + this->setRatioAndReson(2,10.65,0.9994); /* default 1405.0 */ + this->setRatioAndReson(3,-18.50,0.999); /* resonances 2443.0 */ + this->setFiltGain(0,0.08); /* and */ + this->setFiltGain(1,0.02); /* gains */ + this->setFiltGain(2,0.02); /* for each */ + this->setFiltGain(3,0.015); /* resonance */ + directGain = 0.1; + multiStrike = 0; +} + +Marimba :: ~Marimba() +{ +} + +void Marimba :: setStickHardness(MY_FLOAT hardness) +{ + stickHardness = hardness; + wave->setRate(0.25 * pow(4.0,stickHardness)); + masterGain = 0.1 + (1.8 * stickHardness); +} + +void Marimba :: setStrikePosition(MY_FLOAT position) +{ + MY_FLOAT temp,temp2; + temp2 = position * PI; + strikePosition = position; /* Hack only first three modes */ + temp = sin(temp2); + this->setFiltGain(0,0.12 * temp); /* 1st mode function of pos. */ + temp = sin(0.05 + (3.9 * temp2)); + this->setFiltGain(1,-0.03 * temp); /* 2nd mode function of pos. */ + temp = sin(-0.05 + (11 * temp2)); + this->setFiltGain(2,0.11 * temp); /* 3rd mode function of pos. */ +} + +void Marimba :: setModulationSpeed(MY_FLOAT mSpeed) +{ + /* don't bother here, marimba decay so fast, mod doesn't make sense */ +} + +void Marimba :: setModulationDepth(MY_FLOAT mDepth) +{ +} + +void Marimba :: strike(MY_FLOAT amplitude) +{ + int temp; + temp = random() >> 26; + if (temp < 2) { + multiStrike = 1; +#if defined(_debug_) + printf("striking twice here!!\n"); +#endif + } + else if (temp < 1) { + multiStrike = 2; +#if defined(_debug_) + printf("striking three times here!!!\n"); +#endif + } + else multiStrike = 0; + Modal4::strike(amplitude); +} + +void Marimba :: controlChange(int number, MY_FLOAT value) +{ +#if defined(_debug_) + printf("Marimba : ControlChange: Number=%i Value=%f\n",number,value); +#endif + if (number == MIDI_control1) + this->setStickHardness(value * NORM_7); + else if (number == MIDI_control2) + this->setStrikePosition(value * NORM_7); + else if (number == MIDI_control3) + vibr->setFreq((value * NORM_7 * 12.0)); + else if (number == MIDI_mod_wheel) + vibrGain = (value * NORM_7); + else if (number == MIDI_after_touch) + this->strike(value * NORM_7); + else { + printf("Marimba : Undefined Control Number!!\n"); + } +} + +MY_FLOAT Marimba :: tick() +{ + if (multiStrike>0) + if (wave->isAllDone()) { + wave->reset(); + multiStrike -= 1; + } + return Modal4::tick(); +} diff --git a/Marimba.h b/Marimba.h new file mode 100644 index 0000000..8e02111 --- /dev/null +++ b/Marimba.h @@ -0,0 +1,32 @@ +/*******************************************/ +/* Marimba SubClass of Modal4 Instrument, */ +/* by Perry R. Cook, 1995-96 */ +/* */ +/* Controls: CONTROL1 = stickHardness */ +/* CONTROL2 = strikePosition*/ +/* CONTROL3 = vibFreq */ +/* MOD_WHEEL= vibAmt */ +/*******************************************/ + +#if !defined(__Marimba_h) +#define __Marimba_h + +#include "Modal4.h" + +class Marimba : public Modal4 +{ + private: + int multiStrike; + public: + Marimba(); + ~Marimba(); + void setStickHardness(MY_FLOAT hardness); + void setStrikePosition(MY_FLOAT position); + void setModulationSpeed(MY_FLOAT mSpeed); + void setModulationDepth(MY_FLOAT mDepth); + virtual void strike(MY_FLOAT amplitude); + virtual void controlChange(int number, MY_FLOAT value); + virtual MY_FLOAT tick(); +}; + +#endif diff --git a/Modal4.cpp b/Modal4.cpp new file mode 100644 index 0000000..1ddd19e --- /dev/null +++ b/Modal4.cpp @@ -0,0 +1,187 @@ +/*******************************************/ +/* 4 Resonance Modal Synthesis Instrument */ +/* by Perry R. Cook, 1995-96 */ +/* This instrument contains an excitation */ +/* wavetable, an envelope, and four reso- */ +/* nances (Non-Sweeping BiQuad Filters). */ +/*******************************************/ + +#include "Modal4.h" + +Modal4 :: Modal4() +{ + envelope = new Envelope; + /* We don't make the excitation wave here yet, */ + /* because we don't know what it's going to be. */ + filters[0] = new BiQuad; + filters[1] = new BiQuad; + filters[2] = new BiQuad; + filters[3] = new BiQuad; + onepole = new OnePole; + + vibr = new RawLoop("rawwaves/sinewave.raw"); + vibr->normalize(); + vibr->setFreq(6.0); + vibrGain = 0.05; + + directGain = 0.0; + masterGain = 1.0; + baseFreq = 440.0; + this->setRatioAndReson(0,1.00,0.9997); /* Set some */ + this->setRatioAndReson(1,1.30,0.9997); /* silly */ + this->setRatioAndReson(2,1.77,0.9997); /* default */ + this->setRatioAndReson(3,2.37,0.9997); /* values here */ + this->setFiltGain(0,0.01); + this->setFiltGain(1,0.01); + this->setFiltGain(2,0.01); + this->setFiltGain(3,0.01); + this->clear(); + filters[0]->setEqualGainZeroes(); + filters[1]->setEqualGainZeroes(); + filters[2]->setEqualGainZeroes(); + filters[3]->setEqualGainZeroes(); + stickHardness = 0.5; + strikePosition = 0.561; +} + +Modal4 :: ~Modal4() +{ + delete envelope; + delete wave; + delete filters[0]; + delete filters[1]; + delete filters[2]; + delete filters[3]; + delete onepole; + delete vibr; +} + +void Modal4 :: clear() +{ + onepole->clear(); + filters[0]->clear(); + filters[1]->clear(); + filters[2]->clear(); + filters[3]->clear(); +} + +void Modal4 :: setFreq(MY_FLOAT frequency) +{ + baseFreq = frequency; + this->setRatioAndReson(0,ratios[0],resons[0]); + this->setRatioAndReson(1,ratios[1],resons[1]); + this->setRatioAndReson(2,ratios[2],resons[2]); + this->setRatioAndReson(3,ratios[3],resons[3]); +} + +#include + +void Modal4 :: setRatioAndReson(int whichOne, MY_FLOAT ratio,MY_FLOAT reson) +{ + MY_FLOAT temp; + if (ratio*baseFreq < SRATE_OVER_TWO) { + ratios[whichOne] = ratio; + } + else { + temp = ratio; + while (temp*baseFreq > SRATE_OVER_TWO) temp *= 0.5; + ratios[whichOne] = temp; +#if defined(_debug_) + printf("Modal4 : Aliasing would occur here, correcting.\n"); +#endif + } + resons[whichOne] = reson; + if (ratio<0) + temp = -ratio; + else + temp = ratio*baseFreq; + filters[whichOne]->setFreqAndReson(temp,reson); +} + +void Modal4 :: setMasterGain(MY_FLOAT aGain) +{ + masterGain = aGain; +} + +void Modal4 :: setDirectGain(MY_FLOAT aGain) +{ + directGain = aGain; +} + +void Modal4 :: setFiltGain(int whichOne, MY_FLOAT gain) +{ + filters[whichOne]->setGain(gain); +} + +void Modal4 :: strike(MY_FLOAT amplitude) +{ + int i; + MY_FLOAT temp; + envelope->setRate(1.0); + envelope->setTarget(amplitude); + onepole->setPole(1.0 - amplitude); + envelope->tick(); + wave->reset(); + for (i=0;i<4;i++) { + if (ratios[i] < 0) + temp = -ratios[i]; + else + temp = ratios[i] * baseFreq; + filters[i]->setFreqAndReson(temp,resons[i]); + } +} + +void Modal4 :: noteOn(MY_FLOAT freq, MY_FLOAT amp) +{ + this->strike(amp); + this->setFreq(freq); +#if defined(_debug_) + printf("Modal4 : NoteOn: Freq=%lf Amp=%lf\n",freq,amp); +#endif +} + +void Modal4 :: noteOff(MY_FLOAT amp) /* This calls damp, but inverts the */ +{ /* meaning of amplitude. */ + this->damp(1.0 - (amp * 0.03)); /* (high amplitude means fast damping) */ +#if defined(_debug_) + printf("Modal4 : NoteOff: Amp=%lf\n",amp); +#endif +} + +void Modal4 :: damp(MY_FLOAT amplitude) +{ + int i; + MY_FLOAT temp; + for (i=0;i<4;i++) { + if (ratios[i] < 0) + temp = -ratios[i]; + else + temp = ratios[i] * baseFreq; + filters[i]->setFreqAndReson(temp,resons[i]*amplitude); + } +} + +void Modal4 :: controlChange(int number, MY_FLOAT value) +{ +} + +MY_FLOAT Modal4 :: tick() +{ + MY_FLOAT temp,temp2; + temp = masterGain * onepole->tick(wave->tick() * envelope->tick()); + temp2 = filters[0]->tick(temp); + temp2 += filters[1]->tick(temp); + temp2 += filters[2]->tick(temp); + temp2 += filters[3]->tick(temp); + temp2 = temp2 - (temp2 * directGain); + temp2 += directGain * temp; + + if (vibrGain != 0.0) { + temp = 1.0 + (vibr->tick() * vibrGain); /* Calculate AM */ + temp2 = temp * temp2; /* and apply to master out */ + } + + lastOutput = temp2 * 2.0; + return lastOutput; +} + diff --git a/Modal4.h b/Modal4.h new file mode 100644 index 0000000..5b6a54a --- /dev/null +++ b/Modal4.h @@ -0,0 +1,52 @@ +/*******************************************/ +/* 4 Resonance Modal Synthesis Instrument */ +/* by Perry R. Cook, 1995-96 */ +/* This instrument contains an excitation */ +/* wavetable, an envelope, and four reso- */ +/* nances (Non-Sweeping BiQuad Filters). */ +/*******************************************/ + +#if !defined(__Modal4_h) +#define __Modal4_h + +#include "Instrmnt.h" +#include "Envelope.h" +#include "RawWave.h" +#include "RawLoop.h" +#include "BiQuad.h" +#include "OnePole.h" + +class Modal4 : public Instrmnt +{ + protected: + Envelope *envelope; + RawWave *wave; + BiQuad *filters[4]; + OnePole *onepole; + RawLoop *vibr; + MY_FLOAT vibrGain; + MY_FLOAT masterGain; + MY_FLOAT directGain; + MY_FLOAT stickHardness; + MY_FLOAT strikePosition; + MY_FLOAT baseFreq; + MY_FLOAT ratios[4]; + MY_FLOAT resons[4]; + public: + Modal4(); + ~Modal4(); + void clear(); + virtual void setFreq(MY_FLOAT frequency); + void setRatioAndReson(int whichOne, MY_FLOAT ratio, MY_FLOAT reson); + void setMasterGain(MY_FLOAT aGain); + void setDirectGain(MY_FLOAT aGain); + void setFiltGain(int whichOne, MY_FLOAT gain); + virtual void strike(MY_FLOAT amplitude); + virtual void noteOn(MY_FLOAT freq, MY_FLOAT amp); + virtual void noteOff(MY_FLOAT amp); + void damp(MY_FLOAT amplitude); + virtual void controlChange(int number, MY_FLOAT value); + virtual MY_FLOAT tick(); +}; + +#endif diff --git a/Modulatr.cpp b/Modulatr.cpp new file mode 100644 index 0000000..1cbcdfe --- /dev/null +++ b/Modulatr.cpp @@ -0,0 +1,84 @@ +/*******************************************/ +/* Modulator Class, Perry R. Cook, 1995-96*/ +/* This Object combines random and */ +/* periodic modulations to give a nice */ +/* natural human modulation function. */ +/*******************************************/ + +#define POLE_POS 0.999 +#define RND_SCALE 10.0 + +#include "Modulatr.h" + +Modulatr :: Modulatr() +{ + vibwave = new RawWave("rawwaves/sinewave.raw"); + vibwave->normalize(); + vibwave->setFreq(6.0); + vibwave->setLooping(1); + vibAmt = 0.04; + noise = new SubNoise(330); + rndAmt = 0.005; + onepole = new OnePole; + onepole->setPole(POLE_POS); + onepole->setGain(rndAmt * RND_SCALE); +} + +Modulatr :: ~Modulatr() +{ + delete vibwave; + delete noise; + delete onepole; +} + +void Modulatr :: reset() +{ + lastOutput = 0.0; +} + +void Modulatr :: setVibFreq(double vibFreq) +{ + vibwave->setFreq(vibFreq); +} + +void Modulatr :: setVibAmt(double vibAmount) +{ + vibAmt = vibAmount; +} + +void Modulatr :: setRndAmt(double rndAmount) +{ + rndAmt = rndAmount; + onepole->setGain(RND_SCALE * rndAmt); +} + +double Modulatr :: tick() +{ + lastOutput = vibAmt * vibwave->tick(); /* Compute periodic and */ + lastOutput += onepole->tick(noise->tick()); /* random modulations */ + return lastOutput; +} + +double Modulatr :: lastOut() +{ + return lastOutput; +} + +/************ Test Main Program *****************/ +/* +void main() +{ + Modulatr testMod; + FILE *fd; + short data; + long i; + + fd = fopen("test.raw","wb"); + + for (i=0;i<20000;i++) { + data = testMod.tick() * 32000.0; + fwrite(&data,2,1,fd); + } + fclose(fd); +} +*/ diff --git a/Modulatr.h b/Modulatr.h new file mode 100644 index 0000000..a454754 --- /dev/null +++ b/Modulatr.h @@ -0,0 +1,36 @@ +/*******************************************/ +/* Modulator Class, Perry R. Cook, 1995-96*/ +/* This Object combines random and */ +/* periodic modulations to give a nice */ +/* natural human modulation function. */ +/*******************************************/ + +#if !defined(__Modulatr_h) +#define __Modulatr_h + +#include "Object.h" +#include "RawWave.h" +#include "SubNoise.h" +#include "OnePole.h" + +class Modulatr : public Object +{ + protected: + RawWave *vibwave; + SubNoise *noise; + OnePole *onepole; + double vibAmt; + double rndAmt; + double lastOutput; + public: + Modulatr(); + ~Modulatr(); + void reset(); + void setVibFreq(double vibFreq); + void setVibAmt(double vibAmount); + void setRndAmt(double rndAmount); + double tick(); + double lastOut(); +}; + +#endif diff --git a/Moog1.cpp b/Moog1.cpp new file mode 100644 index 0000000..ce8905b --- /dev/null +++ b/Moog1.cpp @@ -0,0 +1,108 @@ +/******************************************/ +/* Test Sampler Subclass of */ +/* Sampling Synthesizer Class */ +/* by Perry R. Cook, 1995-96 */ +/* */ +/* Controls: CONTROL1 = filterQ */ +/* CONTROL2 = filterRate */ +/* CONTROL3 = vibFreq */ +/* MOD_WHEEL= vibAmt */ +/******************************************/ + +#include "Moog1.h" + +Moog1 :: Moog1() : SamplFlt() +{ + attacks[0] = new RawWave("rawwaves/mandpluk.raw"); + loops[0] = new RawWave("rawwaves/impuls20.raw"); + loops[1] = new RawWave("rawwaves/sinewave.raw"); /* Steal one for vibrato */ + attacks[0]->normalize(); + loops[0]->normalize(); + loops[0]->setLooping(1); + loops[1]->normalize(); + loops[1]->setLooping(1); + loops[1]->setFreq(6.122); + adsr->setAll(0.05,0.00003,0.6,0.0002); + filterQ = 0.85; + filterRate = 0.0001; + modDepth = 0.0; +} + +Moog1 :: ~Moog1() +{ + delete attacks[0]; + delete loops[0]; + delete loops[1]; +} + +void Moog1 :: setFreq(MY_FLOAT frequency) +{ + baseFreq = frequency; + attacks[0]->setFreq(baseFreq * 0.01); + loops[0]->setFreq(baseFreq); +} + +void Moog1 :: noteOn(MY_FLOAT freq, MY_FLOAT amp) +{ + MY_FLOAT temp; + + this->setFreq(freq); + this->keyOn(); + attackGain = amp * 0.5; + loopGain = amp; + + temp = filterQ+0.05; + filters[0]->setStates(2000,temp,2.0 * (1.0 - temp)); + filters[1]->setStates(2000,temp,2.0 * (1.0 - temp)); + temp = filterQ+0.099; + filters[0]->setTargets( 0,temp,2.0 * (1.0 - temp)); + filters[1]->setTargets( 0,temp,2.0 * (1.0 - temp)); + filters[0]->setSweepRate(filterRate * RATE_NORM); + filters[1]->setSweepRate(filterRate * RATE_NORM); +#if defined(_debug_) + printf("Moog1 : NoteOn: Freq=%lf Amp=%lf\n",freq,amp); +#endif +} + +void Moog1 :: setModulationSpeed(MY_FLOAT mSpeed) +{ + loops[1]->setFreq(mSpeed); +} + +void Moog1 :: setModulationDepth(MY_FLOAT mDepth) +{ + modDepth = mDepth * 0.5; +} + +void Moog1 :: controlChange(int number, MY_FLOAT value) +{ +#if defined(_debug_) + printf("Moog1 : ControlChange: Number=%i Value=%f\n",number,value); +#endif + if (number == MIDI_control1) + filterQ = 0.80 + (0.1 * value * NORM_7); + else if (number == MIDI_control2) + filterRate = (value * NORM_7 * 0.0002); + else if (number == MIDI_control3) + this->setModulationSpeed(value * NORM_7 * 12.0); + else if (number == MIDI_mod_wheel) + this->setModulationDepth(value * NORM_7); + else if (number == MIDI_after_touch) + adsr->setTarget(value * NORM_7); + else { + printf("Moog1 : Undefined Control Number!!\n"); + } +} + +MY_FLOAT Moog1 :: tick() +{ + MY_FLOAT temp; + + if (modDepth!=0.0) { + temp = loops[1]->tick() * modDepth; + loops[0]->setFreq(baseFreq * (1.0 + temp)); + } + lastOutput = SamplFlt :: tick(); + return lastOutput; +} + diff --git a/Moog1.h b/Moog1.h new file mode 100644 index 0000000..018a296 --- /dev/null +++ b/Moog1.h @@ -0,0 +1,34 @@ +/******************************************/ +/* Moog1 Subclass of */ +/* Sampling Synthesizer Class */ +/* by Perry R. Cook, 1995-96 */ +/* */ +/* Controls: CONTROL1 = filterQ */ +/* CONTROL2 = filterRate */ +/* CONTROL3 = vibFreq */ +/* MOD_WHEEL= vibAmt */ +/******************************************/ + +#if !defined(__Moog1_h) +#define __Moog1_h + +#include "SamplFlt.h" + +class Moog1 : public SamplFlt +{ + private: + MY_FLOAT modDepth; + MY_FLOAT filterQ; + MY_FLOAT filterRate; + public: + Moog1(); + ~Moog1(); + virtual void setFreq(MY_FLOAT frequency); + virtual void noteOn(MY_FLOAT freq, MY_FLOAT amp); + void setModulationSpeed(MY_FLOAT mSpeed); + void setModulationDepth(MY_FLOAT mDepth); + virtual void controlChange(int number, MY_FLOAT value); + virtual MY_FLOAT tick(); +}; + +#endif diff --git a/NIFileIn.cpp b/NIFileIn.cpp new file mode 100644 index 0000000..80a1643 --- /dev/null +++ b/NIFileIn.cpp @@ -0,0 +1,163 @@ +/*******************************************/ +/* NonInterpolating One-Shot Raw Sound- */ +/* file Class, by Perry R. Cook, 1995-96 */ +/* This Object can open a raw 16bit data */ +/* (signed integers) file, and play back */ +/* the data once, with no interpolation */ +/* on playback. Once finished, it closes */ +/* the file, the file is reopened with */ +/* the reset() method. */ +/* This is useful for small memory model, */ +/* applications, or for streaming from */ +/* disk (and generally non real-time */ +/* applications). */ +/*******************************************/ + +#include "NIFileIn.h" + +NIFileIn :: NIFileIn(char *fileName) +{ + long i; + + strcpy(fileNm,fileName); + + myFile = fopen(fileNm,"rb"); + if (!myFile) { + printf("Couldn't find soundfile %s !!!!!!!!\n",fileName); + exit(0); + } + + i = 0; + while (fread(&data,2,1,myFile)) i++; + length = i; + fseek(myFile,0,0); + time = 0.0; + rate = 1.0; + lastTime = 0; + finished = 0; + gain = 1.0; + lastOutput = 0.0; +} + +NIFileIn :: ~NIFileIn() +{ + this->finish(); +} + +void NIFileIn :: reset() +{ + if (finished) { + myFile = fopen(fileNm,"rb"); + } + fseek(myFile,0,0); + + printf("Resetting\n"); + time = 0.0; + lastTime = 0; + finished = 0; + lastOutput = 0.0; +} + +void NIFileIn :: normalize() +{ + this->normalize(1.0); +} + +void NIFileIn :: normalize(MY_FLOAT newPeak) +{ + long i; + FILE *fd; + + gain = 0.0; + + fd = fopen(fileNm,"rb"); + for (i=0;i gain) + gain = fabs(data); + } + if (gain > 0.0) { + gain = newPeak / gain; + } + fclose(fd); +} + +void NIFileIn :: setRate(MY_FLOAT aRate) +{ + rate = aRate; +} + +void NIFileIn :: finish() +{ + finished = 1; + lastOutput = 0.0; + if (myFile) { + fclose(myFile); + myFile = 0; + } +} + +MY_FLOAT NIFileIn :: tick() +{ + this->informTick(); + return lastOutput; +} + +int NIFileIn :: informTick() +{ + long temp; + + if (!finished) { + + time += rate; /* Update current time */ + + if (time >= length) { /* Check for end of sound */ + time = length - 1; /* stick at end */ + finished = 1; /* Information for one-shot use */ + fclose(myFile); + myFile = 0; + } + else { + temp = (long) time; /* Integer part of time address */ + if (temp > lastTime) { /* If we cross next sample time */ + lastTime = temp; + fread(&data,2,1,myFile); /* Snarf next sample from file */ + lastOutput = data * gain; /* And save as non-interpolated data */ + } + } + } + + return finished; +} + +MY_FLOAT NIFileIn :: lastOut() +{ + return lastOutput; +} + +/************ Test Main Program *****************/ +/* +void main() +{ + NIFileIn oneShot("rawwaves/mandpluk.raw"); + FILE *fd; + short data; + long i; + + fd = fopen("test.raw","wb"); + oneShot.setRate(1.0); + while (!oneShot.informTick()) { + data = oneShot.lastOut(); + fwrite(&data,2,1,fd); + } + + oneShot.reset(); + oneShot.setRate(0.5); + for (i=0;i<16384;i++) { + data = oneShot.tick(); + fwrite(&data,2,1,fd); + } + fclose(fd); +} +*/ + diff --git a/NIFileIn.h b/NIFileIn.h new file mode 100644 index 0000000..936747a --- /dev/null +++ b/NIFileIn.h @@ -0,0 +1,47 @@ +/*******************************************/ +/* NonInterpolating One-Shot Raw Sound- */ +/* file Class, by Perry R. Cook, 1995-96 */ +/* This Object can open a raw 16bit data */ +/* (signed integers) file, and play back */ +/* the data once, with no interpolation */ +/* on playback. Once finished, it closes */ +/* the file, the file is reopened with */ +/* the reset() method. */ +/* This is useful for small memory model, */ +/* applications, or for streaming from */ +/* disk (and generally non real-time */ +/* applications). */ +/*******************************************/ + +#if !defined(__NIFileIn_h) +#define __NIFileIn_h + +#include "Object.h" + +class NIFileIn : public Object +{ + protected: + long length; + long lastTime; + int finished; + short data; + char fileNm[128]; + FILE *myFile; + MY_FLOAT rate; + MY_FLOAT time; + MY_FLOAT gain; + MY_FLOAT lastOutput; + public: + NIFileIn(char *fileName); + ~NIFileIn(); + void reset(); + void normalize(); + void normalize(MY_FLOAT newPeak); + void setRate(MY_FLOAT aRate); + void finish(); + MY_FLOAT tick(); + int informTick(); + MY_FLOAT lastOut(); +}; + +#endif diff --git a/NIWave1S.cpp b/NIWave1S.cpp new file mode 100644 index 0000000..d2a75ee --- /dev/null +++ b/NIWave1S.cpp @@ -0,0 +1,119 @@ +/*******************************************/ +/* NonInterpolating One-Shot Raw Sound- */ +/* file Class, by Perry R. Cook, 1995-96 */ +/* This Object can open a raw 16bit data */ +/* (signed integers) file, and play back */ +/* the data once (again when reset), with */ +/* no interpolation on playback. */ +/*******************************************/ + +#include "NIWave1S.h" + +NIWave1S :: NIWave1S(char *fileName) +{ + long i; + short temp; + FILE *fd; + fd = fopen(fileName,"rb"); + if (!fd) { + printf("Couldn't find soundfile %s !!!!!!!!\n",fileName); + exit(0); + } + i = 0; + while (fread(&temp,2,1,fd)) i++; + length = i; + fseek(fd,0,0); + data = (MY_FLOAT *) malloc(MY_FLOAT_SIZE * (length + 1)); + i = 0; + while (fread(&temp,2,1,fd)) { + data[i] = temp; + i++; + } + data[length] = data[length-1]; + fclose(fd); + time = 0.0; + rate = 1.0; +} + +void NIWave1S :: reset() +{ + time = 0.0; + lastOutput = 0.0; +} + +void NIWave1S :: normalize() +{ + this->normalize(1.0); +} + +void NIWave1S :: normalize(MY_FLOAT newPeak) +{ + long i; + MY_FLOAT max = 0.0; + for (i=0;i<=length;i++) + if (fabs(data[i]) > max) + max = fabs(data[i]); + if (max > 0.0) { + max = 1.0 / max; + max *= newPeak; + for (i=0;i<=length;i++) + data[i] *= max; + } +} + +void NIWave1S :: setRate(MY_FLOAT aRate) +{ + rate = aRate; +} + +MY_FLOAT NIWave1S :: tick() +{ + this->informTick(); + return lastOutput; +} + +int NIWave1S :: informTick() +{ + int allDone = 0; + long temp; + + time += rate; /* Update current time */ + + if (time >= length) { /* Check for end of sound */ + time = length-1; /* stick at end */ + allDone = 1; /* Information for one-shot use */ + } + temp = (long) time; /* Integer part of time address */ + lastOutput = data[temp]; /* Get non-interpolated data */ + + return allDone; +} + +MY_FLOAT NIWave1S :: lastOut() +{ + return lastOutput; +} + +/************ Test Main Program *****************/ +/* +void main() +{ + NIWave1S oneShot("rawwaves/mandpluk.raw"); + FILE *fd; + short data; + long i; + + fd = fopen("test.raw","wb"); + for (i=0;i<8192;i++) { + data = oneShot.tick(); + fwrite(&data,2,1,fd); + } + oneShot.reset(); + oneShot.setRate(0.5); + for (i=0;i<16384;i++) { + data = oneShot.tick(); + fwrite(&data,2,1,fd); + } + fclose(fd); +} +*/ diff --git a/NIWave1S.h b/NIWave1S.h new file mode 100644 index 0000000..298abe1 --- /dev/null +++ b/NIWave1S.h @@ -0,0 +1,34 @@ +/*******************************************/ +/* NonInterpolating One-Shot Raw Sound- */ +/* file Class, by Perry R. Cook, 1995-96 */ +/* This Object can open a raw 16bit data */ +/* (signed integers) file, and play back */ +/* the data once (again when reset), with */ +/* no interpolation on playback. */ +/*******************************************/ + +#if !defined(__NIWave1S_h) +#define __NIWave1S_h + +#include "Object.h" + +class NIWave1S : public Object +{ + protected: + long length; + MY_FLOAT *data; + MY_FLOAT rate; + MY_FLOAT time; + MY_FLOAT lastOutput; + public: + NIWave1S(char *fileName); + void reset(); + void normalize(); + void normalize(MY_FLOAT newPeak); + void setRate(MY_FLOAT aRate); + MY_FLOAT tick(); + int informTick(); + MY_FLOAT lastOut(); +}; + +#endif diff --git a/Noise.cpp b/Noise.cpp new file mode 100644 index 0000000..25ad571 --- /dev/null +++ b/Noise.cpp @@ -0,0 +1,52 @@ +/*******************************************/ +/* Noise Generator Class, */ +/* by Perry R. Cook, 1995-96 */ +/* White noise as often as you like. */ +/*******************************************/ + +#include "Noise.h" + +Noise :: Noise() : Object() +{ + lastOutput = 0.0; +} + +Noise :: ~Noise() +{ + +} + +/* THIS IS FOR TURBO C */ +/* Constant = 1.0 / 16384.0 */ +/* #define ONE_OVER_RANDLIMIT 0.00006103516 */ + + +/* THIS IS FOR UNIX, NeXT and SGI */ + #define ONE_OVER_RANDLIMIT 0.00000000093132258 + +MY_FLOAT Noise :: tick() +{ +/* THIS ONE IS TURBO C */ +/* lastOutput = (MY_FLOAT) random(32767) - 16384.0; */ + +/* THIS IS FOR UNIX, NeXT and SGI */ + + lastOutput = (MY_FLOAT) random() - 1073741823.0; + lastOutput *= ONE_OVER_RANDLIMIT; + return lastOutput; +} + +MY_FLOAT Noise :: lastOut() +{ + return lastOutput; +} + +/************ Test Main ************************/ +/* +void main() +{ + long i; + Noise test; + for (i=0;i<20;i++) printf("%lf\n",test.tick()); +} +*/ diff --git a/Noise.h b/Noise.h new file mode 100644 index 0000000..950dc81 --- /dev/null +++ b/Noise.h @@ -0,0 +1,23 @@ +/*******************************************/ +/* Noise Generator Class, */ +/* by Perry R. Cook, 1995-96 */ +/* White noise as often as you like. */ +/*******************************************/ + +#if !defined(__Noise_h) +#define __Noise_h + +#include "Object.h" + +class Noise : public Object +{ + protected: + MY_FLOAT lastOutput; + public: + Noise(); + ~Noise(); + virtual MY_FLOAT tick(); + MY_FLOAT lastOut(); +}; + +#endif diff --git a/Object.cpp b/Object.cpp new file mode 100644 index 0000000..bdb31e8 --- /dev/null +++ b/Object.cpp @@ -0,0 +1,29 @@ +/*******************************************/ +/* Object Class, by Perry R. Cook, 1995-96*/ +/* This is mostly here for compatibility */ +/* with Objective C. We'll also stick */ +/* global defines here, so everyone will */ +/* see them. */ +/*******************************************/ + +#include "Object.h" + + +/* This is just here for compatibility and convenience, + so there's no need to do any real calculations. + I do set up some redefinable variables here. */ + + +Object :: Object() +{ + MIDI_mod_wheel = 1; /* Controller # 1 */ + MIDI_control1 = 2; /* Breath Pressure */ + MIDI_control2 = 4; /* Foot Control */ + MIDI_control3 = 11; /* Expression Pedal */ + MIDI_after_touch = 128; /* Channel Pressure -> new controller */ +} + +Object :: ~Object() +{ +} + diff --git a/Object.h b/Object.h new file mode 100644 index 0000000..f691156 --- /dev/null +++ b/Object.h @@ -0,0 +1,91 @@ +/*******************************************/ +/* Object Class, by Perry R. Cook, 1995-96*/ +/* This is mostly here for compatibility */ +/* with Objective C. We'll also stick */ +/* global defines here, so everyone will */ +/* see them. */ +/*******************************************/ + +#if !defined(__Object_h) +#define __Object_h + +#include +#include +#include +#include + +class Object +{ + public: + int MIDI_control1; + int MIDI_control2; + int MIDI_control3; + int MIDI_mod_wheel; + int MIDI_after_touch; + protected: + Object(); + ~Object(); +}; + +/* Only use one of __SGI_ __NeXT_ __DOS_ */ +/* And choice of __SGI_REALTIME or not */ + + #define __SGI_ + #define __SGI_REALTIME +/* #define __NeXT_ */ + +/* SRATE here is 44100, others are derived accordingly */ +/* #define SRATE 44100.0 + #define SRATE_OVER_TWO 22050.0 + #define ONE_OVER_SRATE 0.00002267573696 + #define RATE_NORM 0.5 +*/ + +/* SRATE here is 22050, others are derived accordingly */ + #define SRATE 22050.0 + #define SRATE_OVER_TWO 11025.0 + #define ONE_OVER_SRATE 0.00004535147392 + #define RATE_NORM 1.0 + + +/* SRATE here is 8k, others are derived accordingly */ +/* #define SRATE 8000.0 + #define SRATE_OVER_TWO 4000 + #define ONE_OVER_SRATE 0.00012500000000 + #define RATE_NORM 2.75625 +*/ +/* RATE_NORM is 22050 / 8000 */ + +/* Yer Basic Trigonometric constants */ +#define PI 3.14159265359 +#define TWO_PI 6.28318530718 +#define ONE_OVER_TWO_PI 0.15915494309 + +/* States for Envelopes, etc. */ + +#define ATTACK 0 +#define DECAY 1 +#define SUSTAIN 2 +#define RELEASE 3 + +/* Machine dependent stuff, possibly useful for optimization */ +/* for example, changing double to float here increases */ +/* performance (speed) by a whopping 4-6% on 486-flavor machines */ +/* BUT!! a change from float to double here increases speed by */ +/* 30% or so on SGI machines */ +/* #define MY_FLOAT float */ +/* #define MY_FLOAT_SIZE 4 */ + +#define MY_FLOAT double +#define MY_FLOAT_SIZE 8 + +/* Debugging define, causes massive printf's to come out. */ +/* Also enables timing calculations in WaveOut class, other stuff. */ +/* #define _debug_ 1 */ + +#include + +#define NORM_7 0.0078125 +/* this is 1/128 for MIDI normalization*/ + +#endif diff --git a/OnePole.cpp b/OnePole.cpp new file mode 100644 index 0000000..6b788de --- /dev/null +++ b/OnePole.cpp @@ -0,0 +1,81 @@ +/*******************************************/ +/* One Pole Filter Class, */ +/* by Perry R. Cook, 1995-96 */ +/* The parameter gain is an additional */ +/* gain parameter applied to the filter */ +/* on top of the normalization that takes */ +/* place automatically. So the net max */ +/* gain through the system equals the */ +/* value of gain. sgain is the combina- */ +/* tion of gain and the normalization */ +/* parameter, so if you set the poleCoeff */ +/* to alpha, sgain is always set to */ +/* gain * (1.0 - fabs(alpha)). */ +/*******************************************/ + +#include "OnePole.h" + +OnePole :: OnePole() : Filter() +{ + poleCoeff = 0.9; + gain = 1.0; + sgain = 0.1; + outputs = (MY_FLOAT *) malloc(MY_FLOAT_SIZE); + outputs[0] = 0.0; +} + +OnePole :: ~OnePole() +{ + free(outputs); +} + +void OnePole :: clear() +{ + outputs[0] = 0.0; + lastOutput = 0.0; +} + +void OnePole :: setPole(MY_FLOAT aValue) +{ + poleCoeff = aValue; + if (poleCoeff > 0.0) /* Normalize gain to 1.0 max */ + sgain = gain * (1.0 - poleCoeff); + else + sgain = gain * (1.0 + poleCoeff); +} + +void OnePole :: setGain(MY_FLOAT aValue) +{ + gain = aValue; + if (poleCoeff > 0.0) + sgain = gain * (1.0 - poleCoeff); /* Normalize gain to 1.0 max */ + else + sgain = gain * (1.0 + poleCoeff); +} + +MY_FLOAT OnePole :: tick(MY_FLOAT sample) /* Perform Filter Operation */ +{ + outputs[0] = (sgain * sample) + (poleCoeff * outputs[0]); + lastOutput = outputs[0]; + return lastOutput; +} + +/************ Test Main ************************/ +/* +#include + +void main() +{ + long i; + OnePole test; + test.setPole(0.99); + for (i=0;i<150;i++) printf("%lf ",test.tick(1.0)); + printf("\n\n"); + + test.clear(); + test.setPole(0.9); + test.setGain(2.0); + for (i=0;i<150;i++) printf("%lf ",test.tick(0.5)); + printf("\n\n"); +} +*/ diff --git a/OnePole.h b/OnePole.h new file mode 100644 index 0000000..282e7fa --- /dev/null +++ b/OnePole.h @@ -0,0 +1,35 @@ +/*******************************************/ +/* One Pole Filter Class, */ +/* by Perry R. Cook, 1995-96 */ +/* The parameter gain is an additional */ +/* gain parameter applied to the filter */ +/* on top of the normalization that takes */ +/* place automatically. So the net max */ +/* gain through the system equals the */ +/* value of gain. sgain is the combina- */ +/* tion of gain and the normalization */ +/* parameter, so if you set the poleCoeff */ +/* to alpha, sgain is always set to */ +/* gain * (1.0 - fabs(alpha)). */ +/*******************************************/ + +#if !defined(__OnePole_h) +#define __OnePole_h + +#include "Filter.h" + +class OnePole : public Filter +{ + protected: + MY_FLOAT poleCoeff; + MY_FLOAT sgain; + public: + OnePole(); + ~OnePole(); + void clear(); + void setPole(MY_FLOAT aValue); + void setGain(MY_FLOAT aValue); + MY_FLOAT tick(MY_FLOAT sample); +}; + +#endif diff --git a/OneZero.cpp b/OneZero.cpp new file mode 100644 index 0000000..d648780 --- /dev/null +++ b/OneZero.cpp @@ -0,0 +1,64 @@ +/*******************************************/ +/* One Zero Filter Class, */ +/* by Perry R. Cook, 1995-96 */ +/* The parameter gain is an additional */ +/* gain parameter applied to the filter */ +/* on top of the normalization that takes */ +/* place automatically. So the net max */ +/* gain through the system equals the */ +/* value of gain. sgain is the combina- */ +/* tion of gain and the normalization */ +/* parameter, so if you set the poleCoeff */ +/* to alpha, sgain is always set to */ +/* gain / (1.0 - fabs(alpha)). */ +/*******************************************/ + +#include "OneZero.h" + +OneZero :: OneZero() +{ + gain = 1.0; + zeroCoeff = 1.0; + sgain = 0.5; + inputs = (MY_FLOAT *) malloc(MY_FLOAT_SIZE); + this->clear(); +} + +OneZero :: ~OneZero() +{ + free(inputs); +} + +void OneZero :: clear() +{ + inputs[0] = 0.0; + lastOutput = 0.0; +} + +void OneZero :: setGain(MY_FLOAT aValue) +{ + gain = aValue; + if (zeroCoeff > 0.0) /* Normalize gain to 1.0 max */ + sgain = gain / (1.0 + zeroCoeff); + else + sgain = gain / (1.0 - zeroCoeff); +} + +void OneZero :: setCoeff(MY_FLOAT aValue) +{ + zeroCoeff = aValue; + if (zeroCoeff > 0.0) /* Normalize gain to 1.0 max */ + sgain = gain / (1.0 + zeroCoeff); + else + sgain = gain / (1.0 - zeroCoeff); +} + +MY_FLOAT OneZero :: tick(MY_FLOAT sample) /* Perform Filter Operation */ +{ + MY_FLOAT temp; + temp = sgain * sample; + lastOutput = (inputs[0] * zeroCoeff) + temp; + inputs[0] = temp; + return lastOutput; +} + diff --git a/OneZero.h b/OneZero.h new file mode 100644 index 0000000..686fff1 --- /dev/null +++ b/OneZero.h @@ -0,0 +1,35 @@ +/*******************************************/ +/* One Zero Filter Class, */ +/* by Perry R. Cook, 1995-96 */ +/* The parameter gain is an additional */ +/* gain parameter applied to the filter */ +/* on top of the normalization that takes */ +/* place automatically. So the net max */ +/* gain through the system equals the */ +/* value of gain. sgain is the combina- */ +/* tion of gain and the normalization */ +/* parameter, so if you set the poleCoeff */ +/* to alpha, sgain is always set to */ +/* gain / (1.0 - fabs(alpha)). */ +/*******************************************/ + +#if !defined(__OneZero_h) +#define __OneZero_h + +#include "Filter.h" + +class OneZero : public Filter +{ + protected: + MY_FLOAT zeroCoeff; + MY_FLOAT sgain; + public: + OneZero(); + ~OneZero(); + void clear(); + void setGain(MY_FLOAT aValue); + void setCoeff(MY_FLOAT aValue); + MY_FLOAT tick(MY_FLOAT sample); +}; + +#endif diff --git a/PercFlut.cpp b/PercFlut.cpp new file mode 100644 index 0000000..ac371fc --- /dev/null +++ b/PercFlut.cpp @@ -0,0 +1,50 @@ +/******************************************/ +/* Percussive Flute Subclass */ +/* of Algorithm 4 (TX81Z) Subclass of */ +/* 4 Operator FM Synth */ +/* by Perry R. Cook, 1995-96 */ +/******************************************/ + +#include "PercFlut.h" + +PercFlut :: PercFlut() : FM4Alg4() +{ + this->loadWaves("rawwaves/sinewave.raw", + "rawwaves/sinewave.raw", + "rawwaves/sinewave.raw", + "rawwaves/sinewave.raw"); + + this->setRatio(0,1.50 ); + this->setRatio(1,3.00 * 0.995); + this->setRatio(2,2.99 * 1.005); + this->setRatio(3,6.00 * 0.997); + gains[0] = __FM4Op_gains[99]; + gains[1] = __FM4Op_gains[71]; + gains[2] = __FM4Op_gains[93]; + gains[3] = __FM4Op_gains[85]; + adsr[0]->setAll(0.001,0.001,__FM4Op_susLevels[14],0.001); + adsr[1]->setAll(0.05,0.0001,__FM4Op_susLevels[13],0.0001); + adsr[2]->setAll(0.05,0.0020,__FM4Op_susLevels[11],0.001); + adsr[3]->setAll(0.05,0.0010,__FM4Op_susLevels[13],0.005); + twozero->setGain(0.0); + modDepth = 0.005; +} + +void PercFlut :: setFreq(MY_FLOAT frequency) +{ + baseFreq = frequency; +} + +void PercFlut :: noteOn(MY_FLOAT freq, MY_FLOAT amp) +{ + gains[0] = amp * __FM4Op_gains[99]; + gains[1] = amp * __FM4Op_gains[71]; + gains[2] = amp * __FM4Op_gains[93]; + gains[3] = amp * __FM4Op_gains[85]; + this->setFreq(freq); + this->keyOn(); +#if defined(_debug_) + printf("PercFlut : NoteOn: Freq=%lf Amp=%lf\n",freq,amp); +#endif +} + diff --git a/PercFlut.h b/PercFlut.h new file mode 100644 index 0000000..96b60b0 --- /dev/null +++ b/PercFlut.h @@ -0,0 +1,21 @@ +/******************************************/ +/* Percussive Flute Subclass */ +/* of Algorithm 4 (TX81Z) Subclass of */ +/* 4 Operator FM Synth */ +/* by Perry R. Cook, 1995-96 */ +/******************************************/ + +#if !defined(__PercFlut_h) +#define __PercFlut_h + +#include "FM4Alg4.h" + +class PercFlut : public FM4Alg4 +{ + public: + PercFlut(); + virtual void setFreq(MY_FLOAT frequency); + virtual void noteOn(MY_FLOAT freq, MY_FLOAT amp); +}; + +#endif diff --git a/PhonTabl.h b/PhonTabl.h new file mode 100644 index 0000000..7ba437e --- /dev/null +++ b/PhonTabl.h @@ -0,0 +1,189 @@ +double phonGains[32][2] = + {{1.0,0.0}, // eee + {1.0,0.0}, // ihh + {1.5,0.0}, // ehh + {1.0,0.0}, // aaa + + {0.5,0.0}, // ahh + {0.5,0.0}, // aww + {0.5,0.0}, // ohh + {0.5,0.0}, // uhh + + {0.5,0.0}, // uuu + {0.15,0.0}, // ooo + {0.15,0.0}, // rrr + {6.0,0.0}, // lll + + {1.0,0.0}, // mmm + {1.0,0.0}, // nnn + {1.0,0.0}, // nng + {1.0,0.0}, // ngg + + {0.0,1.0}, // fff + {0.0,1.0}, // sss + {0.0,1.0}, // thh + {0.0,1.0}, // shh + + {0.0,0.2}, // xxx + {0.0,0.003}, // hee + {0.0,0.001}, // hoo + {0.0,0.002}, // hah + + {1.0,0.4}, // bbb + {4.0,0.1}, // ddd + {1.0,0.4}, // jjj + {1.0,0.4}, // ggg + + {1.0,0.1}, // vvv + {1.0,0.1}, // zzz + {1.0,0.1}, // thz + {1.0,0.1} // zhh +}; + +double phonParams[32][4][3] = + {{ { 273,0.996, 0}, // eee (beet) + {2086,0.945, -16}, + {2754,0.979, -12}, + {3270,0.440, -17}}, + { { 385,0.987, 0}, // ihh (bit) + {2056,0.930, -20}, + {2587,0.890, -20}, + {3150,0.400, -20}}, + { { 515,0.977, 0}, // ehh (bet) + {1805,0.810, -10}, + {2526,0.875, -10}, + {3103,0.400, -13}}, + { { 773,0.950, 0}, // aaa (bat) + {1676,0.830, -6}, + {2380,0.880, -20}, + {3027,0.600, -20}}, + + { { 770,0.950, 0}, // ahh (father) + {1153,0.970, -3}, + {2450,0.780, -20}, + {3140,0.800, -32}}, + { { 637,0.910, 0}, // aww (bought) + { 895,0.900, -3}, + {2556,0.950, -17}, + {3070,0.910, -20}}, + { { 637,0.910, 0}, // ohh (bone) NOTE:: same as aww (bought) + { 895,0.900, -3}, + {2556,0.950, -17}, + {3070,0.910, -20}}, + { { 561,0.965, 0}, // uhh (but) + {1084,0.930, -10}, + {2541,0.930, -15}, + {3345,0.900, -20}}, + + { { 515,0.976, 0}, // uuu (foot) + {1031,0.950, -3}, + {2572,0.960, -11}, + {3345,0.960, -20}}, + { { 349,0.986, 0}, // ooo (boot) + { 918,0.940, -10}, + {2350,0.960, -17}, + {2731,0.950, -23}}, + { { 394,0.959, 0}, // rrr (bird) + {1297,0.780, -6}, + {1441,0.980, -6}, + {2754,0.950, -30}}, + { { 462,0.940, 0}, // lll (lull) + {2754,0.900, -30}, + {3406,0.100, -30}, + {3755,0.100, -30}}, + + { { 265,0.987, 0}, // mmm (mom) + {1176,0.940, -22}, + {2352,0.970, -20}, + {3277,0.940, -31}}, + { { 204,0.980, 0}, // nnn (nun) + {1570,0.940, -15}, + {2481,0.980, -12}, + {3133,0.800, -30}}, + { { 204,0.980, 0}, // nng (sang) NOTE:: same as nnn + {1570,0.940, -15}, + {2481,0.980, -12}, + {3133,0.800, -30}}, + { { 204,0.980, 0}, // ngg (bong) NOTE:: same as nnn + {1570,0.940, -15}, + {2481,0.980, -12}, + {3133,0.800, -30}}, + + { {1000,0.300, -10}, // fff + {2800,0.860, -10}, + {7425,0.740, 0}, + {8140,0.860, 0}}, + { {2000,0.700, -20}, // sss + {5257,0.750, -15}, + {7171,0.840, -3}, + {9000,0.900, 0}}, + { { 100,0.900, 0}, // thh + {4000,0.500, -20}, + {5500,0.500, -15}, + {8000,0.400, -20}}, + { {2693,0.940, 0}, // shh + {4000,0.720, -10}, + {6123,0.870, -10}, + {7755,0.750, -18}}, + + { {1000,0.300, -10}, // xxx NOTE:: Not Really Done Yet + {2800,0.860, -10}, + {7425,0.740, 0}, + {8140,0.860, 0}}, + { { 273,0.996, 0}, // hee (beet) (noisy eee) + {2086,0.945, -16}, + {2754,0.979, -12}, + {3270,0.440, -17}}, + { { 349,0.986, 0}, // hoo (boot) (noisy ooo) + { 918,0.940, -10}, + {2350,0.960, -17}, + {2731,0.950, -23}}, + { { 770,0.950, 0}, // hah (father) (noisy ahh) + {1153,0.970, -3}, + {2450,0.780, -20}, + {3140,0.800, -32}}, + + { {2000,0.700, -20}, // bbb NOTE:: Not Really Done Yet + {5257,0.750, -15}, + {7171,0.840, -3}, + {9000,0.900, 0}}, + { { 100,0.900, 0}, // ddd NOTE:: Not Really Done Yet + {4000,0.500, -20}, + {5500,0.500, -15}, + {8000,0.400, -20}}, + { {2693,0.940, 0}, // jjj NOTE:: Not Really Done Yet + {4000,0.720, -10}, + {6123,0.870, -10}, + {7755,0.750, -18}}, + { {2693,0.940, 0}, // ggg NOTE:: Not Really Done Yet + {4000,0.720, -10}, + {6123,0.870, -10}, + {7755,0.750, -18}}, + + { {2000,0.700, -20}, // vvv NOTE:: Not Really Done Yet + {5257,0.750, -15}, + {7171,0.840, -3}, + {9000,0.900, 0}}, + { { 100,0.900, 0}, // zzz NOTE:: Not Really Done Yet + {4000,0.500, -20}, + {5500,0.500, -15}, + {8000,0.400, -20}}, + { {2693,0.940, 0}, // thz NOTE:: Not Really Done Yet + {4000,0.720, -10}, + {6123,0.870, -10}, + {7755,0.750, -18}}, + { {2693,0.940, 0}, // zhh NOTE:: Not Really Done Yet + {4000,0.720, -10}, + {6123,0.870, -10}, + {7755,0.750, -18}} +}; + +char phonemes[32][4] = + {"eee","ihh","ehh","aaa", + "ahh","aww","ohh","uhh", + "uuu","ooo","rrr","lll", + "mmm","nnn","nng","ngg", + "fff","sss","thh","shh", + "xxx","hee","hoo","hah", + "bbb","ddd","jjj","ggg", + "vvv","zzz","thz","zhh"}; diff --git a/Plucked.cpp b/Plucked.cpp new file mode 100644 index 0000000..ea3cef0 --- /dev/null +++ b/Plucked.cpp @@ -0,0 +1,84 @@ + /******************************************/ +/* Karplus-Strong plucked string model */ +/* by Perry Cook, 1995-96 */ +/* */ +/* There exist at least two patents, */ +/* assigned to Stanford, bearing the */ +/* names of Karplus and/or Strong. */ +/******************************************/ + +#include "Plucked.h" + +Plucked :: Plucked(MY_FLOAT lowestFreq) +{ + length = (long) (SRATE / lowestFreq + 1); + loopGain = 0.999; + delayLine = new DLineA(length); + loopFilt = new OneZero; + pickFilt = new OnePole; + noise = new Noise; + this->clear(); +} + +Plucked :: ~Plucked() +{ + delete delayLine; + delete loopFilt; + delete pickFilt; + delete noise; +} + +void Plucked :: clear() +{ + delayLine->clear(); + loopFilt->clear(); + pickFilt->clear(); +} + +void Plucked :: setFreq(MY_FLOAT frequency) +{ + MY_FLOAT delay; + delay = ((MY_FLOAT) SRATE / frequency) - 0.5; /* length - delays */ + delayLine->setDelay(delay); + loopGain = 0.995 + (frequency * 0.000005); + if (loopGain>1.0) loopGain = 0.99999; +} + +void Plucked :: pluck(MY_FLOAT amplitude) +{ + long i; + pickFilt->setPole(0.999 - (amplitude*0.15)); + pickFilt->setGain(amplitude * 0.5); + for (i=0;itick(delayLine->lastOut() * 0.6 /* fill delay with noise */ + + pickFilt->tick(noise->tick())); /* additively with current */ + /* contents */ +} + +void Plucked :: noteOn(MY_FLOAT freq, MY_FLOAT amp) +{ + this->setFreq(freq); + this->pluck(amp); +#if defined(_debug_) + printf("Plucked : NoteOn: Freq=%lf Amp=%lf\n",freq,amp); +#endif +} + +void Plucked :: noteOff(MY_FLOAT amp) +{ + loopGain = 1.0 - amp; +#if defined(_debug_) + printf("Plucked : NoteOff: Amp=%lf\n",amp); +#endif +} + +MY_FLOAT Plucked :: tick() +{ + lastOutput = delayLine->tick( /* check this out, */ + loopFilt->tick( /* here's the whole inner */ + delayLine->lastOut() /* loop of the instrument!! */ + * loopGain)); + lastOutput *= 3.0; + return lastOutput; +} + diff --git a/Plucked.h b/Plucked.h new file mode 100644 index 0000000..de41457 --- /dev/null +++ b/Plucked.h @@ -0,0 +1,40 @@ +/******************************************/ +/* Karplus-Strong plucked string model */ +/* by Perry Cook, 1995-96 */ +/* */ +/* There exist at least two patents, */ +/* assigned to Stanford, bearing the */ +/* names of Karplus and/or Strong. */ +/******************************************/ + +#if !defined(__Plucked_h) +#define __Plucked_h + +#include "Instrmnt.h" +#include "DLineA.h" +#include "OneZero.h" +#include "OnePole.h" +#include "Noise.h" + +class Plucked : public Instrmnt +{ + protected: + DLineA *delayLine; + OneZero *loopFilt; + OnePole *pickFilt; + Noise *noise; + long length; + MY_FLOAT loopGain; + public: + Plucked(MY_FLOAT lowestFreq); + ~Plucked(); + void clear(); + virtual void setFreq(MY_FLOAT frequency); + void pluck(MY_FLOAT amplitude); + virtual void noteOn(MY_FLOAT freq, MY_FLOAT amp); + virtual void noteOff(MY_FLOAT amp); + virtual MY_FLOAT tick(); +}; + +#endif + diff --git a/Plucked2.cpp b/Plucked2.cpp new file mode 100644 index 0000000..2ebd171 --- /dev/null +++ b/Plucked2.cpp @@ -0,0 +1,90 @@ +/******************************************/ +/* Enhanced (Jaffe-Smith, Smith, others) */ +/* Karplus-Strong plucked model */ +/* by Perry Cook, 1995-96 */ +/* This is the super-class, with no */ +/* excitation specified. So this one by */ +/* itself doesn't make any sound. */ +/******************************************/ + +#include "Plucked2.h" + +Plucked2 :: Plucked2(MY_FLOAT lowestFreq) +{ + length = (long) (SRATE / lowestFreq + 1); + baseLoopGain = 0.995; + loopGain = 0.999; + delayLine = new DLineA(length); + delayLine2 = new DLineA(length); + combDelay = new DLineL(length); + filter = new OneZero; + filter2 = new OneZero; + pluckAmp = 0.3; + pluckPos = 0.4; + detuning = 0.995; + lastFreq = lowestFreq * 2.0; + lastLength = length * 0.5; +} + +Plucked2 :: ~Plucked2() +{ + delete delayLine; + delete delayLine2; + delete combDelay; + delete filter; + delete filter2; +} + +void Plucked2 :: clear() +{ + delayLine->clear(); + delayLine2->clear(); + combDelay->clear(); + filter->clear(); + filter2->clear(); +} + +void Plucked2 :: setFreq(MY_FLOAT frequency) +{ + lastFreq = frequency; + lastLength = ((MY_FLOAT) SRATE / lastFreq); /* length - delays */ + delayLine->setDelay((lastLength / detuning) - 0.5); + delayLine2->setDelay((lastLength * detuning) - 0.5); + loopGain = baseLoopGain + (frequency * 0.000005); + if (loopGain>1.0) loopGain = 0.99999; +} + +void Plucked2 :: setDetune(MY_FLOAT detune) +{ + detuning = detune; + delayLine->setDelay((lastLength / detuning) - 0.5); + delayLine2->setDelay((lastLength * detuning) - 0.5); +} + +void Plucked2 :: setFreqAndDetune(MY_FLOAT frequency,MY_FLOAT detune) +{ + lastFreq = frequency; + detuning = detune; + this->setFreq(frequency); +} + +void Plucked2 :: setPluckPos(MY_FLOAT position) +{ + pluckPos = position; +} + +void Plucked2 :: setBaseLoopGain(MY_FLOAT aGain) +{ + baseLoopGain = aGain; + loopGain = baseLoopGain + (lastFreq * 0.000005); + if (loopGain>1.0) loopGain = 0.99999; +} + +void Plucked2 :: noteOff(MY_FLOAT amp) +{ + loopGain = (1.0 - amp) * 0.5; +#if defined(_debug_) + printf("Plucked2 : NoteOff: Amp=%lf\n",amp); +#endif +} + diff --git a/Plucked2.h b/Plucked2.h new file mode 100644 index 0000000..2a102e2 --- /dev/null +++ b/Plucked2.h @@ -0,0 +1,46 @@ +/******************************************/ +/* Enhanced (Jaffe-Smith, Smith, others) */ +/* Karplus-Strong plucked model */ +/* by Perry Cook, 1995-96 */ +/* This is the super-class, with no */ +/* excitation specified. So this one by */ +/* itself doesn't make any sound. */ +/******************************************/ + +#if !defined(__Plucked2_h) +#define __Plucked2_h + +#include "Instrmnt.h" +#include "DLineL.h" +#include "DLineA.h" +#include "OneZero.h" + +class Plucked2 : public Instrmnt +{ + protected: + DLineA *delayLine; + DLineA *delayLine2; + DLineL *combDelay; + OneZero *filter; + OneZero *filter2; + long length; + MY_FLOAT loopGain; + MY_FLOAT baseLoopGain; + MY_FLOAT lastFreq; + MY_FLOAT lastLength; + MY_FLOAT detuning; + MY_FLOAT pluckAmp; + MY_FLOAT pluckPos; + public: + Plucked2(MY_FLOAT lowestFreq); + ~Plucked2(); + void clear(); + virtual void setFreq(MY_FLOAT frequency); + void setDetune(MY_FLOAT detune); + void setFreqAndDetune(MY_FLOAT frequency, MY_FLOAT detune); + void setPluckPos(MY_FLOAT position); + void setBaseLoopGain(MY_FLOAT aGain); + virtual void noteOff(MY_FLOAT amp); +}; + +#endif diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..e883554 --- /dev/null +++ b/README.txt @@ -0,0 +1,117 @@ +TK96CPP +A ToolKit of Audio Synthesis Classes + and Instruments in C++ +Perry Cook, 1995-96 + +Please read the Legal and Ethical notes at the +bottom of this document. + +For instant fun, if you get it to compile (see +below) type TestAllNext or TestAllSGIRT. The +former makes sound files of each instrument and +saves them under the instrument name. The latter +plays in real time from a SKINI scorefile. + +For even more potential fun, try the GUI and MIDI +interface demos in the directory TCLSpecs. MIDI +is SGI specific for today, look for more support +later. TCL works on SGI, maybe elsewhere, but +you must have and install Tcl/TK. + +For more documentation on this ToolKit, the classes, +etc, read the file HIERARCH.txt and the individual +class definitions. + +SGI vs. NeXT vs. Intel vs. the world: +See Object.h and Makefile for machine-specific +items. + +Initial public release. Some objects still beta. + +This whole world was created with no particular +hardware in mind. These examples are intended +to be tutorial in nature, as a platform for the +continuation of my research, and as a possible +starting point for a software synthesis system. +The basic motivation was to create the necessary +unit generators to do the synthesis, processing, +and control that I want to do and teach about. +Little thought for optimization was given (see +Object.cpp), and therefore improvements, especially +speed enhancements, should be possible with +these classes. It was written with some basic +concepts in mind about how to let compilers +optimize (see Adrian Freed's home page for some +nice experience-based thoughts on that topic). + +Your question at this point might be, "But Perry, +with CMix, CMusic, CSound, CShells, CMonkeys, etc. +already cluttering the landscape, why a new set +of stupid C functions for music synthesis and +processing?" The answers lie below. + +1) I needed to port many of the things I've done + into something which is generic enough to port + further to different machines. + +2) I really plan to document this stuff, so that + you don't have to be me to figure out what's + going on. (I'll probably be sorry I said this + in a couple of years, when even I can't figure + out what I was thinking.) + +3) The classic difficulties most people have in + trying to implement physical models are: + + A) They have trouble understanding the papers, + and/or in turning the theory into practice. + + B) The Physical Model instruments are a pain to get + to oscillate, and coming up with stable and + meaningful parameter values is required to + get the models to work at all. + + This set of C++ unitgenerators and instruments + might help to diminish the scores of EMails I + get asking what to do with those block diagrams + I put in my papers. + +4) I wanted to try some new stuff with modal synthesis, + and implement some classic FM patches as well. + +5) I wanted to reimplement, and newly implement + more of the intelligent and physical performer + models I've talked about in some of my papers. + But I wanted to do it in a portable way, and in + such a way that I can hook up modules quickly. + I also wanted to make these instruments connectable + to such player objects, so folks like Brad Garton + who really think a lot about the players can connect + them to my instruments, a lot about which I think. + +6) More rationalizations to follow . . . + +*********************************************************** +Legal and Ethical: + +This software was designed and created to be +made publicly available for free, primarily for +academic purposes, so if you use it, pass it on +with this documentation, and for free. + +If you make a million dollars with it, give me some. +If you make compositions with it, put me in the +program notes. + +Some of the concepts are covered by various patents, +some known to me and likely others which are unknown. +Many of the ones known to me are administered by the +Stanford Office of Technology and Licensing. + +The good news is that large hunks of the techniques +used here are public domain. To avoid subtle legal +issues, I'll not state what's freely useable here, +but I'll try to note within the various classes +where certain things are likely to be protected by +patents. +*********************************************************** diff --git a/RawLoop.cpp b/RawLoop.cpp new file mode 100644 index 0000000..c2c0c5c --- /dev/null +++ b/RawLoop.cpp @@ -0,0 +1,155 @@ +/*******************************************/ +/* Raw Looped Soundfile Class, */ +/* by Perry R. Cook, 1995-96 */ +/* This Object can open a raw 16bit data */ +/* (signed integers) file, and play back */ +/* the data, looping only, with linear */ +/* interpolation on playback. */ +/*******************************************/ + +#include "RawLoop.h" + +RawLoop :: RawLoop(char *fileName) +{ + long i; + short temp; + FILE *fd; + fd = fopen(fileName,"rb"); + if (!fd) { + printf("Couldn't find soundfile %s !!!!!!!!\n",fileName); + exit(0); + } + i = 0; + while (fread(&temp,2,1,fd)) i++; + length = i; + fseek(fd,0,0); + data = (MY_FLOAT *) malloc(MY_FLOAT_SIZE * (length + 1)); + i = 0; + while (fread(&temp,2,1,fd)) { + data[i] = temp; + i++; + } + data[length] = data[0]; + fclose(fd); + time = 0.0; + phaseOffset = 0.0; + rate = 1.0; +} + +RawLoop :: ~RawLoop() +{ + free(data); +} + +void RawLoop :: reset() +{ + time = 0.0; + lastOutput = 0.0; +} + +void RawLoop :: normalize() +{ + this->normalize(1.0); +} + +void RawLoop :: normalize(MY_FLOAT newPeak) +{ + long i; + MY_FLOAT max = 0.0; + for (i=0;i<=length;i++) + if (fabs(data[i]) > max) + max = fabs(data[i]); + if (max > 0.0) { + max = 1.0 / max; + max *= newPeak; + for (i=0;i<=length;i++) + data[i] *= max; + } +} + +void RawLoop :: setRate(MY_FLOAT aRate) +{ + rate = aRate; +} + +void RawLoop :: setFreq(MY_FLOAT aFreq) +{ + rate = length * ONE_OVER_SRATE * aFreq; +} + +void RawLoop :: addTime(MY_FLOAT aTime) /* Add an absolute time */ +{ /* in samples */ + time += aTime; +} + +void RawLoop :: addPhase(MY_FLOAT anAngle) /* Add a time in cycles */ +{ /* Cycles here means */ + time += length * anAngle; /* 1.0 = length */ +} + +void RawLoop :: addPhaseOffset(MY_FLOAT anAngle) +{ /* Add a phase offset */ + phaseOffset = length * anAngle; /* in cycles, where */ +} /* 1.0 = length */ + +MY_FLOAT RawLoop :: tick() +{ + long temp; + + MY_FLOAT temp_time, alpha; + + time += rate; /* Update current time */ + + while (time >= length) /* Check for end of sound */ + time -= length; /* loop back to beginning */ + while (time < 0.0) /* Check for end of sound */ + time += length; /* loop back to beginning */ + + temp_time = time; + + if (phaseOffset != 0.0) { + temp_time += phaseOffset; /* Add phase offset */ + while (temp_time >= length) /* Check for end of sound */ + temp_time -= length; /* loop back to beginning */ + while (temp_time < 0.0) /* Check for end of sound */ + temp_time += length; /* loop back to beginning */ + } + + temp = (long) temp_time; /* Integer part of time address */ + alpha = temp_time - (MY_FLOAT) temp; /* fractional part of time address */ + lastOutput = data[temp]; /* Do linear interpolation */ + lastOutput = lastOutput + /* same as alpha*data[temp+1] */ + (alpha * (data[temp+1] + - lastOutput)); /* + (1-alpha)data[temp] */ + + return lastOutput; +} + +MY_FLOAT RawLoop :: lastOut() +{ + return lastOutput; +} + +/************ Test Main Program *****************/ +/* +void main() +{ + RawLoop loopWave("rawwaves/sinewave.raw"); + FILE *fd; + short data; + long i; + + loopWave.setFreq(5500); + fd = fopen("test.raw","wb"); + for (i=0;i<4096;i++) { + data = loopWave.tick(); + fwrite(&data,2,1,fd); + } + loopWave.setFreq(2750); + for (i=0;i<4096;i++) { + data = loopWave.tick(); + fwrite(&data,2,1,fd); + } + fclose(fd); +} +*/ diff --git a/RawLoop.h b/RawLoop.h new file mode 100644 index 0000000..0cab42d --- /dev/null +++ b/RawLoop.h @@ -0,0 +1,39 @@ +/*******************************************/ +/* Raw Looped Soundfile Class, */ +/* by Perry R. Cook, 1995-96 */ +/* This Object can open a raw 16bit data */ +/* (signed integers) file, and play back */ +/* the data, looping only, with linear */ +/* interpolation on playback. */ +/*******************************************/ + +#if !defined(__RawLoop_h) +#define __RawLoop_h + +#include "Object.h" + +class RawLoop : public Object +{ + protected: + long length; + MY_FLOAT *data; + MY_FLOAT rate; + MY_FLOAT time; + MY_FLOAT phaseOffset; + MY_FLOAT lastOutput; + public: + RawLoop(char *fileName); + ~RawLoop(); + void reset(); + void normalize(); + void normalize(MY_FLOAT newPeak); + void setRate(MY_FLOAT aRate); + void setFreq(MY_FLOAT aFreq); + void addTime(MY_FLOAT aTime); + void addPhase(MY_FLOAT anAngle); + void addPhaseOffset(MY_FLOAT anAngle); + MY_FLOAT tick(); + MY_FLOAT lastOut(); +}; + +#endif diff --git a/RawWave.cpp b/RawWave.cpp new file mode 100644 index 0000000..e9aa5e4 --- /dev/null +++ b/RawWave.cpp @@ -0,0 +1,235 @@ +/*******************************************/ +/* Raw Soundfile Class, */ +/* by Perry R. Cook, 1995-96 */ +/* This Object can open a raw 16bit data */ +/* (signed integers) file, and play back */ +/* the data once or looping, with linear */ +/* interpolation on playback. */ +/*******************************************/ + +#include "RawWave.h" + +RawWave :: RawWave(char *fileName) +{ + long i; + short temp; + FILE *fd; + fd = fopen(fileName,"rb"); + if (!fd) { + printf("Couldn't find soundfile %s !!!!!!!!\n",fileName); + exit(0); + } + i = 0; + while (fread(&temp,2,1,fd)) i++; + length = i; + fseek(fd,0,0); + data = (MY_FLOAT *) malloc(MY_FLOAT_SIZE * (length + 1)); + myData = 1; + i = 0; + while (fread(&temp,2,1,fd)) { + data[i] = temp; + i++; + } + data[length] = data[length-1]; + fclose(fd); + looping = 0; + time = length; + phaseOffset = 0.0; + rate = 1.0; + allDone = 0; +} + +RawWave :: RawWave(MY_FLOAT *someData, long aLength) +{ + + length = aLength; + data = someData; + myData = 0; + looping = 0; + time = 0.0; + phaseOffset = 0.0; + rate = 1.0; +} + +RawWave :: ~RawWave() +{ + if (myData) { + free(data); + data = 0; + } +} + +void RawWave :: reset() +{ + time = 0.0; + lastOutput = 0.0; + allDone = 0; +} + +void RawWave :: normalize() +{ + this->normalize(1.0); +} + +void RawWave :: normalize(MY_FLOAT newPeak) +{ + long i; + MY_FLOAT max = 0.0; + for (i=0;i<=length;i++) + if (fabs(data[i]) > max) + max = fabs(data[i]); + if (max > 0.0) { + max = 1.0 / max; + max *= newPeak; + for (i=0;i<=length;i++) + data[i] *= max; + } +} + +void RawWave :: setRate(MY_FLOAT aRate) +{ + rate = aRate; +} + +void RawWave :: setFreq(MY_FLOAT aFreq) +{ + rate = length * ONE_OVER_SRATE * aFreq; +} + +void RawWave :: addTime(MY_FLOAT aTime) /* Add an absolute time */ +{ /* in samples */ + time += aTime; +} + +void RawWave :: addPhase(MY_FLOAT anAngle) /* Add a time in cycles */ +{ /* Cycles here means */ + time += length * anAngle; /* 1.0 = length */ +} + +void RawWave :: addPhaseOffset(MY_FLOAT anAngle) +{ /* Add a phase offset */ + phaseOffset = length * anAngle; /* in cycles, where */ +} /* 1.0 = length */ + +void RawWave :: setLooping(int aLoopStatus) +{ + time = 0; + looping = aLoopStatus; + if (looping) data[length] = data[0]; +} + +long RawWave :: getLength() +{ + return length; +} + +MY_FLOAT* RawWave :: getData() +{ + return data; +} + +MY_FLOAT RawWave :: tick() +{ + this->informTick(); + return lastOutput; +} + +int RawWave :: isAllDone() +{ + return allDone; +} + +int RawWave :: informTick() +{ + long temp; + + MY_FLOAT temp_time, alpha; + + time += rate; /* Update current time */ + + if (looping) { + while (time >= length) /* Check for end of sound */ + time -= length; /* loop back to beginning */ + while (time < 0.0) /* Check for end of sound */ + time += length; /* loop back to beginning */ + } + else { + if (time >= length) { /* Check for end of sound */ + time = length-1; /* stick at end */ + allDone = 1; /* Information for one-shot use */ + } + else if (time < 0.0) /* Check for end of sound */ + time = 0.0; /* stick at beg */ + } + + temp_time = time; + + if (phaseOffset != 0.0) { + temp_time += phaseOffset; /* Add phase offset */ + if (looping) { + while (temp_time >= length) /* Check for end of sound */ + temp_time -= length; /* loop back to beginning */ + while (temp_time < 0.0) /* Check for end of sound */ + temp_time += length; /* loop back to beginning */ + } + else { + if (temp_time >= length) /* Check for end of sound */ + temp_time = length-1; /* stick at end */ + else if (temp_time < 0.0) /* check for end of sound */ + temp_time = 0.0; /* stick at beg */ + } + } + + temp = (long) temp_time; /* Integer part of time address */ + alpha = temp_time - (MY_FLOAT) temp; /* fractional part of time address */ + lastOutput = data[temp]; /* Do linear interpolation */ + lastOutput = lastOutput + /* same as alpha*data[temp+1] */ + (alpha * (data[temp+1] - + lastOutput)); /* + (1-alpha)data[temp] */ + + return allDone; +} + +MY_FLOAT RawWave :: lastOut() +{ + return lastOutput; +} + +/************ Test Main Program *****************/ +/* + +void main() +{ + RawWave loopWave("rawwaves/sinewave.raw"); + RawWave oneShot("rawwaves/mandpluk.raw"); + FILE *fd; + short data; + long i; + + loopWave.setLooping(1); + loopWave.setFreq(5500); + fd = fopen("test.raw","wb"); + for (i=0;i<4096;i++) { + data = loopWave.tick(); + fwrite(&data,2,1,fd); + } + loopWave.setFreq(2750); + for (i=0;i<4096;i++) { + data = loopWave.tick(); + fwrite(&data,2,1,fd); + } + + oneShot.setLooping(0); + for (i=0;i<8192;i++) { + data = oneShot.tick(); + fwrite(&data,2,1,fd); + } + oneShot.reset(); + oneShot.setRate(0.5); + for (i=0;i<16384;i++) { + data = oneShot.tick(); + fwrite(&data,2,1,fd); + } + fclose(fd); +} +*/ diff --git a/RawWave.h b/RawWave.h new file mode 100644 index 0000000..83cef3d --- /dev/null +++ b/RawWave.h @@ -0,0 +1,48 @@ +/*******************************************/ +/* Raw Soundfile Class, */ +/* by Perry R. Cook, 1995-96 */ +/* This Object can open a raw 16bit data */ +/* (signed integers) file, and play back */ +/* the data once or looping, with linear */ +/* interpolation on playback. */ +/*******************************************/ + +#if !defined(__RawWave_h) +#define __RawWave_h + +#include "Object.h" + +class RawWave : public Object +{ + protected: + int looping; + int myData; + int allDone; + long length; + MY_FLOAT *data; + MY_FLOAT rate; + MY_FLOAT time; + MY_FLOAT phaseOffset; + MY_FLOAT lastOutput; + public: + RawWave(char *fileName); + RawWave(MY_FLOAT *someData,long aLength); + ~RawWave(); + void reset(); + void normalize(); + void normalize(MY_FLOAT newPeak); + void setRate(MY_FLOAT aRate); + void setFreq(MY_FLOAT aFreq); + void addTime(MY_FLOAT aTime); + void addPhase(MY_FLOAT anAngle); + void addPhaseOffset(MY_FLOAT anAngle); + void setLooping(int aLoopStatus); + int isAllDone(); + long getLength(); + MY_FLOAT* getData(); + MY_FLOAT tick(); + int informTick(); + MY_FLOAT lastOut(); +}; + +#endif diff --git a/RawWvIn.cpp b/RawWvIn.cpp new file mode 100644 index 0000000..fa4a36c --- /dev/null +++ b/RawWvIn.cpp @@ -0,0 +1,163 @@ +/*******************************************/ +/* NonInterpolating One-Shot Raw Sound- */ +/* file Class, by Perry R. Cook, 1995-96 */ +/* This Object can open a raw 16bit data */ +/* (signed integers) file, and play back */ +/* the data once, with no interpolation */ +/* on playback. Once finished, it closes */ +/* the file, the file is reopened with */ +/* the reset() method. */ +/* This is useful for small memory model, */ +/* applications, or for streaming from */ +/* disk (and generally non real-time */ +/* applications). */ +/*******************************************/ + +#include "RawWvIn.h" + +RawWvIn :: RawWvIn(char *fileName) +{ + long i; + + strcpy(fileNm,fileName); + + myFile = fopen(fileNm,"rb"); + if (!myFile) { + printf("Couldn't find soundfile %s !!!!!!!!\n",fileName); + exit(0); + } + + i = 0; + while (fread(&data,2,1,myFile)) i++; + length = i; + fseek(myFile,0,0); + time = 0.0; + rate = 1.0; + lastTime = 0; + finished = 0; + gain = 1.0; + lastOutput = 0.0; +} + +RawWvIn :: ~RawWvIn() +{ + this->finish(); +} + +void RawWvIn :: reset() +{ + if (finished) { + myFile = fopen(fileNm,"rb"); + } + fseek(myFile,0,0); + + printf("Resetting\n"); + time = 0.0; + lastTime = 0; + finished = 0; + lastOutput = 0.0; +} + +void RawWvIn :: normalize() +{ + this->normalize(1.0); +} + +void RawWvIn :: normalize(MY_FLOAT newPeak) +{ + long i; + FILE *fd; + + gain = 0.0; + + fd = fopen(fileNm,"rb"); + for (i=0;i gain) + gain = fabs(data); + } + if (gain > 0.0) { + gain = newPeak / gain; + } + fclose(fd); +} + +void RawWvIn :: setRate(MY_FLOAT aRate) +{ + rate = aRate; +} + +void RawWvIn :: finish() +{ + finished = 1; + lastOutput = 0.0; + if (myFile) { + fclose(myFile); + myFile = 0; + } +} + +MY_FLOAT RawWvIn :: tick() +{ + this->informTick(); + return lastOutput; +} + +int RawWvIn :: informTick() +{ + long temp; + + if (!finished) { + + time += rate; /* Update current time */ + + if (time >= length) { /* Check for end of sound */ + time = length - 1; /* stick at end */ + finished = 1; /* Information for one-shot use */ + fclose(myFile); + myFile = 0; + } + else { + temp = (long) time; /* Integer part of time address */ + if (temp > lastTime) { /* If we cross next sample time */ + lastTime = temp; + fread(&data,2,1,myFile); /* Snarf next sample from file */ + lastOutput = data * gain; /* And save as non-interpolated data */ + } + } + } + + return finished; +} + +MY_FLOAT RawWvIn :: lastOut() +{ + return lastOutput; +} + +/************ Test Main Program *****************/ +/* +void main() +{ + RawWvIn oneShot("rawwaves/mandpluk.raw"); + FILE *fd; + short data; + long i; + + fd = fopen("test.raw","wb"); + oneShot.setRate(1.0); + while (!oneShot.informTick()) { + data = oneShot.lastOut(); + fwrite(&data,2,1,fd); + } + + oneShot.reset(); + oneShot.setRate(0.5); + for (i=0;i<16384;i++) { + data = oneShot.tick(); + fwrite(&data,2,1,fd); + } + fclose(fd); +} +*/ + diff --git a/RawWvIn.h b/RawWvIn.h new file mode 100644 index 0000000..49c59cd --- /dev/null +++ b/RawWvIn.h @@ -0,0 +1,47 @@ +/*******************************************/ +/* NonInterpolating One-Shot Raw Sound- */ +/* file Class, by Perry R. Cook, 1995-96 */ +/* This Object can open a raw 16bit data */ +/* (signed integers) file, and play back */ +/* the data once, with no interpolation */ +/* on playback. Once finished, it closes */ +/* the file, the file is reopened with */ +/* the reset() method. */ +/* This is useful for small memory model, */ +/* applications, or for streaming from */ +/* disk (and generally non real-time */ +/* applications). */ +/*******************************************/ + +#if !defined(__RawWvIn_h) +#define __RawWvIn_h + +#include "Object.h" + +class RawWvIn : public Object +{ + protected: + long length; + long lastTime; + int finished; + short data; + char fileNm[128]; + FILE *myFile; + MY_FLOAT rate; + MY_FLOAT time; + MY_FLOAT gain; + MY_FLOAT lastOutput; + public: + RawWvIn(char *fileName); + ~RawWvIn(); + void reset(); + void normalize(); + void normalize(MY_FLOAT newPeak); + void setRate(MY_FLOAT aRate); + void finish(); + MY_FLOAT tick(); + int informTick(); + MY_FLOAT lastOut(); +}; + +#endif diff --git a/RawWvOut.cpp b/RawWvOut.cpp new file mode 100644 index 0000000..3cf49e9 --- /dev/null +++ b/RawWvOut.cpp @@ -0,0 +1,115 @@ +/*******************************************/ +/* Raw Wave File Output Class, */ +/* by Perry R. Cook, 1995-96 */ +/* This version opens a mono NeXT .snd */ +/* file 16bit data at 22KHz, and */ +/* pokes buffers of samples into it. */ +/*******************************************/ + +#include "RawWvOut.h" + +#if !defined(__SGI_REALTIME) + +/******** NeXT Soundfile Header Struct *******/ +struct headerform { + char pref[4]; + long hdr_length; + long file_length; + long mode; + long samp_rate; + long num_channels; + char comment[1024]; +}; + +RawWvOut :: RawWvOut(char *fileName) +{ + struct headerform hdr = {".sn",28,0,3,(long) SRATE,1,"TK"}; + hdr.pref[3] = 'd'; + + fd = fopen(fileName,"wb"); + if (!fd) { + printf("Couldn't create soundfile %s !!!!!!!!\n",fileName); + exit(0); + } + fwrite(&hdr,4,7,fd); + counter = 0; + totalCount = 0; +} + +RawWvOut :: ~RawWvOut() +{ + MY_FLOAT temp; + fwrite(data,2,counter,fd); + fseek(fd,8,SEEK_SET); + fwrite(&totalCount,4,1,fd); + fclose(fd); + temp = (double) totalCount * ONE_OVER_SRATE; + printf("%f Seconds Computed\n",temp); +} + +long RawWvOut :: getCounter() +{ + return totalCount; +} + +void RawWvOut :: tick(MY_FLOAT sample) +{ + + data[counter++] = (short) (sample * 32000.0); + totalCount += 1; + if (counter == BUFFER_SIZE) { + fwrite(data,2,BUFFER_SIZE,fd); + counter = 0; + } +} + +#else + + +/*******************************************/ +/* SGI Real-Time Wave File Output Class, */ +/* by Perry R. Cook, 1996 */ +/* This Object can opens the SGI soundout */ +/* device, and pokes buffers of samples */ +/* into it. The real code that does the */ +/* is from Doug Scott of SGI. */ +/*******************************************/ + +#include "sgio.C" + +RawWvOut :: RawWvOut(char *fileName) +{ + int fd; + + fd = init_sound(SRATE,1); + if (fd<0) { + printf("Couldn't open SoundOut Device !!!!!!!!\n"); + exit(0); + } + counter = 0; +} + +RawWvOut :: ~RawWvOut() +{ + playbuf(data,counter); + counter = 0; + while (counter 1.0) lastOutput = 1.0; /* if other way, reed slams shut */ + if (lastOutput < -1.0) lastOutput = -1.0; /* if all the way open, acts like open end */ + return lastOutput; +} + +MY_FLOAT ReedTabl :: lastOut() +{ + return lastOutput; +} + diff --git a/ReedTabl.h b/ReedTabl.h new file mode 100644 index 0000000..484cda2 --- /dev/null +++ b/ReedTabl.h @@ -0,0 +1,24 @@ +/**********************************************/ +/* One break point linear reed table object */ +/* by Perry R. Cook, 1995-96 */ +/* Consult McIntyre, Schumacher, & Woodhouse */ +/* Smith, Hirschman, Cook, Scavone, */ +/* more for information. */ +/**********************************************/ + +#include "Object.h" + +class ReedTabl : public Object +{ + protected: + MY_FLOAT offSet; + MY_FLOAT slope; + MY_FLOAT lastOutput; + public: + ReedTabl(); + ~ReedTabl(); + void setOffset(double aValue); + void setSlope(double aValue); + MY_FLOAT lookup(double deltaP); + MY_FLOAT lastOut(); +}; diff --git a/Reverb.cpp b/Reverb.cpp new file mode 100644 index 0000000..0f25713 --- /dev/null +++ b/Reverb.cpp @@ -0,0 +1,187 @@ +/******************************************/ +/* Reverb Effect Applied to Soundfile */ +/* by Perry Cook, 1996 */ +/* */ +/* This is based on some of the famous */ +/* Stanford CCRMA reverbs (NRev, KipRev) */ +/* all based on the the Chowning/Moorer/ */ +/* Schroeder reverberators, which use */ +/* networks of simple allpass and comb */ +/* delay filters. */ +/******************************************/ + +#include "Reverb.h" + +Reverb :: Reverb(MY_FLOAT longestDelay) +{ + delayLine[0] = new DLineN((long) (longestDelay * 0.164631) + 2); + delayLine[1] = new DLineN((long) (longestDelay * 0.513434) + 2); + delayLine[2] = new DLineN((long) (longestDelay * 1.000000) + 2); + delayLine[3] = new DLineN((long) (longestDelay * 0.830484) + 2); + delayLine[0]->setDelay((long) (longestDelay * 0.164631)); + delayLine[1]->setDelay((long) (longestDelay * 0.513434)); + delayLine[2]->setDelay((long) (longestDelay * 1.000000)); + delayLine[3]->setDelay((long) (longestDelay * 0.830484)); + allPassCoeff = 0.7; + combCoeff1 = 0.62; + combCoeff2 = -0.71; + effectMix = 0.5; + this->clear(); +} + +Reverb :: ~Reverb() +{ + delete delayLine[0]; + delete delayLine[1]; + delete delayLine[2]; + delete delayLine[3]; +} + +void Reverb :: clear() +{ + delayLine[0]->clear(); + delayLine[1]->clear(); + delayLine[2]->clear(); + delayLine[3]->clear(); + lastOutL = 0.0; + lastOutR = 0.0; +} + +void Reverb :: setEffectMix(MY_FLOAT mix) +{ + effectMix = mix; +} + +MY_FLOAT Reverb :: lastOutput() +{ + return (lastOutL + lastOutR) * 0.5; +} + +MY_FLOAT Reverb :: lastOutputL() +{ + return lastOutL; +} + +MY_FLOAT Reverb :: lastOutputR() +{ + return lastOutR; +} + +MY_FLOAT Reverb :: tick(MY_FLOAT input) +{ + MY_FLOAT temp,temp0,temp1,temp2,temp3; + + temp = delayLine[0]->lastOut(); + temp0 = allPassCoeff * temp; + temp0 += input; + delayLine[0]->tick(temp0); + temp0 = -(allPassCoeff * temp0) + temp; + + temp = delayLine[1]->lastOut(); + temp1 = allPassCoeff * temp; + temp1 += temp0; + delayLine[1]->tick(temp1); + temp1 = -(allPassCoeff * temp1) + temp; + + temp2 = temp1 + (combCoeff1 * delayLine[2]->lastOut()); + temp3 = temp1 + (combCoeff2 * delayLine[3]->lastOut()); + + lastOutL = effectMix * (delayLine[2]->tick(temp2)); + lastOutR = effectMix * (delayLine[3]->tick(temp3)); + temp = (1.0 - effectMix) * input; + lastOutL += temp; + lastOutR += temp; + + return (lastOutL + lastOutR) * 0.5; + +} + +/************** Test Main Program *********************/ + + +struct headerform { /*** NeXT Soundfile Header Struct ***/ + char pref[4]; + long hdr_length; + long file_length; + long mode; + long samp_rate; + long num_channels; + char comment[1024]; +}; + +/* +int main(int argc, char *argv[]) +{ + FILE *soundIn,*soundOut; + long i,dLength; + short data[2]; + MY_FLOAT temp,efMix; + Reverb *effect; + struct headerform hdr = {".sn",28,0,3,(long) SRATE,1,"TK"}; + hdr.pref[3] = 'd'; + + if (argc==5) { + soundIn = fopen(argv[3],"rb"); + soundOut = fopen(argv[4],"wb"); + if (soundIn && soundOut) { + dLength = atoi(argv[2]); + efMix = atof(argv[1]); + fread(&hdr,4,2,soundIn); + fread(&hdr.file_length,hdr.hdr_length,1,soundIn); + hdr.file_length += 4 * (2 * dLength * hdr.num_channels); + if (hdr.mode != 3) { + fclose(soundIn); + fclose(soundOut); + printf("Only 16 bit linear data supported in this demo"); + exit(0); + } + fwrite(&hdr,1,hdr.hdr_length,soundOut); + effect = new Reverb(dLength); + effect->setEffectMix(1.0); + for (i=0;itick(temp); + data[0] = (short) (temp + (data[0] * (1.0 - efMix))); + data[1] = (short) (temp + (data[1] * (1.0 - efMix))); + } + else { + temp = effect->tick(0); + data[0] = (short) temp; + data[1] = (short) temp; + } + fwrite(data,2,2,soundOut); + i++; + } + else { + if (fread(data,2,1,soundIn)) { + temp = data[0] * efMix; + temp = effect->tick(temp); + data[0] = (short) (temp + (data[0] * (1.0 - efMix))); + } + else { + temp = effect->tick(0); + data[0] = (short) temp; + } + fwrite(data,2,1,soundOut); + } + } + delete effect; + fclose(soundIn); + fclose(soundOut); + } + else { + printf("Can't open one of the files\n"); + } + } + else { + printf("useage: Reverb mix maxDelay soundIn.snd soundOut.snd\n"); + printf("0.0 <= mix <= 1.0\n"); + printf("maxDelay is in samples\n"); + printf("soundfiles are 16 bit linear mono or stereo\n"); + } +} + +*/ diff --git a/Reverb.h b/Reverb.h new file mode 100644 index 0000000..a96cfa5 --- /dev/null +++ b/Reverb.h @@ -0,0 +1,41 @@ +/******************************************/ +/* Reverb Effect Applied to Soundfile */ +/* by Perry Cook, 1996 */ +/* */ +/* This is based on some of the famous */ +/* Stanford CCRMA reverbs (NRev, KipRev) */ +/* all based on the the Chowning/Moorer/ */ +/* Schroeder reverberators, which use */ +/* networks of simple allpass and comb */ +/* delay filters. */ +/******************************************/ + +#if !defined(__Reverb_h) +#define __Reverb_h + +#include "Object.h" +#include "DLineN.h" + +class Reverb : public Object +{ + protected: + DLineN *delayLine[4]; + MY_FLOAT allPassCoeff; + MY_FLOAT combCoeff1; + MY_FLOAT combCoeff2; + MY_FLOAT lastOutL; + MY_FLOAT lastOutR; + MY_FLOAT effectMix; + public: + Reverb(MY_FLOAT longestDelay); + ~Reverb(); + void clear(); + void setEffectMix(MY_FLOAT mix); + MY_FLOAT lastOutput(); + MY_FLOAT lastOutputL(); + MY_FLOAT lastOutputR(); + MY_FLOAT tick(MY_FLOAT input); +}; + +#endif + diff --git a/Rhodey.cpp b/Rhodey.cpp new file mode 100644 index 0000000..32d6acd --- /dev/null +++ b/Rhodey.cpp @@ -0,0 +1,57 @@ +/******************************************/ +/* Fender Rhodes Electric Piano Subclass */ +/* of Algorithm 5 (TX81Z) Subclass of */ +/* 4 Operator FM Synth */ +/* by Perry R. Cook, 1995-96 */ +/******************************************/ + +#include "Rhodey.h" + +Rhodey :: Rhodey() : FM4Alg5() +{ + this->loadWaves("rawwaves/sinewave.raw", + "rawwaves/sinewave.raw", + "rawwaves/sinewave.raw", + "rawwaves/fwavblnk.raw"); + this->setRatio(0,1.0); + this->setRatio(1,0.5); + this->setRatio(2,1.0); + this->setRatio(3,15.0); + gains[0] = __FM4Op_gains[99]; + gains[1] = __FM4Op_gains[90]; + gains[2] = __FM4Op_gains[99]; + gains[3] = __FM4Op_gains[67]; + adsr[0]->setAll(0.05,0.00003,0.0,0.02); + adsr[1]->setAll(0.05,0.00003,0.0,0.02); + adsr[2]->setAll(0.05,0.00005,0.0,0.02); + adsr[3]->setAll(0.05,0.0002,0.0,0.02); + twozero->setGain(1.0); +} + +Rhodey :: ~Rhodey() +{ + +} + +void Rhodey :: setFreq(MY_FLOAT frequency) +{ + baseFreq = frequency * 2.0; + waves[0]->setFreq(baseFreq * ratios[0]); + waves[1]->setFreq(baseFreq * ratios[1]); + waves[2]->setFreq(baseFreq * ratios[2]); + waves[3]->setFreq(baseFreq * ratios[3]); +} + +void Rhodey :: noteOn(MY_FLOAT freq, MY_FLOAT amp) +{ + gains[0] = amp * __FM4Op_gains[99]; + gains[1] = amp * __FM4Op_gains[90]; + gains[2] = amp * __FM4Op_gains[99]; + gains[3] = amp * __FM4Op_gains[67]; + this->setFreq(freq); + this->keyOn(); +#if defined(_debug_) + printf("Rhodey : NoteOn: Freq=%lf Amp=%lf\n",freq,amp); +#endif +} + diff --git a/Rhodey.h b/Rhodey.h new file mode 100644 index 0000000..56a9a7e --- /dev/null +++ b/Rhodey.h @@ -0,0 +1,22 @@ +/******************************************/ +/* Fender Rhodes Electric Piano Subclass */ +/* of Algorithm 5 (TX81Z) Subclass of */ +/* 4 Operator FM Synth */ +/* by Perry R. Cook, 1995-96 */ +/******************************************/ + +#if !defined(__Rhodey_h) +#define __Rhodey_h + +#include "FM4Alg5.h" + +class Rhodey : public FM4Alg5 +{ + public: + Rhodey(); + ~Rhodey(); + virtual void setFreq(MY_FLOAT frequency); + virtual void noteOn(MY_FLOAT freq, MY_FLOAT amp); +}; + +#endif diff --git a/SamplFlt.cpp b/SamplFlt.cpp new file mode 100644 index 0000000..4704001 --- /dev/null +++ b/SamplFlt.cpp @@ -0,0 +1,48 @@ +/*******************************************/ +/* Swept Filter SubClass of Sampling */ +/* Synthesizer, by Perry R. Cook, 1995-96*/ +/* This instrument inherits up to 5 */ +/* attack waves, 5 looped waves, an ADSR */ +/* envelope, and adds a 4 pole swept */ +/* filter. */ +/*******************************************/ + +#include "SamplFlt.h" + +SamplFlt :: SamplFlt() : Sampler() +{ + MY_FLOAT tempCoeffs[2] = {0.0,-1.0}; + twozeroes[0] = new TwoZero; + twozeroes[0]->setZeroCoeffs(tempCoeffs); + twozeroes[0]->setGain(1.0); + twozeroes[1] = new TwoZero; + twozeroes[1]->setZeroCoeffs(tempCoeffs); + twozeroes[1]->setGain(1.0); + filters[0] = new FormSwep; + filters[0]->setTargets(0.0,0.7,0.5); + filters[1] = new FormSwep; + filters[1]->setTargets(0.0,0.7,0.5); +} + +SamplFlt :: ~SamplFlt() +{ + delete filters[0]; + delete filters[1]; + delete twozeroes[0]; + delete twozeroes[1]; +} + +MY_FLOAT SamplFlt :: tick() +{ + MY_FLOAT output; + output = Sampler :: tick(); + output = twozeroes[0]->tick(output); + output = filters[0]->tick(output); + output = twozeroes[1]->tick(output); + output = filters[1]->tick(output); + return output; +} + +void SamplFlt :: controlChange(int number, MY_FLOAT value) +{ +} diff --git a/SamplFlt.h b/SamplFlt.h new file mode 100644 index 0000000..fccd355 --- /dev/null +++ b/SamplFlt.h @@ -0,0 +1,29 @@ +/*******************************************/ +/* Swept Filter SubClass of Sampling */ +/* Synthesizer, by Perry R. Cook, 1995-96*/ +/* This instrument inherits up to 5 */ +/* attack waves, 5 looped waves, an ADSR */ +/* envelope, and adds a 4 pole swept */ +/* filter. */ +/*******************************************/ + +#if !defined(__SamplFlt_h) +#define __SamplFlt_h + +#include "Sampler.h" +#include "FormSwep.h" +#include "TwoZero.h" + +class SamplFlt : public Sampler +{ + protected: + FormSwep *filters[2]; + TwoZero *twozeroes[2]; + public: + SamplFlt(); + ~SamplFlt(); + virtual MY_FLOAT tick(); + virtual void controlChange(int number, MY_FLOAT value); +}; + +#endif diff --git a/Sampler.cpp b/Sampler.cpp new file mode 100644 index 0000000..afc1427 --- /dev/null +++ b/Sampler.cpp @@ -0,0 +1,63 @@ +/*******************************************/ +/* Master Class for Sampling Synthesizer */ +/* by Perry R. Cook, 1995-96 */ +/* This instrument contains up to 5 */ +/* attack waves, 5 looped waves, and */ +/* an ADSR envelope. */ +/*******************************************/ + +#include "Sampler.h" + +Sampler :: Sampler() +{ + adsr = new ADSR; + /* We don't make the waves here yet, because */ + /* we don't know what they will be. */ + baseFreq = 440.0; + filter = new OnePole; + attackGain = 0.25; + loopGain = 0.25; + whichOne = 0; +} + +Sampler :: ~Sampler() +{ + delete adsr; + delete filter; +} + +void Sampler :: keyOn() +{ + adsr->keyOn(); + attacks[0]->reset(); +} + +void Sampler :: keyOff() +{ + adsr->keyOff(); +} + +void Sampler :: noteOff(MY_FLOAT amplitude) +{ + this->keyOff(); +#if defined(_debug_) + printf("Sampler : NoteOff: Amp=%lf\n",amplitude); +#endif +} + +void Sampler :: setFreq(MY_FLOAT frequency) +{ +} + +MY_FLOAT Sampler :: tick() +{ + lastOutput = attackGain * attacks[whichOne]->tick(); + lastOutput += loopGain * loops[whichOne]->tick(); + lastOutput = filter->tick(lastOutput); + lastOutput *= adsr->tick(); + return lastOutput; +} + +void Sampler :: controlChange(int number, MY_FLOAT value) +{ +} diff --git a/Sampler.h b/Sampler.h new file mode 100644 index 0000000..f2dd5d6 --- /dev/null +++ b/Sampler.h @@ -0,0 +1,42 @@ +/*******************************************/ +/* Master Class for Sampling Synthesizer */ +/* by Perry R. Cook, 1995-96 */ +/* This instrument contains up to 5 */ +/* attack waves, 5 looped waves, and */ +/* an ADSR envelope. */ +/*******************************************/ + +#if !defined(__Sampler_h) +#define __Sampler_h + +#include "Instrmnt.h" +#include "ADSR.h" +#include "RawWave.h" +#include "OnePole.h" + +class Sampler : public Instrmnt +{ + protected: + ADSR *adsr; + RawWave *attacks[5]; + RawWave *loops[5]; + OnePole *filter; + MY_FLOAT baseFreq; + MY_FLOAT attackRatios[5]; + MY_FLOAT loopRatios[5]; + MY_FLOAT attackGain; + MY_FLOAT loopGain; + int whichOne; + public: + Sampler(); + ~Sampler(); + void clear(); + virtual void setFreq(MY_FLOAT frequency); + void keyOn(); + void keyOff(); + virtual void noteOff(MY_FLOAT amplitude); + virtual MY_FLOAT tick(); + virtual void controlChange(int number, MY_FLOAT value); +}; + +#endif diff --git a/SingWave.cpp b/SingWave.cpp new file mode 100644 index 0000000..5cc6d2a --- /dev/null +++ b/SingWave.cpp @@ -0,0 +1,239 @@ +/*******************************************/ +/* "Singing" Looped Soundfile Class, */ +/* by Perry R. Cook, 1995-96 */ +/* This Object contains all that's needed */ +/* to make a pitched musical sound, like */ +/* a simple voice or violin. In general, */ +/* it will not be used alone (because of */ +/* of munchinification effects from pitch */ +/* shifting. It will be used as an */ +/* excitation source for other instruments*/ +/*******************************************/ + +#include "SingWave.h" + +SingWave :: SingWave(char *fileName) +{ + long i; + short temp; + FILE *fd; + fd = fopen(fileName,"rb"); + if (!fd) { + printf("Couldn't find soundfile %s !!!!!!!!\n",fileName); + } + i = 0; + while (fread(&temp,2,1,fd)) i++; + length = i; + fseek(fd,0,0); + data = (MY_FLOAT *) malloc(MY_FLOAT_SIZE * (length + 1)); + i = 0; + while (fread(&temp,2,1,fd)) { + data[i] = temp; + i++; + } + data[length] = data[length-1]; + fclose(fd); + mytime = 0.0; + rate = 1.0; + sweepRate = 0.001; + modulator = new Modulatr; + modulator->setVibFreq(6.0); + modulator->setVibAmt(0.04); + modulator->setRndAmt(0.005); + envelope = new Envelope; + pitchEnvelope = new Envelope; + this->setFreq(75.0); + pitchEnvelope->setRate(1.0); + this->tick(); + this->tick(); + pitchEnvelope->setRate(sweepRate * rate); +} + +SingWave :: ~SingWave() +{ + delete modulator; + delete envelope; + delete pitchEnvelope; + free(data); +} + +void SingWave :: reset() +{ + mytime = 0.0; + lastOutput = 0.0; +} + +void SingWave :: normalize() +{ + long i; + MY_FLOAT max = 0.0; + for (i=0;i<=length;i++) + if (fabs(data[i]) > max) + max = fabs(data[i]); + if (max > 0.0) { + max = 1.0 / max; + for (i=0;i<=length;i++) + data[i] *= max; + } +} + +void SingWave :: normalize(MY_FLOAT newPeak) +{ + long i; + MY_FLOAT max = 0.0; + for (i=0;i<=length;i++) + if (fabs(data[i]) > max) + max = fabs(data[i]); + if (max > 0.0) { + max = 1.0 / max; + max *= newPeak; + for (i=0;i<=length;i++) + data[i] *= max; + } +} + +void SingWave :: setFreq(MY_FLOAT aFreq) +{ + MY_FLOAT temp; + temp = rate; + rate = length * ONE_OVER_SRATE * aFreq; + temp -= rate; + if (temp<0) temp = -temp; + pitchEnvelope->setTarget(rate); + pitchEnvelope->setRate(sweepRate * temp); +} + +void SingWave :: setVibFreq(MY_FLOAT vibFreq) +{ + modulator->setVibFreq(vibFreq); +} + +void SingWave :: setVibAmt(MY_FLOAT vibAmount) +{ + modulator->setVibAmt(vibAmount); +} + +void SingWave :: setRndAmt(MY_FLOAT rndAmount) +{ + modulator->setRndAmt(rndAmount); +} + +void SingWave :: setSweepRate(MY_FLOAT swpRate) +{ + sweepRate = swpRate; +} + +void SingWave :: setGainRate(MY_FLOAT gainRate) +{ + envelope->setRate(gainRate); +} + +void SingWave :: setGainTarget(MY_FLOAT aTarget) +{ + envelope->setTarget(aTarget); +} + +void SingWave :: noteOn() +{ + envelope->keyOn(); +} + +void SingWave :: noteOff() +{ + envelope->keyOff(); +} + +MY_FLOAT SingWave :: tick() +{ + long temp; + MY_FLOAT alpha, temp_rate; + + temp_rate = pitchEnvelope->tick(); + mytime += temp_rate; /* Update current time */ + mytime += temp_rate * + modulator->tick(); /* Add vibratos */ + + while (mytime >= length) { /* Check for end of sound */ + mytime -= length; /* loop back to beginning */ + } + while (mytime < 0.0) { /* Check for end of sound */ + mytime += length; /* loop back to beginning */ + } + + temp = (long) mytime; /* Integer part of time address */ + alpha = mytime - (MY_FLOAT) temp; /* fractional part of time address*/ + + lastOutput = alpha * data[temp+1]; /* Do linear */ + lastOutput += (1.0 - alpha) * + data[temp]; /* interpolation */ + lastOutput *= envelope->tick(); + + return lastOutput; +} + +MY_FLOAT SingWave :: lastOut() +{ + return lastOutput; +} + +/************ Test Main Program *****************/ +/* +void main() +{ + SingWave ahhWave("rawwaves/ahh.raw"); + SingWave eeeWave("rawwaves/eee.raw"); + SingWave oooWave("rawwaves/ooo.raw"); + FILE *fd; + short data; + long i,j; + + fd = fopen("test.raw","wb"); + + ahhWave.normalize(); + ahhWave.noteOn(); + for (j=0;j<6;j++) { + ahhWave.setFreq(100 * pow(2.0,j*0.25)); + for (i=0;i<10000;i++) { + data = ahhWave.tick() * 32000.0; + fwrite(&data,2,1,fd); + } + } + ahhWave.noteOff(); + for (i=0;i<5000;i++) { + data = ahhWave.tick() * 32000.0; + fwrite(&data,2,1,fd); + } + + eeeWave.normalize(); + eeeWave.noteOn(); + for (j=0;j<6;j++) { + eeeWave.setFreq(100 * pow(2.0,j*0.25)); + for (i=0;i<10000;i++) { + data = eeeWave.tick() * 32000.0; + fwrite(&data,2,1,fd); + } + } + eeeWave.noteOff(); + for (i=0;i<5000;i++) { + data = eeeWave.tick() * 32000.0; + fwrite(&data,2,1,fd); + } + + oooWave.normalize(); + oooWave.noteOn(); + for (j=0;j<6;j++) { + oooWave.setFreq(100 * pow(2.0,j*0.25)); + for (i=0;i<10000;i++) { + data = oooWave.tick() * 32000.0; + fwrite(&data,2,1,fd); + } + } + oooWave.noteOff(); + for (i=0;i<5000;i++) { + data = oooWave.tick() * 32000.0; + fwrite(&data,2,1,fd); + } + + fclose(fd); +} +*/ diff --git a/SingWave.h b/SingWave.h new file mode 100644 index 0000000..7fc3329 --- /dev/null +++ b/SingWave.h @@ -0,0 +1,51 @@ +/*******************************************/ +/* "Singing" Looped Soundfile Class, */ +/* by Perry R. Cook, 1995-96 */ +/* This Object contains all that's needed */ +/* to make a pitched musical sound, like */ +/* a simple voice or violin. In general, */ +/* it will not be used alone (because of */ +/* of munchinification effects from pitch */ +/* shifting. It will be used as an */ +/* excitation source for other instruments*/ +/*******************************************/ + +#if !defined(__SingWave_h) +#define __SingWave_h + +#include "Object.h" +#include "Modulatr.h" +#include "Envelope.h" + +class SingWave : public Object +{ + protected: + Modulatr *modulator; + Envelope *envelope; + Envelope *pitchEnvelope; + long length; + MY_FLOAT *data; + MY_FLOAT rate; + MY_FLOAT sweepRate; + MY_FLOAT mytime; + MY_FLOAT lastOutput; + public: + SingWave(char *fileName); + ~SingWave(); + void reset(); + void normalize(); + void normalize(MY_FLOAT newPeak); + void setFreq(MY_FLOAT aFreq); + void setVibFreq(MY_FLOAT vibFreq); + void setVibAmt(MY_FLOAT vibAmt); + void setRndAmt(MY_FLOAT rndVib); + void setSweepRate(MY_FLOAT swpRate); + void setGainRate(MY_FLOAT gainRate); + void setGainTarget(MY_FLOAT aTarget); + void noteOn(); + void noteOff(); + MY_FLOAT tick(); + MY_FLOAT lastOut(); +}; + +#endif diff --git a/SubNoise.cpp b/SubNoise.cpp new file mode 100644 index 0000000..23dc24c --- /dev/null +++ b/SubNoise.cpp @@ -0,0 +1,52 @@ +/*******************************************/ +/* SubSampled Noise Generator Class, */ +/* by Perry R. Cook, 1995-96 */ +/* White noise as often as you like. */ +/*******************************************/ + +#include "SubNoise.h" + +SubNoise :: SubNoise() : Noise() +{ + lastOutput = 0.0; + howOften = 15; + counter = 15; +} + +SubNoise :: ~SubNoise() +{ + +} + +SubNoise :: SubNoise(int subSample) : Noise() +{ + lastOutput = 0.0; + howOften = subSample-1; + counter = subSample-1; +} + +MY_FLOAT SubNoise :: tick() +{ + if (!counter) { + lastOutput = Noise::tick(); + counter = howOften; + } + else counter -= 1; + return lastOutput; +} + +void SubNoise :: setHowOften(int howOft) +{ + howOften = howOft; +} + +/************ Test Main ************************/ +/* +void main() +{ + long i; + SubNoise test(5); + for (i=0;i<100;i++) printf("%lf\n",test.tick()); +} +*/ + diff --git a/SubNoise.h b/SubNoise.h new file mode 100644 index 0000000..6d20f8b --- /dev/null +++ b/SubNoise.h @@ -0,0 +1,25 @@ +/*******************************************/ +/* SubSampled Noise Generator Class, */ +/* by Perry R. Cook, 1995-96 */ +/* White noise as often as you like. */ +/*******************************************/ + +#if !defined(__SubNoise_h) +#define __SubNoise_h + +#include "Noise.h" + +class SubNoise : public Noise +{ + protected: + int counter; + int howOften; + public: + SubNoise(); + ~SubNoise(); + SubNoise(int subSample); + void setHowOften(int howOft); + MY_FLOAT tick(); +}; + +#endif diff --git a/TCLSpecs/GUIPhysical b/TCLSpecs/GUIPhysical new file mode 100755 index 0000000..18e408a --- /dev/null +++ b/TCLSpecs/GUIPhysical @@ -0,0 +1,2 @@ +cd .. +wish < TCLSpecs/TCLPhys.tcl | testTextIn Clarinet diff --git a/TCLSpecs/GUIPlukStruk b/TCLSpecs/GUIPlukStruk new file mode 100755 index 0000000..d1b6bef --- /dev/null +++ b/TCLSpecs/GUIPlukStruk @@ -0,0 +1,2 @@ +cd .. +wish < TCLSpecs/TCLStruk.tcl | testTextIn Mandolin diff --git a/TCLSpecs/GUIVoice b/TCLSpecs/GUIVoice new file mode 100755 index 0000000..3952696 --- /dev/null +++ b/TCLSpecs/GUIVoice @@ -0,0 +1,2 @@ +cd .. +wish < TCLSpecs/TCLVoice.tcl | testTextIn FMVoices diff --git a/TCLSpecs/MIDIPhysical b/TCLSpecs/MIDIPhysical new file mode 100755 index 0000000..ff186fe --- /dev/null +++ b/TCLSpecs/MIDIPhysical @@ -0,0 +1,2 @@ +cd .. +testMIDI | testTextIn Clarinet diff --git a/TCLSpecs/MIDIPlukStruk b/TCLSpecs/MIDIPlukStruk new file mode 100755 index 0000000..a38440c --- /dev/null +++ b/TCLSpecs/MIDIPlukStruk @@ -0,0 +1,2 @@ +cd .. +testMIDI | testTextIn Mandolin diff --git a/TCLSpecs/MIDIVoice b/TCLSpecs/MIDIVoice new file mode 100755 index 0000000..9f7b20a --- /dev/null +++ b/TCLSpecs/MIDIVoice @@ -0,0 +1,2 @@ +cd .. +testMIDI | testTextIn FMVoices diff --git a/TCLSpecs/TCLPhys.tcl b/TCLSpecs/TCLPhys.tcl new file mode 100644 index 0000000..bcd8b34 --- /dev/null +++ b/TCLSpecs/TCLPhys.tcl @@ -0,0 +1,136 @@ +set pitch 64.0 +set press 64.0 + +button .pretty -bitmap @TCLSpecs/bitmaps/prcFunny.xbm \ +-background white -foreground black +.pretty config -bitmap @TCLSpecs/bitmaps/prc.xbm + +proc myExit {} { + puts stdout [format "ExitProgram"] + flush stdout + exit +} + +proc noteOn {pitchVal pressVal} { + puts stdout [format "NoteOn 0.0 1 %f %f" $pitchVal $pressVal] + flush stdout +} + +proc noteOff {pitchVal pressVal} { + puts stdout [format "NoteOff 0.0 1 %f %f" $pitchVal $pressVal] + flush stdout +} + +proc patchChange {value} { + global .pretty + puts stdout [format "ProgramChange 0.0 1 %i" $value] + if {$value==0} { + .pretty config -bitmap @TCLSpecs/bitmaps/Klar.xbm + } + if {$value==1} { + .pretty config -bitmap @TCLSpecs/bitmaps/KFloot.xbm + } + if {$value==2} { + .pretty config -bitmap @TCLSpecs/bitmaps/KHose.xbm + } + if {$value==3} { + .pretty config -bitmap @TCLSpecs/bitmaps/KFiddl.xbm + } + flush stdout +} + +proc printWhatz {tag value1 value2 } { + puts stdout [format "%s %i %f" $tag $value1 $value2] + flush stdout +} + +proc changePress {value} { + global press + set press $value + puts stdout [format "AfterTouch 0.0 1 %f" $press] + flush stdout +} + +proc changePitch {value} { + global pitch + set pitch $value + puts stdout [format "PitchBend 0.0 1 %f" $pitch] + flush stdout +} + +scale .bPressure -from 0 -to 128 -length 200 \ +-command {changePress } \ +-activeforeground white -sliderforeground grey80\ +-orient horizontal -label "Breath Pressure" \ +-tickinterval 32 -showvalue true -bg grey66 + +scale .pitch -from 0 -to 128 -length 200 \ +-command {changePitch } \ +-activeforeground white -sliderforeground grey80\ +-orient horizontal -label "MIDI Note Number" \ +-tickinterval 32 -showvalue true -bg grey66 + +scale .cont1 -from 0 -to 128 -length 200 \ +-command {printWhatz "ControlChange 0.0 1 " 2} \ +-activeforeground white -sliderforeground grey80\ +-orient horizontal -label "Reed, Emb., Lip., Bow Pres." \ +-tickinterval 32 -showvalue true -bg grey66 + +scale .cont2 -from 0 -to 128 -length 200 \ +-command {printWhatz "ControlChange 0.0 1 " 4} \ +-activeforeground white -sliderforeground grey80\ +-orient horizontal -label "Noise Amt., Slide Length,Bow Pos." \ +-tickinterval 32 -showvalue true -bg grey66 + +scale .cont3 -from 0 -to 128 -length 200 \ +-command {printWhatz "ControlChange 0.0 1 " 11} \ +-activeforeground white -sliderforeground grey80\ +-orient horizontal -label "Vibrato Rate" \ +-tickinterval 32 -showvalue true -bg grey66 + +scale .vibrato -from 0 -to 128 -length 200 \ +-command {printWhatz "ControlChange 0.0 1 " 1} \ +-activeforeground white -sliderforeground grey80\ +-orient horizontal -label "Vibrato Amount" \ +-tickinterval 32 -showvalue true -bg grey66 + +. config -bg grey20 + +frame .instChoice -bg black + +radiobutton .instChoice.clar -text Clarinet -bg grey66 \ +-command { patchChange 0 } +radiobutton .instChoice.flut -text Flute -bg grey66 \ +-command { patchChange 1 } +radiobutton .instChoice.bras -text Brass -bg grey66 \ +-command { patchChange 2 } +radiobutton .instChoice.bowd -text Bowed -bg grey66 \ +-command { patchChange 3 } + +pack .instChoice.clar -side left -padx 5 +pack .instChoice.flut -side left -padx 5 +pack .instChoice.bras -side left -padx 5 +pack .instChoice.bowd -side left -padx 5 -pady 10 + +pack .instChoice + +pack .pretty -padx 5 -pady 10 + +pack .bPressure -padx 10 -pady 10 +pack .pitch -padx 10 -pady 10 +pack .vibrato -padx 10 -pady 10 +pack .cont1 -padx 10 -pady 10 +pack .cont2 -padx 10 -pady 10 +pack .cont3 -padx 10 -pady 10 + +frame .noteOn -bg black + +button .noteOn.on -text NoteOn -bg grey66 -command { noteOn $pitch $press } +button .noteOn.off -text NoteOff -bg grey66 -command { noteOff $pitch 127.0 } +button .noteOn.exit -text "Exit Program" -bg grey66 -command myExit +pack .noteOn.on -side left -padx 5 +pack .noteOn.off -side left -padx 5 -pady 10 +pack .noteOn.exit -side left -padx 5 -pady 10 + +pack .noteOn + diff --git a/TCLSpecs/TCLStruk.tcl b/TCLSpecs/TCLStruk.tcl new file mode 100644 index 0000000..be84cdd --- /dev/null +++ b/TCLSpecs/TCLStruk.tcl @@ -0,0 +1,159 @@ +set pitch 64.0 +set press 64.0 + +button .pretty -bitmap @TCLSpecs/bitmaps/prcFunny.xbm \ +-background white -foreground black +.pretty config -bitmap @TCLSpecs/bitmaps/prc.xbm + +proc myExit {} { + puts stdout [format "ExitProgram"] + flush stdout + exit +} + +proc noteOn {pitchVal pressVal} { + puts stdout [format "NoteOn 0.0 1 %f %f" $pitchVal $pressVal] + flush stdout +} + +proc noteOff {pitchVal pressVal} { + puts stdout [format "NoteOff 0.0 1 %f %f" $pitchVal $pressVal] + flush stdout +} + +proc patchChange {value} { + global .pretty + puts stdout [format "ProgramChange 0.0 1 %i" $value] + if {$value==4} { + .pretty config -bitmap @TCLSpecs/bitmaps/KPluk.xbm + } + if {$value==5} { + .pretty config -bitmap @TCLSpecs/bitmaps/KModal.xbm + } + if {$value==6} { + .pretty config -bitmap @TCLSpecs/bitmaps/KModal.xbm + } + if {$value==7} { + .pretty config -bitmap @TCLSpecs/bitmaps/KModal.xbm + } + if {$value==8} { + .pretty config -bitmap @TCLSpecs/bitmaps/KFMod.xbm + } + if {$value==9} { + .pretty config -bitmap @TCLSpecs/bitmaps/KFMod.xbm + } + if {$value==10} { + .pretty config -bitmap @TCLSpecs/bitmaps/KFMod.xbm + } + flush stdout +} + +proc printWhatz {tag value1 value2 } { + puts stdout [format "%s %i %f" $tag $value1 $value2] + flush stdout +} + +proc changePress {value} { + global press + set press $value + puts stdout [format "AfterTouch 0.0 1 %f" $press] + flush stdout +} + +proc changePitch {value} { + global pitch + set pitch $value + puts stdout [format "PitchBend 0.0 1 %f" $pitch] + flush stdout +} + +scale .bPressure -from 0 -to 128 -length 200 \ +-command {changePress } \ +-activeforeground white -sliderforeground grey80\ +-orient horizontal -label "Breath Pressure" \ +-tickinterval 32 -showvalue true -bg grey66 + +scale .pitch -from 0 -to 128 -length 200 \ +-command {changePitch } \ +-activeforeground white -sliderforeground grey80\ +-orient horizontal -label "MIDI Note Number" \ +-tickinterval 32 -showvalue true -bg grey66 + +scale .cont1 -from 0 -to 128 -length 200 \ +-command {printWhatz "ControlChange 0.0 1 " 2} \ +-activeforeground white -sliderforeground grey80\ +-orient horizontal -label "Stick/Pick Hardness" \ +-tickinterval 32 -showvalue true -bg grey66 + +scale .cont2 -from 0 -to 128 -length 200 \ +-command {printWhatz "ControlChange 0.0 1 " 4} \ +-activeforeground white -sliderforeground grey80\ +-orient horizontal -label "Strike/Pick Position" \ +-tickinterval 32 -showvalue true -bg grey66 + +scale .cont3 -from 0 -to 128 -length 200 \ +-command {printWhatz "ControlChange 0.0 1 " 11} \ +-activeforeground white -sliderforeground grey80\ +-orient horizontal -label "Vibrato Rate" \ +-tickinterval 32 -showvalue true -bg grey66 + +scale .vibrato -from 0 -to 128 -length 200 \ +-command {printWhatz "ControlChange 0.0 1 " 1} \ +-activeforeground white -sliderforeground grey80\ +-orient horizontal -label "Vibrato Amount" \ +-tickinterval 32 -showvalue true -bg grey66 + +. config -bg grey20 + +frame .modal -bg black +frame .fm -bg black + +radiobutton .mand -text Mandolin -bg grey66 \ +-command { patchChange 4 } +radiobutton .modal.mari -text Marimba -bg grey66 \ +-command { patchChange 5 } +radiobutton .modal.vibr -text Vibraphn -bg grey66 \ +-command { patchChange 6 } +radiobutton .modal.agog -text AgogoBel -bg grey66 \ +-command { patchChange 7 } +radiobutton .fm.rhod -text Rhodey -bg grey66 \ +-command { patchChange 8 } +radiobutton .fm.wurl -text Wurley -bg grey66 \ +-command { patchChange 9 } +radiobutton .fm.tube -text TubeBell -bg grey66 \ +-command { patchChange 10 } + +pack .mand -padx 5 -pady 10 +pack .modal.mari -side left -padx 5 +pack .modal.vibr -side left -padx 5 +pack .modal.agog -side left -padx 5 -pady 10 +pack .modal +pack .fm.rhod -side left -padx 5 +pack .fm.wurl -side left -padx 5 +pack .fm.tube -side left -padx 5 -pady 10 +pack .fm + +pack .pretty -padx 5 -pady 10 + +pack .bPressure -padx 10 -pady 10 +pack .pitch -padx 10 -pady 10 +pack .vibrato -padx 10 -pady 10 +pack .cont1 -padx 10 -pady 10 +pack .cont2 -padx 10 -pady 10 +pack .cont3 -padx 10 -pady 10 + +frame .noteOn -bg black + +button .noteOn.on -text NoteOn -bg grey66 -command { noteOn $pitch $press } +button .noteOn.off -text NoteOff -bg grey66 -command { noteOff $pitch 127.0 } +button .noteOn.exit -text "Exit Program" -bg grey66 -command myExit +pack .noteOn.on -side left -padx 5 +pack .noteOn.off -side left -padx 5 -pady 10 +pack .noteOn.exit -side left -padx 5 -pady 10 + +bind all { + noteOn $pitch $press +} + +pack .noteOn + diff --git a/TCLSpecs/TCLVoice.tcl b/TCLSpecs/TCLVoice.tcl new file mode 100644 index 0000000..3196efc --- /dev/null +++ b/TCLSpecs/TCLVoice.tcl @@ -0,0 +1,124 @@ +set pitch 64.0 +set press 64.0 + +button .pretty -bitmap @TCLSpecs/bitmaps/prcFunny.xbm \ +-background white -foreground black +.pretty config -bitmap @TCLSpecs/bitmaps/prc.xbm + +proc myExit {} { + puts stdout [format "ExitProgram"] + flush stdout + exit +} + +proc noteOn {pitchVal pressVal} { + puts stdout [format "NoteOn 0.0 1 %f %f" $pitchVal $pressVal] + flush stdout +} + +proc noteOff {pitchVal pressVal} { + puts stdout [format "NoteOff 0.0 1 %f %f" $pitchVal $pressVal] + flush stdout +} + +proc patchChange {value} { + global .pretty + puts stdout [format "ProgramChange 0.0 1 %i" $value] + if {$value==11} { + .pretty config -bitmap @TCLSpecs/bitmaps/KVoiceFM.xbm + } + if {$value==12} { + .pretty config -bitmap @TCLSpecs/bitmaps/KVoicForm.xbm + } + flush stdout +} + +proc printWhatz {tag value1 value2 } { + puts stdout [format "%s %i %f" $tag $value1 $value2] + flush stdout +} + +proc changePress {value} { + global press + set press $value + puts stdout [format "AfterTouch 0.0 1 %f" $press] + flush stdout +} + +proc changePitch {value} { + global pitch + set pitch $value + puts stdout [format "PitchBend 0.0 1 %f" $pitch] + flush stdout +} + +scale .bPressure -from 0 -to 128 -length 200 \ +-command {changePress } \ +-activeforeground white -sliderforeground grey80\ +-orient horizontal -label "Loudness (Spectral Tilt)" \ +-tickinterval 32 -showvalue true -bg grey66 + +scale .pitch -from 0 -to 128 -length 200 \ +-command {changePitch } \ +-activeforeground white -sliderforeground grey80\ +-orient horizontal -label "MIDI Note Number" \ +-tickinterval 32 -showvalue true -bg grey66 + +scale .cont1 -from 0 -to 128 -length 200 \ +-command {printWhatz "ControlChange 0.0 1 " 2} \ +-activeforeground white -sliderforeground grey80\ +-orient horizontal -label "Formant Q / Voiced/Un." \ +-tickinterval 32 -showvalue true -bg grey66 + +scale .cont2 -from 0 -to 128 -length 200 \ +-command {printWhatz "ControlChange 0.0 1 " 4} \ +-activeforeground white -sliderforeground grey80\ +-orient horizontal -label "Vowel (Bass, Tenor, Alto, Sop.)" \ +-tickinterval 32 -showvalue true -bg grey66 + +scale .cont3 -from 0 -to 128 -length 200 \ +-command {printWhatz "ControlChange 0.0 1 " 11} \ +-activeforeground white -sliderforeground grey80\ +-orient horizontal -label "Vibrato Rate" \ +-tickinterval 32 -showvalue true -bg grey66 + +scale .vibrato -from 0 -to 128 -length 200 \ +-command {printWhatz "ControlChange 0.0 1 " 1} \ +-activeforeground white -sliderforeground grey80\ +-orient horizontal -label "Vibrato Amount" \ +-tickinterval 32 -showvalue true -bg grey66 + +. config -bg grey20 + +frame .instChoice -bg black + +radiobutton .instChoice.fm -text FMVoice -bg grey66 \ +-command { patchChange 11 } +radiobutton .instChoice.form -text Formant -bg grey66 \ +-command { patchChange 12 } + +pack .instChoice.fm -side left -padx 5 +pack .instChoice.form -side left -padx 5 -pady 10 + +pack .instChoice + +pack .pretty -padx 5 -pady 10 + +pack .bPressure -padx 10 -pady 10 +pack .pitch -padx 10 -pady 10 +pack .vibrato -padx 10 -pady 10 +pack .cont1 -padx 10 -pady 10 +pack .cont2 -padx 10 -pady 10 +pack .cont3 -padx 10 -pady 10 + +frame .noteOn -bg black + +button .noteOn.on -text NoteOn -bg grey66 -command { noteOn $pitch $press } +button .noteOn.off -text NoteOff -bg grey66 -command { noteOff $pitch 127.0 } +button .noteOn.exit -text "Exit Program" -bg grey66 -command myExit +pack .noteOn.on -side left -padx 5 +pack .noteOn.off -side left -padx 5 -pady 10 +pack .noteOn.exit -side left -padx 5 -pady 10 + +pack .noteOn + diff --git a/TCLSpecs/bitmaps/KASM.xbm b/TCLSpecs/bitmaps/KASM.xbm new file mode 100644 index 0000000..f562852 --- /dev/null +++ b/TCLSpecs/bitmaps/KASM.xbm @@ -0,0 +1,117 @@ +#define KASM_width 220 +#define KASM_height 61 +static char KASM_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xfe,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0x02,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0xfa,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xf5,0x5a,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xf5,0xea,0xff,0xff,0xff,0xff,0xff,0xbf,0xaa,0xaa,0xaa,0xfa,0xed,0xff,0xef, + 0xbf,0x7f,0x55,0xab,0xea,0x6f,0xff,0xaa,0x7f,0x55,0x55,0x55,0x55,0xf5,0xca, + 0xaa,0xaa,0xfa,0xea,0xbd,0x6a,0x00,0x00,0x00,0xbc,0xcf,0x7d,0x8f,0x2f,0xbe, + 0x00,0x03,0x70,0x3d,0x7c,0x80,0x1f,0x00,0x00,0x00,0x00,0xf5,0x5a,0x00,0x00, + 0x06,0x10,0x36,0x20,0x55,0x55,0x55,0x0d,0xdc,0xf9,0x2c,0x8f,0x0c,0xd4,0x53, + 0xb5,0x30,0xf9,0xaa,0x4f,0x55,0x55,0x55,0x55,0xf5,0x4a,0x55,0xd5,0x91,0x84, + 0x2c,0x35,0x00,0x00,0x00,0x4e,0x4d,0x7a,0x8c,0x2f,0x42,0x81,0x07,0x38,0xba, + 0xf8,0x40,0x0f,0x00,0x00,0x00,0x00,0xf5,0x6a,0x00,0x60,0x08,0x51,0x78,0x60, + 0x29,0xa5,0x94,0x1e,0xd8,0x78,0x2a,0x9f,0x13,0xa8,0x57,0xba,0x20,0xec,0xd5, + 0xaf,0x52,0x4a,0x29,0x55,0xf5,0xca,0x52,0x3a,0x45,0x04,0xf2,0x29,0x42,0x08, + 0x41,0x7e,0x05,0x7c,0x11,0xcf,0x88,0xc2,0x0f,0xf9,0x54,0xf9,0x41,0x0f,0x84, + 0x10,0x42,0x00,0xf5,0x4a,0x04,0x4c,0x10,0xa1,0xe0,0x63,0x08,0x21,0x14,0xfd, + 0x50,0x79,0x84,0xff,0x42,0x50,0x4f,0xf4,0x03,0xca,0x35,0xaf,0x10,0x42,0x08, + 0x55,0xf5,0x5a,0xa1,0x06,0xff,0x09,0x4a,0x2b,0x42,0x08,0x41,0xfc,0x07,0x7a, + 0x21,0xff,0x10,0x65,0x1e,0xf1,0xaf,0xe8,0xa3,0x0f,0x84,0x10,0x42,0x00,0xf5, + 0x4a,0x88,0xd3,0x01,0xff,0xc7,0xa6,0x28,0xa2,0x10,0xf2,0xa7,0x78,0x14,0xff, + 0x4b,0x20,0x5f,0xd4,0x1f,0x8c,0x37,0x5f,0x51,0x44,0x11,0xa9,0xf5,0x6a,0xc5, + 0x38,0x24,0x00,0x9c,0x3c,0x02,0x09,0x84,0xc8,0x0f,0x7c,0x41,0xef,0x03,0x6a, + 0x1c,0x41,0x7f,0xa9,0x17,0x0f,0x04,0x12,0x48,0x02,0xf5,0x4a,0x60,0x0e,0x01, + 0x49,0x90,0xab,0xa8,0xa0,0x52,0x22,0x5f,0x79,0x24,0xdf,0x57,0xf1,0x7f,0x18, + 0x3d,0x98,0xb7,0x4f,0x51,0x41,0x05,0x50,0xf5,0x6a,0xb5,0xe1,0xff,0x10,0x35, + 0x2a,0x02,0x0a,0x00,0x8b,0x0e,0x7a,0x41,0x8f,0x0f,0x14,0x3e,0x4a,0xb8,0x4a, + 0x0f,0x2f,0x04,0x14,0x50,0x05,0xf5,0x4a,0xd0,0x38,0xc0,0x5f,0xe0,0xbe,0xa8, + 0x40,0x55,0x26,0x9e,0xf8,0x14,0x5f,0x5f,0x59,0x79,0x19,0x3d,0x08,0x4f,0x0f, + 0x51,0x41,0x05,0x50,0xf5,0xda,0x5a,0x8e,0x14,0xe0,0x75,0x26,0x02,0x2a,0x00, + 0x8e,0x46,0x7c,0x40,0x8f,0x3e,0x08,0x7c,0x5c,0x58,0xad,0x2e,0x5f,0x04,0x14, + 0x50,0x05,0xf5,0x4a,0xcc,0x23,0x00,0x89,0x12,0xb2,0x90,0x80,0xaa,0x2e,0x0b, + 0x79,0x15,0x2f,0xbe,0x2e,0xf9,0x39,0x1d,0x18,0x86,0x0f,0x21,0x81,0x04,0x50, + 0xf5,0x6a,0x66,0x88,0xaa,0x10,0xb4,0x60,0x44,0x24,0x00,0xf2,0x43,0xfe,0xc1, + 0xbf,0xff,0x7e,0xfe,0xd9,0x47,0x7f,0xd5,0x7f,0x88,0x28,0x51,0x05,0xf5,0xca, + 0x36,0x22,0x00,0x5e,0x3d,0x2a,0x12,0x89,0x54,0x09,0x28,0x22,0x2a,0x01,0x12, + 0x01,0x44,0x44,0x10,0x00,0x04,0x08,0x25,0x02,0x04,0x50,0xf5,0x5a,0x93,0x88, + 0xfa,0xe3,0xe8,0x20,0x41,0x20,0x01,0xa2,0x82,0x88,0x40,0xa8,0x40,0x54,0x11, + 0x11,0x85,0x2a,0xa1,0x42,0x80,0x50,0x91,0x04,0xf5,0xca,0x01,0x7f,0x0f,0x88, + 0xca,0x6a,0x14,0x0a,0xa4,0x08,0x28,0x22,0x12,0x05,0x14,0x01,0x44,0x44,0x20, + 0x40,0x14,0x28,0x2a,0x0a,0x04,0x51,0xf5,0xca,0xd4,0x01,0x40,0xe2,0xf8,0x20, + 0x41,0x41,0x09,0x42,0x82,0x88,0x44,0xa0,0x42,0x54,0x11,0x11,0x15,0x09,0x81, + 0x82,0x80,0x20,0x51,0x04,0xf5,0xda,0x60,0xa0,0x94,0x3c,0x24,0x35,0x12,0x14, + 0x90,0x28,0x21,0x22,0x10,0x0a,0x10,0x01,0x44,0x44,0x40,0x44,0x28,0x24,0x2a, + 0x44,0x04,0x51,0xf5,0x4a,0x34,0x0a,0x01,0x87,0x1e,0xa0,0x20,0x81,0x22,0x02, + 0x88,0x08,0x45,0x41,0x45,0x28,0x11,0x11,0x15,0x21,0x82,0x88,0x00,0x11,0x51, + 0x04,0xf5,0x6a,0x11,0x41,0x28,0xf1,0x7b,0x35,0x8a,0x28,0x88,0x50,0x25,0x42, + 0x10,0x14,0x10,0x42,0x04,0x44,0x40,0x14,0x29,0x22,0xa9,0x44,0x04,0xa1,0xf5, + 0x4a,0x5a,0x14,0xc5,0x3d,0x60,0xa0,0x20,0x84,0x03,0x0a,0xf0,0x28,0x22,0xf9, + 0x45,0x11,0xa7,0x10,0x1d,0xe1,0x9f,0x08,0xf7,0x6e,0x48,0x14,0xf5,0xda,0x08, + 0x41,0x60,0x04,0x69,0x29,0x0a,0xd1,0xa9,0xa0,0x66,0x82,0x44,0xcc,0x10,0xc4, + 0x16,0x42,0x4c,0x28,0x33,0x90,0x66,0x6e,0x05,0x41,0xf5,0x4a,0x4c,0x14,0x35, + 0x46,0x3c,0xa4,0x40,0xc4,0x03,0x08,0x6e,0x28,0x10,0xae,0x44,0x71,0x46,0x11, + 0x0a,0x65,0x97,0x22,0xee,0x43,0x2e,0x12,0xf5,0x5a,0x15,0x41,0xf0,0x13,0x46, + 0x31,0x2a,0x51,0xfb,0xf3,0xef,0xe3,0x9b,0x9c,0xf3,0xf7,0x1f,0xde,0xef,0x13, + 0xc3,0xf3,0x66,0x79,0x8f,0x40,0xf5,0x4a,0x44,0x14,0x05,0x88,0x12,0xa4,0x00, + 0x64,0x67,0xdb,0x67,0xf3,0x37,0x7a,0xd7,0x66,0xbe,0xf7,0x6e,0x42,0x73,0xdf, + 0xef,0xe3,0x26,0x14,0xf5,0x6a,0x15,0x41,0x40,0x42,0x4a,0x31,0xa9,0xa8,0x76, + 0xbf,0x77,0xfb,0x8f,0xe8,0xd3,0x6e,0x36,0xff,0xed,0x15,0xe7,0xbe,0x67,0x6b, + 0x8e,0x42,0xf5,0x4a,0x44,0x10,0x95,0x28,0x03,0x24,0x02,0xf2,0xe7,0x9b,0xe7, + 0x33,0x26,0xc4,0xde,0xe6,0x76,0xcb,0xdf,0x83,0x6b,0x9e,0x77,0xe7,0x26,0x10, + 0xf5,0x6a,0x1d,0x45,0x00,0x02,0xaa,0xa8,0xa8,0x30,0x6e,0xfb,0x6f,0xf7,0x86, + 0xee,0xee,0x76,0x36,0x27,0x6f,0x2b,0xe3,0xff,0xe7,0x6e,0x0e,0x45,0xf5,0x4a, + 0x50,0x10,0xaa,0x50,0x05,0x22,0x02,0xbc,0x7f,0xf7,0x7c,0xe7,0x2f,0x7c,0xed, + 0xcf,0x7f,0xff,0xff,0x83,0xd7,0xf3,0x7f,0xfe,0x4d,0x10,0xf5,0x6a,0x35,0x85, + 0x00,0x0a,0xac,0xb0,0x50,0x01,0x24,0x09,0x82,0x10,0x89,0x12,0x14,0x20,0x41, + 0x28,0x01,0xa8,0x04,0x08,0x11,0x12,0x20,0x45,0xf5,0xca,0x60,0x50,0xaa,0x40, + 0x0d,0x2a,0x04,0x54,0x41,0xa0,0x28,0x44,0x22,0x80,0x87,0x4a,0x14,0x42,0xa8, + 0x02,0x50,0x45,0x84,0x88,0x0a,0x10,0xf5,0xda,0x44,0x05,0x00,0x14,0x98,0x60, + 0x51,0x01,0x14,0x0a,0x82,0x12,0x08,0x55,0x2b,0x00,0x41,0x11,0x05,0x50,0x05, + 0x10,0x51,0x42,0x40,0x45,0xf5,0xca,0x00,0x00,0x4a,0x01,0x48,0x24,0x04,0x54, + 0x41,0xa1,0x28,0x80,0xa2,0x00,0x02,0x55,0x14,0x44,0xa0,0x0a,0x50,0x45,0x04, + 0x28,0x2a,0x20,0xf5,0xda,0x20,0x49,0x00,0x22,0x09,0x31,0x51,0x01,0x14,0x08, + 0x82,0x2a,0x08,0xaa,0xa8,0x00,0x41,0x11,0x0a,0x40,0x05,0x10,0xa1,0x02,0x81, + 0x8a,0xf5,0xca,0x34,0xc0,0x0d,0x40,0x02,0x60,0x04,0x28,0x81,0xa2,0x28,0x00, + 0x91,0x00,0x02,0x2a,0x12,0x44,0x21,0x15,0xa0,0x44,0x14,0x50,0x28,0x20,0xf5, + 0x5a,0x10,0x39,0xa4,0xf7,0x85,0x20,0xc9,0x47,0x54,0x08,0x02,0x55,0x24,0x94, + 0xb8,0x80,0xf0,0x13,0xbc,0x80,0xea,0x11,0x71,0x8f,0x83,0x0b,0xf5,0x4a,0x54, + 0xaa,0x20,0x02,0x01,0x60,0x20,0x0b,0x01,0x93,0xa8,0x00,0x01,0x41,0x3a,0x29, + 0xea,0x86,0xdc,0x2a,0xc0,0x44,0x38,0xdf,0xf7,0x40,0xf5,0xda,0x00,0x03,0x00, + 0x04,0x24,0x24,0x8a,0x43,0xa8,0x21,0x02,0x54,0xa8,0xf4,0x30,0x82,0x60,0x2e, + 0xc6,0x80,0xd4,0x00,0x35,0xfb,0x66,0x2a,0xf5,0x4a,0x88,0x01,0x42,0x20,0x00, + 0xb0,0x20,0xff,0xfa,0xef,0xfb,0x36,0xfd,0xf3,0xf4,0x98,0xeb,0x86,0x0e,0x7d, + 0xde,0x5e,0x70,0xdb,0xbe,0x00,0xf5,0x6a,0x0d,0xa3,0x00,0x8a,0x20,0x22,0x09, + 0xb3,0xcd,0x5b,0x9b,0x6d,0xee,0x66,0xf2,0xbd,0xe0,0x27,0x46,0xfc,0xfb,0x06, + 0x35,0x9e,0xf7,0xaa,0xf5,0x4a,0x14,0x09,0x11,0x20,0x82,0x20,0xa2,0xbb,0xbd, + 0x59,0xdf,0xef,0xfe,0xee,0xb8,0x99,0x69,0x90,0x16,0xcd,0xf7,0x53,0xb0,0xba, + 0xb6,0x01,0xf5,0x6a,0x05,0x21,0x40,0x88,0x08,0xb2,0x08,0xf3,0xfb,0x1d,0x9b, + 0x7d,0xc6,0x67,0xb2,0xb5,0xe4,0x42,0x46,0xec,0xf3,0x07,0x3a,0x0c,0xbb,0x53, + 0xf5,0x4a,0x24,0x89,0x14,0x21,0xa0,0x20,0x42,0xb7,0xed,0x59,0xbf,0x6d,0xdf, + 0x6e,0xf0,0x71,0x61,0x18,0x9d,0xdd,0xf7,0xbc,0xb0,0xce,0xb3,0x05,0xf5,0x6a, + 0x00,0x21,0x40,0x00,0x00,0xa4,0x90,0xbf,0x7f,0xbf,0xf6,0xed,0xfc,0xde,0xd5, + 0x75,0xf8,0x5d,0x78,0x78,0xfe,0x3e,0x7a,0xd3,0xe9,0x50,0xf5,0xca,0xff,0xff, + 0xff,0xff,0xff,0x3f,0x44,0x40,0x00,0x12,0x08,0x92,0x84,0x40,0x10,0x60,0x05, + 0x10,0x85,0x8a,0x92,0xb0,0x48,0x0a,0xa2,0x04,0xf5,0x2a,0x41,0x42,0x12,0x09, + 0x49,0xa2,0x12,0x15,0xaa,0x88,0xa2,0x04,0x21,0x0a,0x45,0x3a,0xa0,0x44,0x20, + 0x20,0x08,0x54,0x82,0x40,0x08,0x51,0xf5,0x0a,0x14,0x11,0x41,0x44,0x84,0x08, + 0x40,0x40,0x01,0x42,0x08,0x50,0x88,0x40,0x10,0x19,0x15,0x11,0x95,0x8a,0xa2, + 0x02,0x28,0x2a,0x22,0x04,0xf5,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xf5,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xf4,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0}; diff --git a/TCLSpecs/bitmaps/KFMod.xbm b/TCLSpecs/bitmaps/KFMod.xbm new file mode 100644 index 0000000..60f18d9 --- /dev/null +++ b/TCLSpecs/bitmaps/KFMod.xbm @@ -0,0 +1,117 @@ +#define KFMod_width 220 +#define KFMod_height 61 +static char KFMod_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xfe,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0x02,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0xfa,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xf5,0x5a,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xf5,0xea,0xff,0xff,0xff,0xff,0xff,0x7f,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xf5,0x4a, + 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x9f,0xfc,0xff,0xfc,0xf3, + 0xf7,0xff,0xf3,0x03,0xf8,0x01,0x00,0xf8,0x00,0x00,0x00,0xf5,0x6a,0x00,0x00, + 0x00,0x00,0x00,0xa0,0xaa,0xaa,0xaa,0xea,0xf1,0x9c,0xe7,0xf1,0xc4,0xc1,0x83, + 0xc7,0x53,0x7d,0xa8,0xaa,0xe2,0x54,0x55,0x55,0xf5,0x4a,0x80,0x7f,0x00,0x00, + 0x00,0x20,0x00,0x00,0x00,0xc0,0xd4,0xad,0xcf,0xf4,0x51,0xd4,0x2b,0xd3,0x0f, + 0xfc,0x02,0x00,0xe8,0x02,0x00,0x00,0xf5,0x5a,0x80,0x80,0x01,0x00,0x00,0x60, + 0xa5,0x94,0x52,0xea,0xc1,0x84,0xa7,0xf0,0xa4,0xc2,0x83,0xc2,0x47,0x7b,0xa8, + 0x94,0xe2,0x48,0x29,0x55,0xf5,0x4a,0x80,0x1c,0x02,0x00,0x00,0x20,0x08,0x21, + 0x84,0xe0,0xa8,0xad,0x87,0xf5,0x38,0xd0,0x57,0x6a,0x1f,0x7a,0x02,0x21,0xf0, + 0x12,0x42,0x00,0xf5,0x6a,0x80,0x14,0x04,0x00,0x00,0x60,0x42,0x08,0x21,0xf4, + 0x03,0x80,0x57,0xf0,0x8e,0xca,0xe3,0x42,0x4f,0x7b,0xe9,0x85,0xef,0x40,0x08, + 0x55,0xf5,0x4a,0x80,0x22,0x06,0x00,0x00,0xa0,0x10,0x42,0x08,0xc1,0xaf,0xaa, + 0x07,0xf5,0x2e,0xd0,0x77,0xd0,0x0e,0x7d,0x30,0x93,0xf7,0x15,0x42,0x00,0xf5, + 0x5a,0x80,0x22,0x7e,0x00,0x00,0x20,0x4a,0x29,0xa5,0xe4,0x3f,0x80,0x57,0xf0, + 0x8f,0xc2,0x7f,0x4a,0x5e,0x79,0xbd,0xa6,0xe9,0x40,0x11,0xa9,0xf5,0x4a,0x80, + 0x40,0x45,0x00,0x00,0xa0,0x00,0x00,0x00,0x88,0x7f,0xd5,0x07,0xfa,0x3f,0xd0, + 0x73,0x61,0x9d,0x7a,0x1c,0xce,0xe1,0x14,0x48,0x02,0xf5,0x6a,0x80,0xc0,0x45, + 0x00,0x00,0x20,0xaa,0xaa,0xaa,0x22,0xfe,0x80,0x57,0xf1,0xbe,0xca,0x6b,0x48, + 0xfc,0x78,0x5d,0xdf,0xeb,0x41,0x05,0x50,0xf5,0x4a,0x80,0x00,0x42,0x00,0x00, + 0xa0,0x00,0x00,0x00,0xa0,0xf0,0xaa,0x07,0xf4,0x7d,0xe0,0xd3,0xc2,0xbe,0x7d, + 0x1c,0xce,0xe1,0x14,0x50,0x05,0xf5,0x5a,0x80,0x80,0x41,0x00,0x00,0x20,0xaa, + 0xaa,0xaa,0x2a,0xea,0x80,0x2f,0xf1,0xf8,0xca,0x47,0x50,0x78,0x78,0xbd,0xde, + 0xf5,0x41,0x05,0x50,0xf5,0x4a,0x80,0x7f,0x40,0x00,0x00,0xa0,0x00,0x00,0x00, + 0xe0,0xe0,0xd5,0x47,0xf4,0xf4,0xc1,0x23,0x65,0x7a,0xfa,0x1c,0xce,0xe1,0x10, + 0x50,0x05,0xf5,0x6a,0x00,0x00,0x40,0x00,0x00,0x20,0x4a,0x29,0xa5,0x6a,0x74, + 0x80,0x0f,0xf1,0xe2,0xd7,0x8b,0xc0,0x34,0x79,0x9a,0xa6,0xeb,0x85,0x04,0x50, + 0xf5,0x4a,0x00,0x00,0x40,0x00,0x00,0xa0,0x10,0x42,0x08,0xe0,0xb1,0xa4,0x47, + 0xf8,0xe8,0xc3,0x23,0x54,0x70,0x7c,0x34,0x93,0xf3,0x20,0x51,0x05,0xf5,0x5a, + 0x00,0x00,0x40,0x00,0x00,0x20,0x84,0x10,0x42,0x35,0x1f,0xe2,0x3f,0xfe,0xf3, + 0xff,0x9f,0xf2,0x2b,0xfe,0xf1,0x45,0xef,0x15,0x04,0x50,0xf5,0x4a,0x80,0x7f, + 0x40,0xfe,0x01,0x60,0x21,0x84,0x10,0x80,0xa4,0x10,0x80,0x20,0x25,0x92,0x24, + 0x88,0x40,0x21,0x45,0x11,0x11,0x41,0x91,0x04,0xf5,0x5a,0x80,0x80,0x41,0x02, + 0x06,0x20,0x94,0x52,0x4a,0x55,0x10,0xa4,0x2a,0x44,0x88,0x20,0x42,0x22,0x14, + 0x48,0x10,0x04,0x44,0x14,0x04,0x51,0xf5,0x4a,0x80,0x1c,0x42,0x72,0x08,0x20, + 0x01,0x00,0x00,0x00,0x85,0x02,0x00,0x11,0x22,0x8a,0x10,0x88,0x42,0x85,0x44, + 0x51,0x11,0x21,0x51,0x04,0xf5,0x5a,0x80,0x14,0x44,0x52,0x10,0x60,0x54,0x55, + 0x55,0x4a,0x50,0xa8,0xaa,0x84,0x88,0x20,0x8a,0x22,0x10,0x10,0x11,0x04,0x44, + 0x44,0x04,0x51,0xf5,0x4a,0x80,0x22,0x46,0x8a,0x18,0x20,0x01,0x00,0x80,0x10, + 0x05,0x02,0x00,0x20,0x22,0x8a,0x40,0x88,0x8a,0x22,0x04,0x51,0x11,0x08,0x51, + 0x04,0xf5,0x5a,0x80,0x22,0xfe,0x8b,0xf8,0x67,0xa8,0xaa,0x2a,0x42,0x50,0x51, + 0x55,0x95,0x88,0x20,0x14,0x22,0x40,0x88,0x50,0x04,0x84,0x22,0x04,0xa1,0xf5, + 0x4a,0x80,0x40,0x45,0x02,0x15,0x20,0x02,0x00,0x83,0x10,0xe2,0x08,0x00,0xf0, + 0x21,0x88,0x8e,0x08,0x1d,0xc2,0x3f,0x91,0xfe,0xdd,0x48,0x14,0xf5,0x5a,0x80, + 0xc0,0x45,0x02,0x17,0x20,0x51,0x4a,0x27,0x44,0xc9,0xa2,0xaa,0x9a,0x8b,0x82, + 0x2d,0x42,0xb8,0x68,0x66,0x44,0xcc,0xec,0x0a,0x41,0xf5,0x4a,0x80,0x00,0x42, + 0x02,0x08,0x60,0x84,0x90,0x8f,0x12,0xdc,0x08,0x00,0x58,0x21,0xe8,0x8c,0x10, + 0x05,0x42,0x2f,0x11,0xdd,0x87,0x2c,0x12,0xf5,0x5a,0x80,0x80,0x41,0x02,0x06, + 0x20,0x21,0x84,0xe6,0xe3,0xdf,0xe3,0x77,0x3d,0xe6,0xe7,0x3f,0xbe,0xbf,0x4f, + 0x86,0xe7,0xcd,0xf6,0x9e,0x40,0xf5,0x4a,0x80,0x7f,0x40,0xfe,0x01,0xa0,0x08, + 0xe1,0xd6,0xfe,0xdf,0xe7,0x2f,0xf0,0xb7,0xcf,0xfc,0xee,0xdc,0x24,0xee,0xbe, + 0xdf,0xc3,0x2d,0x14,0xf5,0x5a,0x00,0x00,0x40,0x00,0x00,0x20,0xa4,0x48,0xcd, + 0x36,0xcf,0xee,0x2f,0xd5,0xa7,0xdd,0x6c,0xfe,0xdb,0x87,0xc6,0x7d,0xcf,0xd6, + 0x8c,0x42,0xf5,0x4a,0x00,0x00,0x40,0x00,0x00,0xa0,0x02,0xe4,0xef,0x76,0xef, + 0x66,0x4c,0x88,0xed,0xcd,0xed,0xa6,0xbf,0x27,0xd6,0x3c,0xef,0xce,0x2e,0x10, + 0xf5,0x5a,0x00,0x00,0x40,0x00,0x00,0x20,0x50,0x31,0xdc,0x77,0xcf,0xf6,0x1e, + 0xba,0x9f,0xed,0x6c,0xce,0xde,0x16,0xc7,0x7f,0xcf,0xfd,0x1c,0x45,0xf5,0x4a, + 0x00,0x00,0x40,0x00,0x00,0xa0,0x0a,0x74,0xff,0xee,0xfb,0xcf,0x5f,0xf9,0xd8, + 0x9f,0xef,0xfe,0xff,0x43,0xaf,0xef,0xff,0xfc,0x59,0x10,0xf5,0x5a,0x80,0x7f, + 0x40,0x00,0x00,0x20,0x40,0x41,0x08,0x24,0x20,0x90,0x00,0x44,0x5a,0x90,0x94, + 0x24,0x04,0x14,0x08,0x80,0x88,0x04,0x05,0x45,0xf5,0x4a,0x80,0x80,0x41,0x00, + 0x00,0xa0,0x2a,0x14,0x42,0x89,0x0a,0x25,0x2a,0x11,0x8e,0x04,0x21,0x10,0x51, + 0x41,0x45,0x29,0x22,0x51,0x50,0x10,0xf5,0x5a,0x80,0x1c,0x42,0x00,0x00,0x20, + 0x00,0x81,0x28,0x20,0x40,0x80,0x40,0x44,0x17,0x51,0x08,0x45,0x04,0x14,0x20, + 0x82,0x08,0x04,0x05,0x45,0xf5,0x4a,0x80,0x14,0x44,0xfc,0x1d,0xae,0x54,0x54, + 0x82,0x8a,0x2a,0x2a,0x14,0x11,0x40,0x04,0x45,0x10,0x51,0x81,0x8a,0x28,0x42, + 0x51,0x50,0x20,0xf5,0x5a,0x80,0x22,0x46,0x98,0x19,0x27,0x01,0x01,0x28,0x20, + 0x00,0x01,0x41,0x44,0x15,0x51,0x20,0x42,0x04,0x54,0x20,0x82,0x10,0x84,0x04, + 0x8a,0xf5,0x4a,0x80,0x22,0x7e,0x18,0x18,0x67,0x54,0xa8,0x02,0x89,0xaa,0xa8, + 0x08,0x11,0x00,0x04,0x15,0x11,0x51,0x01,0x0a,0x28,0x4a,0x11,0xa2,0x20,0xf5, + 0x5a,0x80,0x40,0x05,0x4c,0x9c,0x22,0x81,0x0f,0x50,0x22,0x00,0x02,0x22,0x84, + 0x7a,0x51,0xe0,0x47,0x70,0xa9,0xe0,0x83,0x60,0x5c,0x0f,0x0b,0xf5,0x4a,0x80, + 0xc0,0x05,0x7c,0x54,0x23,0x24,0x4e,0x05,0x8a,0xaa,0xa8,0x10,0xa1,0x60,0x04, + 0xd2,0x1c,0x9d,0x03,0x8a,0x25,0x74,0xb7,0xed,0x45,0xf5,0x5a,0x80,0x00,0x02, + 0x2c,0x74,0xa3,0x88,0x26,0xa0,0x23,0x00,0x02,0x8a,0xc8,0x74,0xa1,0xc8,0x4e, + 0x4c,0xa9,0xa0,0x11,0x69,0xb6,0xcd,0x21,0xf5,0x4a,0x80,0x80,0x01,0x06,0xb6, + 0x21,0x22,0xf6,0xfb,0xdf,0xbf,0xed,0xf8,0xe7,0xe3,0x35,0xe3,0x0c,0x1d,0xf1, + 0xbe,0x9b,0xe0,0xf6,0x6d,0x14,0xf5,0x5a,0x80,0x7f,0x00,0x06,0xb6,0xa1,0x08, + 0x67,0x9b,0xb7,0x76,0xdf,0xdd,0xdd,0x68,0x73,0xcb,0x57,0x2c,0xda,0xf7,0x2d, + 0x6a,0x3e,0xff,0x81,0xf5,0x4a,0x00,0x00,0x00,0x0f,0x97,0x23,0x42,0x76,0x7b, + 0x73,0x37,0xdb,0xfc,0xcf,0x62,0x37,0xe1,0x04,0x8d,0x98,0xef,0x87,0xe0,0x30, + 0x6d,0x2b,0xf5,0x5a,0x00,0x00,0x00,0x00,0x00,0xa0,0x28,0x67,0xf7,0x37,0x76, + 0xdb,0xae,0xed,0x70,0xe3,0xc9,0x51,0x1c,0xba,0xe7,0x2d,0x6a,0x5c,0xe6,0x03, + 0xf5,0x4a,0x00,0x00,0x00,0x00,0x00,0x20,0x02,0x76,0xdb,0xb3,0x3e,0xff,0x9c, + 0xcd,0xea,0xeb,0xc2,0x34,0x5a,0xb9,0xff,0xfd,0x60,0x3d,0x6f,0x57,0xf5,0x5a, + 0x00,0x00,0x00,0x00,0x00,0xa0,0xa8,0xff,0x7f,0x7e,0xed,0xdb,0xfb,0xbf,0xa1, + 0xc5,0xf0,0xb1,0xf0,0xf5,0xfc,0x79,0xfa,0x86,0xd1,0x01,0xf5,0xca,0xff,0xff, + 0xff,0xff,0xff,0x3f,0x02,0x02,0x80,0x12,0x24,0x01,0x48,0x40,0x4a,0x60,0x8a, + 0x24,0x0a,0x40,0x82,0x44,0x40,0x52,0x85,0x54,0xf5,0x4a,0x00,0x00,0x00,0x00, + 0x00,0xa4,0x48,0xa8,0x2a,0x40,0x11,0x54,0x11,0x8a,0x10,0xf5,0x20,0x82,0xa0, + 0x94,0x28,0x68,0x15,0x08,0x20,0x02,0xf5,0x1a,0x55,0x55,0x55,0x55,0x55,0x09, + 0x22,0x02,0x00,0x15,0x44,0x01,0x44,0x21,0x42,0x30,0x8a,0x28,0x0a,0x02,0x82, + 0x02,0x80,0xa2,0x8a,0x50,0xf5,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xf5,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xf4,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0}; diff --git a/TCLSpecs/bitmaps/KFiddl.xbm b/TCLSpecs/bitmaps/KFiddl.xbm new file mode 100644 index 0000000..5a0e724 --- /dev/null +++ b/TCLSpecs/bitmaps/KFiddl.xbm @@ -0,0 +1,117 @@ +#define KFiddl_width 220 +#define KFiddl_height 61 +static char KFiddl_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xfe,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0x02,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0xfa,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xf5,0x5a,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xf5,0xea,0xff,0xff,0xff,0xff,0xff,0xbf,0xaa,0xaa,0xaa,0xfa,0xed,0xff,0xef, + 0xbf,0xff,0xff,0x7f,0x57,0xfd,0x55,0x7f,0x5f,0x55,0x55,0x55,0x55,0xf5,0x4a, + 0x53,0xbd,0xaa,0xaa,0xaa,0x6a,0x00,0x00,0x00,0xbc,0xcf,0x7d,0x8f,0x2f,0x3e, + 0x7e,0x3d,0x0f,0xf0,0x00,0x3c,0x3c,0x00,0x00,0x00,0x00,0xf5,0x6a,0x02,0x66, + 0x00,0x00,0x00,0x20,0x55,0x55,0x55,0x0d,0xdc,0xf9,0x2c,0x8f,0x84,0x3c,0x70, + 0x5f,0xe5,0x54,0xb9,0x1e,0x55,0x55,0x55,0x55,0xf5,0xca,0x81,0x44,0x55,0x55, + 0x55,0x35,0x00,0x00,0x00,0x4e,0x4d,0x7a,0x8c,0x2f,0x2a,0x3c,0x29,0x06,0xe0, + 0x01,0x38,0x5c,0x00,0x00,0x00,0x00,0xf5,0x5a,0x40,0x69,0x00,0x00,0x00,0x60, + 0x29,0xa5,0x94,0x1e,0xd8,0x78,0x2a,0x9f,0x83,0xbe,0x24,0x25,0xf5,0x48,0x7d, + 0x1d,0x52,0x4a,0x29,0x55,0xf5,0x4a,0xc0,0x42,0xa5,0x94,0x72,0x29,0x42,0x08, + 0x41,0x7e,0x05,0x7c,0x11,0xcf,0x28,0x7c,0x56,0x1f,0xef,0xc5,0x3b,0x5c,0xf9, + 0x10,0x42,0x00,0xf5,0x6a,0x40,0x10,0x08,0x21,0xe4,0x63,0x08,0x21,0x14,0xfd, + 0x50,0x79,0x84,0xff,0x02,0x3d,0x07,0xce,0xf3,0xf0,0xbc,0x1e,0xc6,0x42,0x08, + 0x55,0xf5,0xca,0x80,0x4a,0x21,0x84,0xe8,0x2e,0x42,0x08,0x41,0xfc,0x07,0x7a, + 0x21,0xff,0xa8,0xfc,0xaf,0x8e,0xe9,0x64,0x3a,0x5c,0xd7,0x10,0x42,0x00,0xf5, + 0x5a,0x01,0x80,0x08,0x21,0xbe,0xad,0x28,0xa2,0x10,0xf2,0xa7,0x78,0x14,0xff, + 0x03,0xbc,0x07,0xde,0xe3,0xf1,0x78,0x1d,0xc7,0x45,0x11,0xa9,0xf5,0x4a,0xaa, + 0x54,0xa7,0x88,0xde,0x3a,0x02,0x09,0x84,0xc8,0x0f,0x7c,0x41,0xef,0xa7,0x3e, + 0xa6,0xce,0xe9,0x74,0x3a,0x5c,0xff,0x13,0x48,0x02,0xf5,0x6a,0x15,0x01,0x0d, + 0x24,0x1d,0xbb,0xa8,0xa0,0x52,0x22,0x5f,0x79,0x24,0xdf,0x0f,0xbc,0x16,0xde, + 0xe3,0xf1,0xb8,0x3e,0x4f,0x40,0x05,0x50,0xf5,0x4a,0x58,0x54,0xa9,0x02,0x74, + 0x3d,0x02,0x0a,0x00,0x8b,0x0e,0x7a,0x41,0x8f,0x4f,0x3d,0x84,0xce,0xe9,0x74, + 0x3c,0x1c,0x17,0x15,0x50,0x05,0xf5,0xda,0x62,0x01,0x08,0xa8,0x4e,0xbf,0xa8, + 0x40,0x55,0x26,0x9e,0xf8,0x14,0x2f,0x3f,0xbc,0x52,0xde,0xe1,0x71,0x79,0xbd, + 0x4f,0x40,0x05,0x50,0xf5,0x4a,0x90,0xa9,0xae,0x02,0xae,0x3d,0x02,0x2a,0x00, + 0x8e,0x46,0x7c,0x40,0x4f,0xbe,0x3e,0x08,0x8e,0xeb,0x68,0x38,0x1c,0x0e,0x15, + 0x50,0x05,0xf5,0x6a,0x25,0x03,0x0a,0x50,0xff,0xa3,0x90,0x80,0xaa,0x2e,0x0b, + 0x79,0x15,0x1f,0x3e,0xbc,0x42,0xaf,0xf3,0xe4,0x3e,0x9d,0xfe,0x81,0x04,0x50, + 0xf5,0x4a,0x40,0xaa,0x20,0x85,0xde,0x69,0x44,0x24,0x00,0xf2,0x43,0xfe,0xc1, + 0xbf,0xff,0xff,0x11,0x5f,0xef,0xe3,0x7b,0x3e,0x7a,0x28,0x51,0x05,0xf5,0x5a, + 0x15,0x1a,0x4a,0x70,0x8f,0x23,0x12,0x89,0x54,0x09,0x28,0x44,0x54,0x01,0x80, + 0x24,0x8a,0x00,0x29,0x88,0xa4,0xa4,0x08,0x05,0x04,0x50,0xf5,0x4a,0xf0,0xb3, + 0xf8,0xf5,0x57,0x30,0x41,0x20,0x01,0xa2,0x02,0x11,0x01,0xa8,0x2a,0x81,0x40, + 0x54,0x80,0x22,0x08,0x08,0x42,0x50,0x91,0x04,0xf5,0xea,0x8e,0x78,0x86,0x6f, + 0x03,0x65,0x14,0x0a,0xa4,0x08,0xa8,0x44,0x54,0x05,0x00,0x28,0x2a,0x02,0x2a, + 0x88,0xa2,0xa2,0x90,0x04,0x04,0x51,0xf5,0x4a,0x2c,0xa4,0xa9,0xf2,0x55,0x20, + 0x41,0x41,0x09,0x42,0x02,0x10,0x01,0x50,0x55,0x85,0x00,0x51,0x81,0x22,0x08, + 0x08,0x0a,0x21,0x51,0x04,0xf5,0xda,0x02,0xe1,0x05,0xef,0x01,0x35,0x12,0x14, + 0x90,0x28,0x51,0x45,0x28,0x05,0x00,0x20,0x54,0x04,0x24,0x40,0x42,0x91,0x40, + 0x48,0x04,0x51,0xf5,0x4a,0xa9,0x94,0xa1,0x7d,0x48,0xa0,0x20,0x81,0x22,0x02, + 0x04,0x10,0x42,0x50,0x55,0x15,0x01,0x21,0x11,0x95,0x28,0x44,0x14,0x05,0x51, + 0x04,0xf5,0x5a,0x03,0x80,0xcb,0x3e,0x12,0x35,0x8a,0x28,0x88,0x50,0x51,0x45, + 0x09,0x05,0x00,0x80,0x54,0x48,0x44,0x00,0x02,0x01,0x41,0x50,0x04,0xa1,0xf5, + 0x4a,0x51,0xd5,0xf7,0x77,0x41,0xa0,0x20,0x84,0x23,0x04,0x74,0x10,0x40,0xf8, + 0x4a,0x29,0x07,0x85,0x1c,0xf5,0x5f,0x54,0xf7,0x6f,0x48,0x14,0xf5,0xda,0xc5, + 0x7f,0xdc,0x3b,0x14,0x29,0x0a,0xd1,0x81,0xa2,0xe4,0x44,0x15,0xed,0x10,0xc2, + 0x56,0x20,0x4c,0x60,0x1b,0x01,0x6e,0x66,0x05,0x41,0xf5,0x4a,0x37,0x80,0x3c, + 0x6f,0x41,0xa4,0x40,0xc4,0x2b,0x10,0x66,0x11,0x40,0x8c,0x42,0x68,0x06,0x8a, + 0x02,0x25,0x53,0x54,0x67,0x53,0x2e,0x12,0xf5,0x6a,0xbe,0x7a,0xb5,0x73,0x12, + 0x31,0x2a,0x51,0xf3,0xf5,0xef,0xe5,0x1f,0x5e,0xfb,0xf3,0xbe,0xde,0xef,0x4b, + 0xd3,0xf3,0xee,0x75,0x8f,0x40,0xf5,0x4a,0x09,0x3e,0xfe,0x45,0x44,0xa4,0x00, + 0x64,0xe7,0xdb,0x6f,0x73,0x57,0x79,0xd3,0x6e,0x37,0x77,0x6e,0x12,0x67,0xdf, + 0xe7,0xe1,0x26,0x14,0xf5,0xda,0x5c,0x8f,0xd7,0x70,0x11,0x31,0x52,0xb1,0x6e, + 0xdb,0x67,0xfb,0x2f,0xe8,0xd7,0x67,0x76,0xff,0xed,0x81,0xe3,0x9e,0x6f,0x6b, + 0x8e,0x42,0xf5,0xca,0x1f,0xe3,0xf3,0x75,0x04,0xa4,0x04,0xf0,0x67,0x9f,0x77, + 0xb3,0x86,0xd6,0xde,0x76,0x37,0xe7,0xdf,0x2b,0x77,0xbe,0x67,0xe7,0x26,0x10, + 0xf5,0xca,0xd7,0xe9,0x78,0x5f,0x51,0x21,0x50,0x15,0x6e,0xbb,0xe7,0x77,0x26, + 0xcc,0xee,0x66,0x76,0xa7,0x6f,0x07,0xe3,0xbe,0x77,0x6f,0x0e,0x45,0xf5,0xda, + 0xe3,0x63,0xdf,0x73,0x04,0x74,0x05,0xb8,0xff,0xf7,0x7d,0xef,0x0f,0xfd,0xec, + 0xde,0x77,0xfe,0xff,0xd1,0xd7,0xf3,0x7f,0xfe,0x4d,0x10,0xf5,0x4a,0x17,0x78, + 0x37,0x7e,0x51,0x21,0x50,0x25,0x12,0x28,0x12,0x20,0xa9,0x10,0x85,0x42,0x8a, + 0x12,0x84,0x04,0x82,0x8a,0x80,0x12,0x20,0x45,0xf5,0xda,0x8c,0xde,0xda,0x0d, + 0x04,0xa8,0x04,0x88,0x88,0x42,0x44,0x09,0x02,0x24,0x2f,0x90,0x20,0x40,0x11, + 0xa1,0x28,0x20,0x2a,0x88,0x0a,0x10,0xf5,0x4a,0x5e,0x74,0x6d,0x35,0xa1,0x22, + 0x51,0x22,0x42,0x08,0x11,0xa0,0xa8,0x02,0x83,0x0a,0x0a,0x15,0x44,0x08,0x82, + 0x8a,0x80,0x22,0x40,0x45,0xf5,0x6a,0x13,0xbd,0x76,0x58,0x08,0x68,0x84,0x08, + 0x28,0x22,0x84,0x0a,0x02,0x50,0x29,0xa0,0x40,0x40,0x11,0xa5,0x28,0x20,0x2a, + 0x88,0x2a,0x20,0xf5,0xca,0x45,0xf4,0x1a,0x72,0xa2,0x2f,0x11,0xa2,0x82,0x88, + 0x50,0xa0,0xa8,0x0a,0x00,0x09,0x2a,0x15,0x44,0x00,0x02,0x89,0x40,0x22,0x80, + 0x8a,0xf5,0xda,0x14,0x32,0x5a,0xc1,0x49,0x2c,0x84,0x08,0x20,0x42,0x04,0x0a, + 0x02,0xa0,0xaa,0x90,0x00,0x20,0x11,0x95,0x50,0x22,0x14,0x88,0x2a,0x20,0xf5, + 0xca,0x4c,0x79,0x0b,0x54,0x7f,0x64,0xa1,0xa7,0x8a,0x28,0xa2,0x40,0x48,0x09, + 0x38,0x24,0xfa,0x87,0xb8,0x40,0xe4,0x08,0x71,0x9f,0x83,0x0b,0xf5,0x6a,0x19, + 0x4c,0x4d,0xe1,0x61,0x2b,0x14,0x0b,0x20,0x03,0x11,0x14,0x11,0xc4,0xb2,0x82, + 0xe0,0x16,0xce,0x14,0xc9,0x42,0x3a,0xdb,0xf6,0x40,0xf5,0x4a,0xd8,0x2f,0x15, + 0x3c,0x2f,0x20,0x41,0xa3,0x8a,0x51,0x88,0x42,0x44,0x71,0x34,0x28,0x74,0x46, + 0xae,0x41,0xe0,0x28,0x30,0xdb,0x66,0x2a,0xf5,0x6a,0x35,0xc2,0x8b,0x86,0xbf, + 0x6a,0x14,0xfb,0xf8,0xef,0xdb,0x3e,0xfd,0xf3,0xf1,0x99,0xe1,0x26,0x46,0x7c, + 0xdf,0x8d,0xba,0xfb,0xbe,0x00,0xf5,0x4a,0xe0,0xe8,0x41,0xc2,0xdc,0x21,0x81, + 0xb7,0xdd,0xdb,0xbb,0x6d,0xee,0x6e,0xb8,0xb9,0xe5,0x8b,0x16,0xed,0xfb,0x26, + 0x30,0x9e,0xf7,0xaa,0xf5,0x6a,0x95,0xdf,0x14,0x7d,0xfe,0x68,0x28,0xb3,0xbd, + 0x19,0x9f,0xed,0xfe,0x66,0xb2,0x9b,0x68,0x22,0x46,0xdc,0xf7,0x13,0xb5,0xba, + 0xb6,0x01,0xf5,0x4a,0x40,0x7c,0x42,0x24,0xbf,0x24,0x42,0xf7,0xfb,0x5d,0xdb, + 0x6d,0xce,0xee,0xb8,0xf1,0xe2,0x08,0x0f,0xcd,0xf3,0x46,0x30,0x0c,0xbb,0x53, + 0xf5,0xda,0x12,0x05,0x11,0xe1,0x82,0x62,0x11,0xb3,0xe5,0x19,0x9f,0xef,0xee, + 0x66,0xf2,0x75,0x68,0x5a,0xac,0xdc,0xf7,0x3e,0xba,0xce,0xb3,0x05,0xf5,0x4a, + 0x44,0x50,0x44,0x28,0x83,0x30,0x88,0xbf,0x7f,0xbf,0xf6,0xed,0xfc,0xdf,0xd0, + 0xe2,0xf2,0x38,0x79,0x7a,0xfe,0xbc,0x78,0xd3,0xe9,0x50,0xf5,0xda,0xff,0xff, + 0xff,0xff,0xff,0x3f,0x45,0x92,0x08,0x49,0x48,0x28,0x02,0x20,0x15,0x28,0x10, + 0x05,0x84,0x48,0x25,0x69,0x24,0x05,0xa2,0x04,0xf5,0x8a,0x80,0x04,0x10,0x02, + 0x81,0x8a,0x90,0x00,0x22,0x22,0x22,0x82,0xa8,0x8a,0x80,0x3a,0x45,0x50,0x21, + 0x12,0x40,0x12,0x41,0x50,0x08,0x51,0xf5,0x2a,0x2a,0x50,0x45,0x51,0x28,0x20, + 0x04,0xaa,0x88,0x08,0x09,0x29,0x02,0x20,0x54,0x58,0x90,0x04,0x94,0x40,0x15, + 0x48,0x14,0x05,0x22,0x04,0xf5,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xf5,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xf4,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0}; diff --git a/TCLSpecs/bitmaps/KFloot.xbm b/TCLSpecs/bitmaps/KFloot.xbm new file mode 100644 index 0000000..ae11487 --- /dev/null +++ b/TCLSpecs/bitmaps/KFloot.xbm @@ -0,0 +1,117 @@ +#define KFloot_width 220 +#define KFloot_height 61 +static char KFloot_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xfe,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0x02,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0xfa,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xf5,0x5a,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xf5,0xea,0xff,0xff,0xff,0xff,0xff,0x7f,0x55,0x55,0x55,0x55,0xbf,0xfd,0xff, + 0xfd,0xf7,0xff,0xff,0xf7,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xf5,0x4a, + 0xb5,0xaa,0xaa,0xaa,0xaa,0x2a,0x00,0x00,0x00,0x80,0xf7,0xb9,0xef,0xf1,0xc5, + 0xc7,0xaf,0xcf,0x03,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0xf5,0x6a,0x20,0x00, + 0x00,0x00,0x02,0xa0,0xaa,0xaa,0xaa,0xaa,0x81,0x3b,0x9f,0xe5,0x91,0x90,0x07, + 0xe6,0xa9,0xaa,0xaa,0x6a,0x55,0x55,0x55,0x55,0xf5,0x4a,0x15,0x55,0x55,0x55, + 0x55,0x35,0x00,0x00,0x00,0xc0,0xa9,0x49,0x8f,0xf1,0x45,0x85,0x57,0xc5,0x01, + 0x00,0x00,0x60,0x00,0x00,0x00,0x00,0xf5,0x6a,0x8c,0x01,0x00,0x80,0x06,0x60, + 0x29,0xa5,0x94,0xd2,0x03,0x1b,0x4f,0xe5,0x73,0xd0,0x87,0xd4,0x2b,0xa5,0x94, + 0xfa,0x52,0x4a,0x29,0x55,0xf5,0xca,0x8a,0x93,0x24,0xa9,0x22,0x29,0x42,0x08, + 0x21,0xc8,0xaf,0x80,0x2f,0xe2,0x19,0x85,0xd7,0xca,0xc1,0x0b,0x3c,0xf8,0x85, + 0x10,0x42,0x00,0xf5,0x5a,0x90,0x21,0x42,0x42,0x49,0x62,0x08,0x21,0x84,0xa2, + 0x1f,0x2a,0x8f,0xf0,0x5f,0xa0,0xe7,0xc0,0x73,0x46,0xe7,0x72,0x10,0x42,0x08, + 0x55,0xf5,0x4a,0x0a,0x8a,0x10,0xb0,0x04,0x28,0x42,0x08,0x21,0x88,0xff,0x40, + 0x2f,0xe4,0x1f,0x95,0xff,0xea,0x31,0x2d,0xd3,0x74,0x85,0x10,0x42,0x00,0xf5, + 0xda,0x20,0x20,0x4a,0xf5,0xa2,0x22,0x11,0x45,0x14,0x42,0xfe,0x14,0x8f,0xe2, + 0x7f,0xc0,0xf7,0xc0,0xbd,0x9c,0xcb,0x71,0x50,0x44,0x11,0xa9,0xf5,0x4a,0xd4, + 0x89,0x00,0x68,0x18,0xb0,0x48,0x20,0x81,0x10,0xf9,0x81,0x2f,0xe8,0x7d,0x92, + 0xc7,0xd5,0x39,0xde,0xc3,0x7b,0x05,0x12,0x48,0x02,0xf5,0xda,0x02,0x23,0x54, + 0x25,0x5d,0x65,0x04,0x15,0x54,0x4a,0xe4,0x2b,0x8f,0xe4,0xfb,0x88,0xaf,0xc0, + 0xbb,0x9c,0xeb,0x71,0x50,0x41,0x05,0x50,0xf5,0x4a,0x50,0x89,0x02,0x5c,0x38, + 0x20,0x51,0x40,0x01,0x60,0xd1,0x41,0x2f,0xe8,0xf1,0xc3,0x87,0xd4,0x39,0xbc, + 0xc3,0x75,0x05,0x14,0x50,0x05,0xf5,0x6a,0x0a,0x26,0x50,0x0f,0x7a,0x35,0x04, + 0x15,0xa8,0xca,0xc4,0x13,0x9f,0xe2,0xeb,0x93,0x57,0xc1,0xbd,0x9e,0xd7,0x71, + 0x50,0x41,0x05,0x50,0xf5,0xca,0x40,0x19,0x05,0x59,0x79,0x60,0x51,0x40,0x05, + 0xc0,0xd1,0x88,0x0f,0xe8,0xc1,0xa7,0x07,0xe8,0x31,0x4c,0xc3,0xfa,0x06,0x14, + 0x50,0x05,0xf5,0x5a,0x2a,0x54,0xa0,0x06,0xec,0x2a,0x04,0x12,0x50,0xd5,0x65, + 0x21,0xaf,0xe2,0xe9,0x8f,0xaf,0xc2,0xf5,0x96,0x76,0xf0,0x21,0x81,0x04,0x50, + 0xf5,0xca,0x00,0x31,0x4a,0x52,0x79,0x20,0xa1,0x88,0x04,0x40,0x7e,0xc8,0x3f, + 0xf8,0xe7,0xff,0x3f,0xe8,0xc3,0x07,0x7c,0xe5,0x8a,0x28,0x51,0x05,0xf5,0x4a, + 0x54,0x64,0xd1,0x06,0xe8,0xb4,0x08,0x22,0x91,0x2a,0x01,0x85,0x88,0x2a,0x12, + 0x90,0x80,0x92,0x24,0x50,0x05,0x20,0x20,0x02,0x04,0x50,0xf5,0x6a,0x01,0x1f, + 0xe4,0x91,0x2a,0x21,0xa4,0x08,0x24,0x40,0x54,0x20,0x22,0x80,0x44,0x05,0x2a, + 0x00,0x11,0x05,0x90,0x8a,0x8a,0x50,0x91,0x04,0xf5,0x4a,0xe8,0x21,0xd1,0x44, + 0x28,0xa8,0x02,0x42,0x81,0x14,0x01,0x95,0x08,0x25,0x10,0xa0,0x00,0x55,0x84, + 0xa0,0x22,0x20,0x20,0x0a,0x04,0x51,0xf5,0xda,0x42,0x08,0x4c,0x11,0xae,0x32, + 0x90,0x28,0x28,0x41,0x48,0x00,0xa2,0x10,0x45,0x15,0xaa,0x00,0x51,0x14,0x88, + 0x0a,0x89,0x20,0x51,0x04,0xf5,0x4a,0x30,0xa5,0x44,0x84,0x0f,0x60,0x25,0x82, + 0x02,0x12,0x25,0xaa,0x08,0x84,0x10,0x80,0x00,0x4a,0x04,0x81,0x22,0x40,0x22, + 0x44,0x04,0x51,0xf5,0x6a,0xa5,0x00,0x62,0xa1,0xaf,0x2a,0x40,0x24,0x50,0x44, + 0x80,0x00,0xa2,0x22,0x84,0x2a,0xaa,0x20,0x48,0x28,0x88,0x2a,0x08,0x11,0x51, + 0x04,0xf5,0x4a,0x30,0x54,0x1f,0xc8,0x1f,0x20,0x15,0x11,0x05,0x11,0x2a,0xaa, + 0x08,0x10,0x21,0x80,0x00,0x8a,0x22,0x82,0x22,0x80,0xa2,0x44,0x04,0xa1,0xf5, + 0x5a,0xc5,0x02,0x9d,0xd2,0x87,0x6a,0x40,0x40,0x53,0x84,0xe0,0x00,0x22,0xf5, + 0x95,0x2a,0x9e,0x20,0x18,0xd1,0x7f,0x2a,0xee,0xdd,0x48,0x14,0xf5,0x6a,0xd0, + 0xa9,0x58,0xc0,0x27,0x20,0x0a,0x15,0x07,0x50,0xda,0x92,0x48,0xb8,0x01,0x80, + 0x4d,0x88,0xba,0x48,0xa6,0x80,0xcc,0xdc,0x0a,0x41,0xf5,0x4a,0x05,0x42,0x04, + 0x55,0x88,0x6a,0x41,0xa0,0x57,0x05,0xcc,0x21,0x02,0x5a,0x55,0xe9,0x1c,0x22, + 0x04,0xc4,0x2e,0x24,0xde,0x87,0x2c,0x12,0xf5,0x5a,0x50,0xf7,0x48,0x00,0x61, + 0x20,0x28,0x8a,0xe6,0xf3,0xdf,0xcb,0xbf,0xb8,0xe6,0xe7,0x7d,0xbd,0xdf,0x27, + 0xa6,0xe7,0xcd,0xea,0x9e,0x40,0xf5,0xca,0xff,0xe4,0x22,0x4a,0xc4,0xb7,0x82, + 0xe0,0xce,0xf6,0xef,0xe6,0x6e,0xf2,0xae,0xcd,0x6d,0xee,0xdc,0x8d,0xc6,0xbe, + 0xdf,0xd3,0x2d,0x14,0xf5,0xea,0xff,0xd7,0x89,0x10,0xd1,0x2f,0x28,0x49,0xcd, + 0x36,0xcf,0xee,0x1f,0xc8,0xa7,0xdd,0xec,0xfe,0xdb,0x23,0xee,0x7e,0xcf,0xc6, + 0x8c,0x42,0xf5,0x4a,0x2e,0x8a,0x22,0x44,0xc4,0xad,0x02,0xe2,0xef,0xb7,0xdf, + 0x67,0x8c,0xaa,0xed,0xcf,0x6e,0xce,0x9f,0x8f,0xc6,0x3c,0xdf,0xdf,0x2e,0x10, + 0xf5,0xda,0xfc,0xcd,0x08,0x11,0x51,0x3c,0xa8,0x30,0xdc,0x76,0xcf,0xf6,0x4d, + 0x98,0x9d,0xed,0xec,0x4e,0x7f,0x26,0xd6,0x7d,0xcf,0xdc,0x1c,0x45,0xf5,0x4a, + 0xf1,0x52,0xa2,0x44,0x04,0xa7,0x02,0x74,0xff,0xee,0xf9,0xce,0x1f,0xfa,0xdd, + 0x9d,0xef,0xfc,0xff,0x83,0xcf,0xe7,0xff,0xfd,0x59,0x10,0xf5,0x5a,0x84,0x25, + 0x08,0x00,0x51,0x2b,0x90,0x42,0x08,0x95,0x24,0x49,0x50,0x21,0x28,0x49,0x12, + 0x25,0x44,0x2a,0x12,0x2a,0x21,0x24,0x05,0x45,0xf5,0xca,0x90,0xdf,0xa3,0x2a, + 0x84,0x61,0x25,0x10,0x42,0x00,0x08,0x20,0x0a,0x88,0x1e,0x20,0x44,0x00,0x91, + 0x80,0x80,0x40,0x88,0x40,0x50,0x10,0xf5,0x5a,0xa2,0x5e,0xff,0x81,0xd0,0x2f, + 0x80,0x8a,0x28,0xaa,0xa2,0x0a,0x41,0x25,0x86,0x0a,0x11,0x55,0x04,0x2a,0x54, + 0x14,0x22,0x14,0x05,0x45,0xf5,0x4a,0x64,0x3e,0xe2,0x55,0xc4,0xad,0x2a,0x40, + 0x02,0x01,0x08,0x40,0x14,0x80,0x52,0x40,0x44,0x00,0x91,0x80,0x02,0x41,0x89, + 0x42,0x50,0x20,0xf5,0x6a,0x31,0x24,0x0c,0x06,0x62,0x3c,0x80,0x2a,0xa8,0xa8, + 0xa2,0x2a,0x81,0x2a,0x04,0x2a,0x11,0x55,0x44,0x24,0x50,0x14,0x20,0x88,0x04, + 0x8a,0xf5,0x4a,0x1c,0x52,0x2e,0xa0,0x88,0xa6,0x2a,0x80,0x02,0x04,0x08,0x00, + 0x28,0x00,0x51,0x01,0x44,0x00,0x11,0x11,0x05,0x81,0x8a,0x22,0xa2,0x20,0xf5, + 0x6a,0x09,0xaa,0xf8,0x0a,0x22,0x2b,0x80,0x2f,0x50,0xa1,0x42,0x55,0x05,0x55, + 0x70,0x54,0xe1,0x4f,0x70,0x45,0xd0,0x29,0x60,0x1c,0x0f,0x0b,0xf5,0x4a,0x06, + 0xc3,0x0a,0xa1,0x88,0x63,0x25,0x0e,0x05,0x0a,0x10,0x00,0x50,0x80,0x6a,0x01, + 0xd4,0x1c,0xbd,0x11,0x8a,0x83,0xfa,0xf6,0xed,0x45,0xf5,0xda,0x82,0xa4,0x13, + 0x08,0xe2,0x28,0x88,0xa6,0xa0,0xa3,0x8a,0x54,0x05,0xea,0x60,0x28,0xc1,0x4d, + 0x8c,0x85,0xa0,0x29,0x60,0xb6,0xcd,0x21,0xf5,0x4a,0x42,0x00,0x4d,0xa2,0x48, + 0x22,0x21,0xf6,0xf5,0xdf,0xb7,0x6d,0xf8,0xe7,0xeb,0x33,0xd7,0x0c,0x2d,0xf0, + 0xbe,0x99,0x6a,0xbf,0x6d,0x14,0xf5,0xda,0x42,0x55,0x32,0x08,0x22,0xb1,0x08, + 0x6f,0x9b,0xb7,0x76,0xdb,0xfe,0xdd,0x60,0x73,0xc1,0x57,0x0c,0xdd,0xf7,0x2f, + 0x60,0xbc,0xff,0x81,0xf5,0x4a,0x7d,0x00,0xc4,0x92,0x88,0x28,0x44,0x66,0x7b, + 0x73,0x3e,0xdb,0xfc,0xcd,0x75,0x37,0xe9,0x04,0xad,0xb8,0xef,0x87,0xf4,0x32, + 0x6c,0x2b,0xf5,0x6a,0x05,0xaa,0x14,0x03,0x22,0xa4,0x22,0xee,0xfb,0xb7,0xb6, + 0xff,0x8d,0xdd,0x60,0x6b,0xc3,0x51,0x0c,0x9a,0xe7,0x1d,0x61,0x58,0xe7,0x03, + 0xf5,0xca,0xa1,0x00,0x40,0xac,0x08,0x31,0x90,0x66,0xcb,0x33,0x3e,0xdb,0xdc, + 0xcd,0xea,0xe3,0xd0,0x32,0x5d,0xb9,0xef,0x79,0x68,0x1e,0x6f,0x57,0xf5,0xda, + 0x0a,0x52,0x29,0x02,0x42,0xa4,0x0a,0x7f,0x7f,0x7e,0xed,0xdb,0xfb,0xbd,0xa1, + 0xe9,0xe5,0x71,0xf0,0xfa,0xfc,0xfb,0xf2,0xae,0xd1,0x01,0xf5,0xca,0xff,0xff, + 0xff,0xff,0xff,0x3f,0x40,0x91,0x52,0x49,0x50,0x24,0x10,0x05,0x2a,0x42,0x10, + 0x0a,0x25,0x40,0x25,0x48,0x24,0x81,0x84,0x54,0xf5,0xaa,0x20,0x01,0x00,0x51, + 0x24,0xa1,0x2a,0x24,0x04,0x02,0x05,0x01,0x45,0xa0,0x80,0x78,0x85,0x40,0x10, + 0x15,0x88,0x22,0x41,0x24,0x21,0x02,0xf5,0x0a,0x4a,0x54,0x55,0x04,0x11,0x08, + 0x00,0x81,0x90,0x50,0x90,0xa8,0x10,0x15,0x2a,0x72,0x50,0x14,0x85,0x40,0x22, + 0x50,0x14,0x11,0x88,0x50,0xf5,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xf5,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xf4,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0}; diff --git a/TCLSpecs/bitmaps/KHose.xbm b/TCLSpecs/bitmaps/KHose.xbm new file mode 100644 index 0000000..05de479 --- /dev/null +++ b/TCLSpecs/bitmaps/KHose.xbm @@ -0,0 +1,117 @@ +#define KHose_width 220 +#define KHose_height 61 +static char KHose_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xfe,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0x02,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0xfa,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xf5,0x5a,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xf5,0xea,0xff,0xff,0xff,0xff,0xff,0xbf,0xaa,0xaa,0xaa,0xea,0xb7,0xff,0xbf, + 0xff,0xfe,0xff,0xfb,0x5f,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xf5,0x4a, + 0xab,0xaa,0xaa,0xaa,0xaa,0x6a,0x00,0x00,0x00,0xf0,0x3e,0xf7,0x3d,0xbe,0xf8, + 0xf8,0xe2,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x6a,0x02,0x00, + 0x00,0x00,0x00,0x20,0x55,0x55,0x55,0x35,0x70,0xe7,0xb3,0x3c,0x12,0xf2,0xc8, + 0x53,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xf5,0xca,0x51,0x55,0x55,0x55, + 0x55,0x35,0x00,0x00,0x00,0x38,0x35,0xe9,0x31,0xbe,0x58,0xf8,0xc2,0x03,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x5a,0x18,0x00,0x00,0x00,0x00,0x60, + 0xa5,0x94,0x52,0x7a,0x60,0xe3,0xa9,0x7c,0x06,0xf2,0xe9,0x57,0x4a,0x29,0xa5, + 0x94,0x52,0x4a,0x29,0x55,0xf5,0x4a,0x38,0xa5,0x94,0x52,0x4a,0x29,0x08,0x21, + 0x04,0xf9,0x15,0xf0,0x45,0x3c,0x53,0xf1,0xc0,0x03,0x1e,0x72,0xc9,0xc3,0xb3, + 0x10,0x42,0x00,0xf5,0x6a,0x59,0x08,0x21,0x8c,0x10,0x22,0x21,0x84,0x50,0xf4, + 0x43,0xe5,0x11,0xfe,0x0b,0xf8,0xd5,0xab,0xb3,0x88,0x31,0xae,0x7f,0x42,0x08, + 0x55,0xf5,0xca,0x00,0x42,0x08,0x3d,0x84,0xb0,0x08,0x21,0x04,0xf1,0x1f,0xe8, + 0x85,0xfc,0xa3,0xf2,0xff,0x83,0x75,0xae,0x75,0x87,0xf7,0x10,0x42,0x00,0xf5, + 0x5a,0xa2,0x10,0xa2,0x64,0x21,0x24,0xa2,0x88,0x42,0xc8,0x9f,0xe2,0x51,0xfc, + 0x0f,0xf0,0xc0,0xd7,0xe1,0x1c,0x38,0xae,0x03,0x44,0x11,0xa9,0xf5,0x4a,0x0d, + 0x8a,0x08,0xc6,0x95,0xb2,0x08,0x24,0x10,0x22,0x3f,0xf0,0x05,0xbd,0x4f,0xf5, + 0xd4,0xc3,0xeb,0xfe,0xfa,0x8f,0xab,0x12,0x48,0x02,0xf5,0x6a,0xb4,0x40,0xa2, + 0x04,0x07,0x20,0xa2,0x82,0x4a,0x89,0x7c,0xe5,0xa3,0x7c,0x1f,0xf0,0xc2,0xeb, + 0xe1,0xf8,0x79,0xd2,0x03,0x40,0x05,0x50,0xf5,0x4a,0x11,0x2a,0x08,0x04,0xac, + 0xaa,0x08,0x28,0x00,0x2c,0x3a,0xe8,0x09,0xbd,0xbe,0xfa,0xe8,0xc3,0xf5,0xea, + 0x3f,0x84,0x57,0x15,0x50,0x05,0xf5,0x5a,0xe8,0x80,0xa2,0x06,0x30,0x20,0xa2, + 0x02,0x55,0x99,0x78,0xe2,0x21,0x3c,0x7c,0xf0,0xc2,0xd3,0xe1,0x82,0x7b,0xa1, + 0x03,0x40,0x05,0x50,0xf5,0x4a,0x85,0x2b,0x08,0x04,0x40,0xb5,0x08,0xa8,0x00, + 0x38,0x9a,0xe8,0x0b,0xbd,0xfa,0xf5,0xd0,0x8b,0x6b,0x57,0x73,0x8c,0x2b,0x15, + 0x50,0x05,0xf5,0xda,0x20,0x41,0xa2,0x06,0x80,0x21,0x42,0x02,0xaa,0xba,0x0c, + 0xe2,0xa1,0x3c,0xf8,0xf0,0xc5,0x43,0x73,0x0e,0xf9,0xa7,0x43,0x80,0x04,0x50, + 0xf5,0x4a,0x94,0x8a,0x08,0x02,0x00,0xb6,0x10,0x91,0x00,0xc8,0xaf,0xf8,0x0f, + 0xff,0xfe,0xff,0xf3,0x2f,0x1e,0xfa,0xc2,0xd3,0x0f,0x29,0x51,0x05,0xf5,0x6a, + 0x02,0x12,0x42,0x03,0x00,0x2c,0x4a,0x24,0x52,0x25,0x00,0x4a,0x20,0x49,0x91, + 0x24,0x54,0x8a,0xa2,0x42,0x51,0x84,0x54,0x04,0x04,0x50,0xf5,0xca,0xf8,0x85, + 0x10,0x02,0x00,0xac,0x00,0x81,0x04,0x10,0xa5,0x20,0x4a,0x04,0x04,0x08,0x81, + 0x20,0x08,0x10,0x08,0x20,0x00,0x51,0x91,0x04,0xf5,0x5a,0x4d,0x21,0x8a,0x02, + 0x00,0x36,0x54,0x28,0x50,0x85,0x08,0x0a,0x01,0x51,0xa1,0xa2,0x14,0x0a,0xa2, + 0x4a,0x45,0x15,0x55,0x04,0x04,0x51,0xf5,0x4a,0x24,0x88,0x20,0x03,0x00,0x61, + 0x01,0x05,0x05,0x20,0xa2,0x40,0x54,0x04,0x14,0x08,0x80,0xa0,0x08,0x00,0x20, + 0x80,0x00,0x21,0x51,0x04,0xf5,0x5a,0x0b,0x25,0x49,0x01,0xe0,0x2a,0x48,0x50, + 0x20,0x95,0x08,0x2a,0x01,0x51,0x81,0xa2,0x2a,0x0a,0xa2,0xaa,0x8a,0x2a,0x4a, + 0x48,0x04,0x51,0xf5,0x4a,0xa2,0x00,0x02,0x01,0x10,0x60,0x85,0x04,0x8a,0x00, + 0x82,0x00,0x28,0x04,0x28,0x08,0x80,0xa0,0x08,0x00,0x20,0x80,0x10,0x05,0x51, + 0x04,0xf5,0x6a,0x0b,0x54,0xa8,0x00,0xac,0x2a,0x20,0x51,0x21,0xaa,0x28,0xaa, + 0x82,0x48,0x85,0xa2,0x2a,0x09,0xa2,0x54,0x0a,0x29,0x42,0x50,0x04,0xa1,0xf5, + 0x4a,0xa4,0x02,0x82,0x00,0x02,0x20,0x15,0x04,0x8e,0x00,0xc2,0x01,0x28,0xe2, + 0x23,0x08,0x1c,0xa2,0x30,0x81,0x7f,0x82,0xdc,0xbb,0x49,0x14,0xf5,0xda,0x9e, + 0xa9,0xe8,0x00,0x55,0xb5,0x40,0xa1,0x26,0x52,0xb4,0xa9,0x82,0x38,0x4b,0x82, + 0x59,0x08,0x3a,0xa8,0xdc,0x28,0xba,0x9b,0x13,0x41,0xf5,0x4a,0x68,0x01,0x42, + 0x80,0x01,0x20,0x12,0x08,0x0f,0x04,0x99,0x03,0x28,0xb2,0x02,0xa8,0x1b,0x91, + 0x80,0x82,0x4d,0x82,0x98,0x4d,0x38,0x12,0xf5,0x5a,0x41,0xae,0x50,0x40,0x54, + 0xb5,0x08,0x45,0xed,0xd7,0xbf,0xd7,0xef,0x70,0xee,0xcf,0x7b,0x78,0x3f,0x5f, + 0x2c,0xdf,0xbb,0xd5,0xbd,0x40,0xf5,0x4a,0x68,0xf8,0x3f,0x20,0x01,0x20,0x42, + 0x90,0x9d,0x6d,0xdf,0xcd,0x5d,0xea,0xcd,0x9b,0xfb,0xde,0xfd,0x09,0x8d,0x7d, + 0x9f,0x8f,0x1b,0x14,0xf5,0xea,0x45,0x00,0x18,0xf0,0x55,0xaa,0x28,0xc5,0xda, + 0xed,0x9e,0xdd,0x3f,0xa0,0x5f,0xbb,0xd9,0xfc,0xb7,0x4f,0xdc,0xf9,0xde,0xcd, + 0xb9,0x42,0xf5,0xca,0x7f,0x00,0x06,0x0c,0x8f,0x20,0x02,0xd0,0x9f,0x6f,0xbe, + 0xcd,0x19,0x15,0x5b,0x9f,0xdd,0x4d,0x3f,0x1f,0x8d,0x7b,0x9e,0x9d,0x1b,0x10, + 0xf5,0x5a,0x5f,0x00,0x01,0x03,0x38,0xb4,0x50,0x45,0xb8,0xfd,0x9e,0xcf,0x9b, + 0xb0,0x7b,0xbb,0xf9,0x9c,0xfd,0x4c,0xac,0xfb,0xbf,0xbb,0x59,0x45,0xf5,0xca, + 0x50,0xf8,0xc0,0x3f,0xe0,0x22,0x0a,0xf0,0xfe,0xdd,0xf7,0xbd,0x3f,0xfa,0xb5, + 0x7b,0xdf,0xfd,0xff,0x07,0x1f,0xcf,0xff,0xf9,0x37,0x10,0xf5,0x5a,0x44,0x66, + 0x70,0xe0,0x41,0xb0,0xa0,0x84,0x48,0x22,0x21,0x01,0xa4,0x40,0x30,0x02,0x02, + 0x21,0x08,0x52,0xa4,0x24,0x00,0x4a,0x20,0x45,0xf5,0x4a,0x72,0x35,0x1c,0x15, + 0xc7,0x25,0x09,0x22,0x11,0x08,0x14,0x94,0x10,0x14,0x9e,0x90,0xa8,0x88,0xa2, + 0x08,0x01,0x88,0xaa,0x20,0x4a,0x10,0xf5,0xda,0xb4,0x11,0xa6,0x80,0x8c,0x31, + 0xa2,0x10,0x84,0x42,0x41,0x41,0x84,0x42,0x2d,0x24,0x02,0x22,0x08,0x42,0xa8, + 0x22,0x00,0x0a,0x01,0x45,0xf5,0x4a,0x9f,0x1c,0x0b,0x2a,0x0a,0xa7,0x08,0x44, + 0x51,0x28,0x10,0x14,0x51,0x10,0x84,0x82,0xa8,0x48,0xa2,0x10,0x05,0x88,0xaa, + 0x40,0x54,0x20,0xf5,0xea,0x10,0x88,0xa1,0x80,0x18,0x2a,0x42,0x11,0x04,0x02, + 0x45,0x41,0x04,0x8a,0x20,0x28,0x02,0x82,0x08,0x4a,0x50,0x22,0x00,0x2a,0x01, + 0x8a,0xf5,0xca,0x85,0x8e,0x0a,0x2a,0x14,0xa2,0x10,0x24,0xa1,0xa8,0x10,0x14, + 0xa1,0x20,0x8a,0x82,0x90,0x10,0xa2,0x00,0x85,0x88,0xaa,0x00,0xa4,0x20,0xf5, + 0xda,0x50,0xc4,0x90,0x00,0x11,0x32,0x8a,0x9e,0x08,0x02,0x44,0x41,0x08,0x8a, + 0xe0,0x24,0xca,0x8f,0xe0,0x56,0x90,0x23,0xc0,0xbc,0x1e,0x0e,0xf5,0x4a,0x04, + 0xc5,0x22,0xaa,0x14,0xa6,0x40,0x0c,0xa4,0x54,0x11,0x10,0xa5,0x20,0xd5,0x88, + 0xa0,0x3d,0x3a,0x03,0x44,0x8b,0xea,0x7d,0xdb,0x43,0xf5,0x6a,0x49,0x84,0x89, + 0x00,0x18,0x32,0x2a,0xae,0x02,0x06,0x44,0x45,0x00,0x8a,0xc1,0x21,0x8a,0x99, + 0x98,0x52,0x11,0x23,0xc0,0x6c,0x9b,0x2b,0xf5,0xca,0x10,0x05,0x03,0xa9,0x0e, + 0xa7,0x80,0xec,0xf3,0xff,0x6f,0xdb,0xfa,0xef,0xd7,0x67,0xa6,0x3b,0x5a,0xe4, + 0x7b,0xb7,0xd4,0xec,0xdb,0x00,0xf5,0x5a,0x42,0x04,0xfc,0xff,0x03,0x31,0x2a, + 0xdd,0xb6,0x6f,0x6d,0xb6,0xb9,0x9b,0xc1,0xee,0x8a,0x8f,0x18,0xb2,0xef,0x1b, + 0xc2,0x7a,0xfe,0xab,0xf5,0x4a,0x10,0x0a,0x00,0x00,0xc0,0xa3,0x00,0xcc,0xf6, + 0x66,0x7d,0xbf,0xfb,0xdb,0xd5,0x66,0xc2,0x21,0xbc,0x38,0xef,0xaf,0xe8,0x68, + 0xda,0x06,0xf5,0xda,0x8a,0x18,0x00,0x00,0x70,0x28,0x52,0xdd,0xef,0x6f,0x6c, + 0xf6,0x59,0x9f,0xc1,0xd6,0x96,0x0b,0x19,0x72,0xcf,0x1b,0xc2,0xb2,0xcc,0x57, + 0xf5,0x4a,0x40,0xf4,0xff,0xff,0x0f,0xa2,0x04,0xcc,0x96,0x67,0xfd,0xb6,0x3d, + 0xbb,0xeb,0xc6,0x81,0xe1,0xb4,0x72,0xdf,0xf7,0xd0,0x79,0xde,0x06,0xf5,0x6a, + 0x15,0x11,0x12,0x00,0x50,0x31,0x50,0xff,0xfe,0xfc,0xda,0xb7,0xf3,0x3b,0xc3, + 0xd3,0xeb,0x77,0xe0,0xe9,0xfb,0xf3,0xe5,0x0d,0xa3,0x53,0xf5,0xca,0xff,0xff, + 0xff,0xff,0xff,0x7f,0x05,0x90,0xa4,0x4a,0x20,0x92,0x48,0x44,0x11,0x8a,0x00, + 0x80,0x2a,0x04,0x90,0xa8,0x20,0xa8,0x0a,0x0a,0xf5,0x2a,0x80,0x20,0x41,0x55, + 0x05,0x04,0x20,0x05,0x08,0x20,0x8a,0x08,0x04,0x11,0x88,0xe0,0xaa,0x2a,0x40, + 0x51,0x25,0x42,0x15,0x05,0xa0,0x40,0xf5,0x8a,0x2a,0x4a,0x14,0x00,0x50,0x91, + 0x8a,0xa0,0x42,0x09,0x21,0x42,0x51,0x84,0x22,0xea,0x00,0x00,0x15,0x04,0x80, + 0x24,0x80,0xa0,0x0a,0x2a,0xf5,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xf5,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xf4,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0}; diff --git a/TCLSpecs/bitmaps/KModal.xbm b/TCLSpecs/bitmaps/KModal.xbm new file mode 100644 index 0000000..5c8a62b --- /dev/null +++ b/TCLSpecs/bitmaps/KModal.xbm @@ -0,0 +1,117 @@ +#define KModal_width 220 +#define KModal_height 61 +static char KModal_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xfe,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0x02,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0xfa,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xf5,0x5a,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xf5,0xea,0xff,0xff,0xff,0xff,0xff,0x7f,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xf5,0x4a, + 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0xf0,0xc9,0xff,0xcf,0x3f,0x7f, + 0x7e,0x00,0x3f,0x00,0x00,0x3e,0x00,0xe0,0x01,0x00,0x00,0xf5,0x6a,0x00,0x00, + 0x00,0xfc,0x1f,0xa0,0xaa,0xaa,0xaa,0x1e,0xcf,0x79,0x1e,0x4f,0x9c,0x78,0xaa, + 0x8f,0xaa,0xaa,0xb8,0xaa,0xca,0x55,0x55,0x55,0xf5,0x4a,0x00,0x00,0x00,0x04, + 0x10,0x20,0x00,0x00,0x00,0x4c,0xdd,0xfa,0x4c,0x1f,0x25,0xfa,0x81,0x2f,0x00, + 0x00,0x3a,0x00,0xd0,0x01,0x00,0x00,0xf5,0x5a,0x00,0x00,0x00,0x24,0x10,0xa0, + 0x4a,0x29,0xa5,0x1e,0x4c,0x78,0x0a,0x4f,0x8a,0xf8,0x68,0x1f,0x29,0xa5,0x78, + 0xa5,0xc4,0x4b,0x29,0x55,0xf5,0x4a,0x00,0x00,0x00,0x24,0x10,0x20,0x10,0x42, + 0x08,0x8e,0xda,0x7a,0x58,0x8f,0x21,0xec,0x43,0x4f,0x42,0x08,0x3a,0x08,0xd1, + 0x11,0x42,0x00,0xf5,0x6a,0x00,0x00,0x00,0x64,0x10,0xa0,0x84,0x10,0x42,0x3f, + 0x00,0x78,0x05,0xef,0x0a,0xe9,0x69,0x0f,0x78,0xe1,0x3b,0xf9,0xc4,0x43,0x08, + 0x55,0xf5,0x4a,0x00,0x00,0x80,0xf7,0xf0,0x21,0x21,0x84,0x10,0xfc,0xaa,0x7a, + 0x50,0xef,0xa0,0xd8,0xa1,0xaf,0xce,0xe4,0xbd,0xa4,0xd1,0x11,0x42,0x00,0xf5, + 0x5a,0x00,0x00,0x80,0x94,0x11,0x61,0x94,0x52,0x4a,0xfe,0x03,0x78,0x05,0xff, + 0x0a,0xcc,0x2b,0x1f,0xae,0x69,0x3a,0x8e,0xc7,0x45,0x11,0xa9,0xf5,0x4a,0x00, + 0x00,0x80,0x14,0x13,0x21,0x01,0x00,0x80,0xf8,0x57,0x7d,0xa0,0xff,0x41,0xa9, + 0x53,0x4f,0x87,0x73,0x78,0xaf,0xe3,0x11,0x48,0x02,0xf5,0x6a,0x00,0x00,0x80, + 0x1c,0x16,0x21,0xa8,0xaa,0x2a,0xe2,0x0f,0x78,0x15,0xef,0x17,0x8a,0x1f,0x0f, + 0xd7,0x77,0x3d,0xc8,0xcb,0x45,0x05,0x50,0xf5,0x4a,0x00,0x00,0x80,0x04,0x10, + 0xa1,0x02,0x00,0x00,0x0a,0xaf,0x7a,0x40,0xdf,0x87,0xd8,0x57,0x5f,0x87,0x73, + 0x38,0xb5,0xd3,0x11,0x50,0x05,0xf5,0x5a,0x00,0x00,0x80,0xfc,0x1f,0x61,0xa8, + 0xaa,0xaa,0xa2,0x0e,0xf8,0x12,0x8f,0x2f,0x0a,0x1f,0x0f,0xa7,0xfb,0x7a,0xdc, + 0xc7,0x45,0x05,0x50,0xf5,0x4a,0x00,0x00,0x80,0x00,0x00,0x21,0x02,0x00,0x00, + 0x0e,0x5e,0x7d,0x44,0x5f,0x9f,0x48,0x4f,0xaf,0x97,0x73,0xb8,0x8e,0xe3,0x11, + 0x50,0x05,0xf5,0x6a,0x00,0xfe,0x81,0xfc,0x1f,0x21,0x91,0x52,0xaa,0x46,0x07, + 0xf8,0x10,0x0f,0x3e,0x2c,0x16,0x0f,0xc6,0x65,0x3a,0xae,0xcb,0x85,0x04,0x50, + 0xf5,0x4a,0x00,0x02,0x86,0x04,0x10,0x61,0x24,0x84,0x00,0x1e,0x4b,0x7a,0x84, + 0x4f,0x7f,0x19,0x87,0xaf,0xce,0xf1,0xbc,0xfe,0xd7,0x23,0x51,0x05,0xf5,0x5a, + 0x00,0x12,0x88,0x24,0x10,0x21,0x01,0x21,0x54,0xf3,0x21,0xfe,0xd1,0x3f,0xff, + 0xbe,0xd4,0x3f,0x78,0xc4,0x7b,0x1c,0xe3,0x13,0x04,0x50,0xf5,0x4a,0x00,0x32, + 0x90,0x24,0x10,0x61,0x54,0x08,0x01,0x48,0x0a,0x01,0x45,0x90,0x08,0x02,0x24, + 0x22,0x95,0x50,0x95,0xa2,0x24,0x44,0x91,0x04,0xf5,0x5a,0x00,0x32,0x90,0x64, + 0x10,0x21,0x01,0xa5,0x54,0x05,0x41,0xaa,0x10,0x25,0xa2,0x50,0x81,0x88,0x00, + 0x04,0x20,0x08,0x11,0x11,0x04,0x51,0xf5,0x4a,0x00,0x32,0xf0,0xf7,0xf0,0x2f, + 0x54,0x00,0x00,0x50,0x28,0x00,0x44,0x80,0x08,0x0a,0x28,0x22,0xaa,0xa2,0x84, + 0x42,0x44,0x24,0x51,0x04,0xf5,0x5a,0x00,0xda,0x97,0x94,0x11,0x61,0x01,0x55, + 0xa5,0x04,0x05,0x55,0x11,0x2a,0xa2,0xa0,0x82,0x88,0x00,0x08,0x22,0x10,0x11, + 0x41,0x04,0x51,0xf5,0x4a,0x00,0x02,0x90,0x14,0x13,0x21,0x54,0x00,0x08,0x51, + 0xa0,0x00,0x44,0x81,0x08,0x0a,0x28,0x22,0xa8,0xa2,0x88,0x4a,0x44,0x08,0x51, + 0x04,0xf5,0x5a,0x00,0x02,0x88,0x1c,0x16,0x21,0x01,0xaa,0x22,0x04,0x15,0x54, + 0x11,0x24,0xa2,0xa0,0x02,0x88,0x02,0x08,0x22,0x00,0x11,0x22,0x04,0xa1,0xf5, + 0x4a,0x00,0x02,0x86,0x04,0x10,0x61,0xa4,0x00,0x0b,0x41,0xe0,0x01,0x44,0xf1, + 0x09,0x0a,0x5e,0x21,0x38,0xd1,0xbf,0x2a,0xee,0xdd,0x48,0x14,0xf5,0x5a,0x00, + 0xfe,0x81,0xfc,0x1f,0x21,0x09,0x4a,0x43,0x14,0xda,0x28,0x11,0x9c,0x91,0xc0, + 0x0c,0x08,0x5d,0x44,0x26,0x00,0xed,0xee,0x0a,0x41,0xf5,0x4a,0x00,0x00,0x80, + 0x00,0x00,0x21,0xa0,0x90,0x2f,0x81,0xcc,0x42,0x04,0x59,0x45,0xd4,0xad,0xa2, + 0x00,0xd1,0x6e,0xaa,0xcc,0x8e,0x2c,0x12,0xf5,0x5a,0x00,0x00,0x80,0xfc,0x1f, + 0xa1,0x0a,0x84,0xe6,0xf7,0xff,0xcb,0xb7,0xb8,0xe6,0xe7,0x3d,0xbc,0xbf,0x27, + 0x86,0xe7,0xdd,0xe2,0x9e,0x40,0xf5,0x4a,0x00,0x00,0x80,0x04,0x10,0x21,0x40, + 0xe1,0xce,0xb6,0xcf,0xe6,0x6e,0xf4,0xb6,0xcd,0x6d,0xef,0xdd,0x8c,0xee,0xbe, + 0xcf,0xd3,0x2d,0x14,0xf5,0x5a,0x00,0x00,0x80,0x24,0x10,0x61,0x15,0x54,0xdd, + 0x76,0xdf,0xf6,0x1f,0xc9,0xa7,0xdd,0x7c,0xfe,0xdb,0x23,0xc6,0x7d,0xef,0xc7, + 0x8c,0x42,0xf5,0x4a,0x00,0x00,0x80,0x24,0x10,0x21,0x40,0xe1,0xcf,0x36,0xcf, + 0x67,0x4d,0xa8,0xef,0xcf,0xed,0x8e,0xbf,0x0f,0xd7,0x3c,0xcf,0xde,0x2e,0x10, + 0xf5,0x5a,0x00,0x00,0x80,0x64,0x10,0x21,0x15,0x28,0xfc,0x7f,0xdf,0xee,0x1c, + 0x9a,0x9d,0xdd,0x6c,0x6e,0xde,0x46,0xc6,0xfd,0xdf,0xdc,0x1c,0x45,0xf5,0x4a, + 0x00,0x00,0x80,0xf7,0xf0,0x61,0x80,0xf2,0xfe,0xee,0xf9,0xce,0x5f,0xf9,0xd8, + 0x9d,0xef,0xfd,0xff,0x2b,0xaf,0xe7,0xff,0xfe,0x59,0x10,0xf5,0x5a,0x00,0x00, + 0x00,0x94,0x11,0x20,0x55,0x10,0x02,0x90,0x04,0x51,0x02,0x24,0x2d,0xa2,0x24, + 0x80,0x04,0x02,0x49,0x12,0x80,0x48,0x05,0x45,0xf5,0x4a,0x00,0x00,0x00,0x14, + 0x13,0x60,0x00,0x8a,0x50,0x05,0x51,0x04,0x50,0x41,0x8e,0x08,0x88,0x2a,0xa2, + 0x50,0x82,0x88,0x2a,0x02,0x50,0x10,0xf5,0x5a,0x00,0x00,0x00,0x1c,0x16,0x20, + 0x55,0x41,0x04,0x50,0x04,0xa1,0x0a,0x94,0x26,0xa2,0x22,0x80,0x10,0x04,0x28, + 0x42,0x80,0x50,0x05,0x45,0xf5,0x4a,0x00,0x00,0x00,0x04,0x10,0x20,0x00,0x28, + 0x52,0x05,0x51,0x14,0x40,0x01,0x92,0x08,0x88,0x2a,0x8a,0xa2,0x82,0x28,0x2a, + 0x0a,0x50,0x20,0xf5,0x5a,0x00,0x00,0x00,0xfc,0x1f,0xa0,0x94,0x02,0x01,0x50, + 0x04,0x41,0x15,0xa8,0x08,0xa2,0x22,0x80,0x40,0x10,0x10,0x02,0x81,0xa0,0x04, + 0x8a,0xf5,0x4a,0x1c,0x0e,0xe0,0x00,0x00,0x20,0x41,0x50,0xa8,0x04,0x51,0x14, + 0x80,0x02,0xa2,0x08,0x08,0x25,0x2a,0x8a,0x8a,0x50,0x14,0x09,0xa2,0x20,0xf5, + 0x5a,0x18,0x07,0xc0,0x80,0x01,0x60,0x14,0x0f,0x02,0x48,0x04,0x41,0x55,0x90, + 0x70,0x42,0xe2,0x8f,0xf0,0x21,0xe0,0x05,0x61,0x5c,0x0f,0x0b,0xf5,0x4a,0x18, + 0x07,0x60,0x80,0x01,0x20,0x41,0x57,0x51,0x03,0x41,0x10,0x00,0x8a,0x6a,0x90, + 0xd0,0x2c,0x9a,0x09,0x89,0x51,0x78,0xb7,0xed,0x45,0xf5,0x5a,0x9c,0xe2,0x78, + 0xd6,0x00,0x20,0x12,0x06,0x04,0x57,0x14,0x85,0x54,0xe1,0xe0,0x0a,0xca,0x8c, + 0x2c,0x45,0xa2,0x05,0x62,0xb6,0xcd,0x21,0xf5,0x4a,0x54,0xb3,0x6d,0xdb,0x00, + 0xa0,0x88,0xfe,0xf3,0xdf,0xb7,0x7d,0xf9,0xef,0xeb,0x71,0xe3,0x2d,0x0c,0xf1, + 0xbc,0x59,0xe9,0xfe,0x6d,0x14,0xf5,0x5a,0x74,0x9b,0xa7,0x59,0x00,0x20,0x42, + 0x66,0xbb,0xb3,0x76,0xdb,0xdc,0xcd,0x60,0x37,0xc9,0x87,0x5e,0xdc,0xf7,0x1f, + 0x64,0x3c,0xff,0x81,0xf5,0x4a,0xb6,0x99,0xb7,0x6d,0x00,0xa0,0x10,0x77,0x7b, + 0x37,0x37,0xdb,0xfd,0xdd,0x6a,0x73,0xc3,0x28,0x0c,0xb9,0xef,0x87,0xf0,0x32, + 0x6d,0x2b,0xf5,0x5a,0xb6,0xd9,0xb6,0x6d,0x01,0x20,0x4a,0xe6,0xf7,0x73,0x76, + 0xdf,0x8c,0xcd,0x60,0x6b,0xe9,0x02,0x4d,0x98,0xe7,0x2d,0x62,0x58,0xe6,0x03, + 0xf5,0x4a,0x97,0x73,0x6c,0xdb,0x00,0xa0,0x00,0x6e,0xcb,0x3b,0x3f,0xdb,0xde, + 0xed,0xf5,0xe3,0xc2,0x78,0x9a,0xfd,0xff,0xfb,0x68,0x1e,0x6f,0x57,0xf5,0x5a, + 0x00,0x00,0x00,0x00,0x00,0x20,0xaa,0x7f,0x7f,0x7e,0xec,0xfb,0xf9,0x9f,0xa1, + 0xd5,0xe8,0x33,0xf8,0xf0,0xfc,0x79,0xf2,0xd6,0xd1,0x01,0xf5,0xca,0xff,0xff, + 0xff,0xff,0xff,0xbf,0x00,0x00,0x51,0x21,0x95,0x04,0x12,0x40,0x24,0x40,0x42, + 0x88,0x22,0x0a,0x02,0xc8,0x90,0x02,0x85,0x54,0xf5,0x4a,0x00,0x00,0x00,0x00, + 0x00,0x22,0x54,0x55,0x04,0x44,0x20,0xa2,0x44,0x15,0x89,0xfa,0x28,0x22,0x08, + 0xa1,0xa8,0x22,0x04,0x50,0x20,0x02,0xf5,0x2a,0xaa,0xaa,0xaa,0xaa,0xaa,0x10, + 0x01,0x00,0x51,0x11,0x85,0x10,0x10,0x40,0x20,0x30,0x82,0x48,0xa2,0x08,0x02, + 0x90,0xa2,0x0a,0x8a,0x50,0xf5,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xf5,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xf4,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0}; diff --git a/TCLSpecs/bitmaps/KPluk.xbm b/TCLSpecs/bitmaps/KPluk.xbm new file mode 100644 index 0000000..62b2528 --- /dev/null +++ b/TCLSpecs/bitmaps/KPluk.xbm @@ -0,0 +1,117 @@ +#define KPluk_width 220 +#define KPluk_height 61 +static char KPluk_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xfe,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0x02,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0xfa,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xf5,0x5a,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xf5,0xea,0xff,0xff,0xff,0xff,0xff,0xbf,0xaa,0xaa,0xaa,0xfa,0xed,0xff,0xef, + 0xbf,0xff,0xfe,0xbf,0xbe,0xaa,0xea,0x57,0x55,0x55,0x55,0x55,0x55,0xf5,0x4a, + 0x53,0xbd,0xaa,0xaa,0xaa,0x6a,0x00,0x00,0x00,0xbc,0xcf,0x7d,0x8f,0x2f,0x3e, + 0xf8,0x7a,0x78,0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0xf5,0x6a,0x02,0x66, + 0x00,0x00,0x00,0x20,0x55,0x55,0x55,0x0d,0xdc,0xf9,0x2c,0x8f,0x84,0xf2,0x71, + 0x3d,0x55,0xd5,0x53,0x55,0x55,0x55,0x55,0x55,0xf5,0xca,0x81,0x44,0x55,0x55, + 0x55,0x35,0x00,0x00,0x00,0x4e,0x4d,0x7a,0x8c,0x2f,0x16,0xf4,0xf8,0x38,0x00, + 0x80,0x07,0x00,0x00,0x00,0x00,0x00,0xf5,0x5a,0x40,0x69,0x00,0x00,0x00,0x60, + 0x29,0xa5,0x94,0x1e,0xd8,0x78,0x2a,0x9f,0x81,0xf0,0xf2,0xba,0x4a,0xa9,0xa3, + 0x94,0x52,0x4a,0x29,0x55,0xf5,0x4a,0xc0,0x42,0x95,0x52,0x4a,0x29,0x42,0x08, + 0x41,0x7e,0x05,0x7c,0x11,0xcf,0x2a,0xfa,0xf4,0x38,0xcf,0x83,0xf7,0x21,0x84, + 0x10,0x42,0x00,0xf5,0x6a,0x40,0x10,0x20,0x84,0x10,0x62,0x08,0x21,0x14,0xfd, + 0x50,0x79,0x84,0xff,0x80,0xf0,0x71,0x7d,0xae,0xab,0x63,0x85,0x10,0x42,0x08, + 0x55,0xf5,0xca,0x80,0x8a,0x84,0x10,0x42,0x28,0x42,0x08,0x41,0xfc,0x07,0x7a, + 0x21,0xff,0x2a,0xf4,0x7a,0xb8,0x8e,0x83,0x37,0x20,0x84,0x10,0x42,0x00,0xf5, + 0x5a,0x01,0x20,0x22,0x84,0x10,0xa2,0x28,0xa2,0x10,0xf2,0xa7,0x78,0x14,0xff, + 0x01,0xf1,0x1f,0x3a,0xde,0xab,0x53,0x15,0x51,0x44,0x11,0xa9,0xf5,0x4a,0x5a, + 0x8a,0x10,0x51,0x44,0x31,0x02,0x09,0x84,0xc8,0x0f,0x7c,0x41,0xef,0xab,0xf4, + 0xa0,0xb8,0x8e,0x87,0x1b,0x80,0x04,0x12,0x48,0x02,0xf5,0x6a,0x95,0x20,0x8a, + 0x04,0x12,0xa4,0xa8,0xa0,0x52,0x22,0x5f,0x79,0x24,0xdf,0x07,0xf0,0x0a,0x3a, + 0xae,0xd3,0x3f,0x55,0x50,0x41,0x05,0x50,0xf5,0x4a,0x14,0x8a,0x40,0x50,0x41, + 0x31,0x02,0x0a,0x00,0x8b,0x0e,0x7a,0x41,0xcf,0xaf,0xfa,0x20,0x79,0x8f,0x83, + 0x7b,0x00,0x05,0x14,0x50,0x05,0xf5,0x5a,0xf1,0x20,0x14,0x05,0x14,0xa4,0xa8, + 0x40,0x55,0x26,0x9e,0xf8,0x14,0x0f,0x1f,0xf0,0x4a,0x3c,0xae,0xab,0xfb,0x55, + 0x50,0x41,0x05,0x50,0xf5,0x4a,0x84,0x09,0x41,0x20,0x21,0x31,0x02,0x2a,0x00, + 0x8e,0x46,0x7c,0x40,0xaf,0x7e,0xf5,0x01,0xb9,0x9e,0x83,0xe3,0x00,0x05,0x14, + 0x50,0x05,0xf5,0x6a,0x41,0xa3,0x14,0x4a,0x44,0xa4,0x90,0x80,0xaa,0x2e,0x0b, + 0x79,0x15,0x0f,0x3e,0xf0,0x54,0x38,0xfc,0xd7,0xf7,0x49,0x20,0x81,0x04,0x50, + 0xf5,0x4a,0x14,0x0a,0x40,0x81,0x1c,0x31,0x44,0x24,0x00,0xf2,0x43,0xfe,0xc1, + 0xbf,0xff,0xfe,0x03,0x7e,0x9d,0xc7,0xf7,0x23,0x8a,0x28,0x51,0x05,0xf5,0x6a, + 0x81,0x42,0x15,0x28,0x7c,0xa0,0x12,0x89,0x54,0x09,0x28,0x22,0xaa,0x52,0x88, + 0x10,0xa8,0x48,0xa2,0x20,0x80,0x8a,0x20,0x02,0x04,0x50,0xf5,0xca,0xf8,0x2b, + 0x40,0x05,0xdd,0x35,0x40,0x20,0x01,0xa2,0x82,0x88,0x00,0x04,0x42,0x84,0x02, + 0x22,0x08,0x8a,0x2a,0x20,0x8a,0x50,0x91,0x04,0xf5,0x5a,0x2e,0x80,0x12,0xe0, + 0xb7,0x61,0x15,0x0a,0xa4,0x08,0x28,0x22,0xaa,0x50,0x11,0x51,0xa8,0x88,0xa2, + 0x20,0x80,0x8a,0x20,0x0a,0x04,0x51,0xf5,0x4a,0x84,0x52,0x44,0xca,0x57,0x2b, + 0x40,0x41,0x09,0x42,0x82,0x88,0x00,0x04,0x48,0x04,0x02,0x20,0x08,0x8a,0x2a, + 0x20,0x8a,0x20,0x51,0x04,0xf5,0x6a,0x2b,0xa4,0x93,0xa0,0x6b,0xa3,0x12,0x14, + 0x90,0x28,0x21,0x22,0x52,0x51,0x05,0xa2,0x48,0x85,0xa2,0x20,0x00,0x89,0x20, + 0x44,0x04,0x51,0xf5,0x4a,0x01,0x31,0x1c,0x8a,0xa6,0x37,0x20,0x81,0x22,0x02, + 0x88,0x88,0x04,0x04,0xa0,0x10,0x22,0x20,0x08,0x0a,0x55,0x22,0x08,0x11,0x51, + 0x04,0xf5,0x6a,0x55,0x1c,0xf0,0xa0,0xeb,0xa3,0x8a,0x28,0x88,0x50,0x25,0x22, + 0x50,0x51,0x15,0x8a,0x08,0x15,0x91,0xa0,0x00,0x88,0xa2,0x44,0x04,0xa1,0xf5, + 0xca,0x81,0x0c,0x00,0xcf,0xbd,0x29,0x20,0x84,0x03,0x0a,0x70,0x08,0x05,0xf8, + 0x80,0x20,0xa7,0x80,0x4c,0xe4,0x5f,0x21,0xf7,0x6e,0x48,0x14,0xf5,0x5a,0x25, + 0xc2,0x1f,0xf8,0xb3,0xa4,0x0a,0xd1,0xa9,0x40,0xed,0x42,0x90,0xce,0x2a,0xca, + 0x0e,0x2a,0x0e,0x29,0x37,0x88,0x6e,0x6e,0x05,0x41,0xf5,0x4a,0x8f,0x61,0xe8, + 0x70,0x32,0x31,0x40,0xc4,0x03,0x14,0x66,0x10,0x45,0xac,0x80,0x60,0x96,0x80, + 0x50,0x60,0x93,0x22,0xe6,0x43,0x2e,0x12,0xf5,0xda,0x9e,0x90,0x92,0xef,0x64, + 0xa4,0x2a,0x51,0xfb,0xf1,0xef,0xeb,0x1b,0x9d,0xfb,0xfb,0x5e,0xde,0xcf,0x17, + 0xcb,0xf3,0x66,0x79,0x8f,0x40,0xf5,0x4a,0x48,0x28,0x3f,0xbe,0x39,0x31,0x00, + 0x64,0xe3,0xdf,0x6f,0x73,0x57,0x78,0xd3,0xe6,0x36,0x7f,0x6e,0x82,0x63,0xdf, + 0xef,0xe3,0x26,0x14,0xf5,0x5a,0x3d,0xce,0xf0,0x3f,0x08,0xa4,0x52,0x61,0x77, + 0xbb,0x67,0xf7,0x17,0xea,0xf7,0x6e,0xb6,0xff,0xfd,0x29,0xf7,0xbe,0x67,0x6b, + 0x8e,0x42,0xf5,0xca,0x1f,0x63,0xd5,0x3f,0x5e,0x31,0x04,0xf8,0x67,0x9b,0x77, + 0x73,0x8e,0xc4,0xd6,0x67,0x37,0xe3,0xcf,0x03,0x63,0x9e,0x77,0xe7,0x26,0x10, + 0xf5,0xea,0x88,0x59,0xe0,0xfe,0x07,0x60,0xa1,0x12,0x6e,0xfb,0xe7,0xf3,0x46, + 0xee,0xce,0x76,0x7e,0xaf,0xbf,0xab,0xeb,0xff,0xe7,0x6e,0x0e,0x45,0xf5,0xca, + 0x6b,0x0a,0x9a,0xdf,0xa4,0x2a,0x14,0xb8,0xff,0xf7,0x7d,0xef,0x2f,0x7c,0xfd, + 0xce,0x77,0xfe,0xff,0x85,0xc7,0xf3,0x7f,0xfe,0x4d,0x10,0xf5,0xda,0xbe,0xa8, + 0x68,0x43,0x11,0x20,0x81,0x4a,0x14,0x0a,0x12,0x00,0x88,0x12,0x04,0x22,0x01, + 0x01,0x00,0x41,0x28,0x08,0x12,0x12,0x20,0x45,0xf5,0x4a,0x3d,0xce,0xb7,0x17, + 0x84,0x6a,0x28,0x10,0x41,0x20,0x88,0xaa,0x22,0x80,0xaf,0x48,0x54,0x54,0x55, + 0x28,0x02,0xa5,0xa0,0x88,0x0a,0x10,0xf5,0x4a,0xf4,0x77,0x5b,0x23,0x21,0x20, + 0x02,0x45,0x14,0x89,0x42,0x00,0x08,0x55,0x03,0x02,0x01,0x01,0x00,0x85,0xa8, + 0x00,0x0a,0x42,0x40,0x45,0xf5,0xda,0x9e,0x20,0xbe,0x86,0x88,0x6a,0x51,0x10, + 0x41,0x22,0x28,0xaa,0xa2,0x00,0xa9,0x50,0x54,0x54,0x55,0x20,0x02,0xaa,0xa0, + 0x28,0x2a,0x20,0xf5,0x4a,0x2e,0xfe,0x5c,0x2e,0x24,0x20,0x08,0x42,0x14,0x48, + 0x82,0x00,0x08,0x2a,0x02,0x0a,0x01,0x01,0x00,0x8a,0xa8,0x00,0x0a,0x02,0x81, + 0x8a,0xf5,0x6a,0x87,0xfe,0x71,0x85,0x02,0xb5,0xa2,0x08,0x81,0x02,0x24,0x4a, + 0x91,0x80,0xa8,0x40,0x54,0xa8,0xaa,0x20,0x02,0xaa,0xa0,0x50,0x28,0x20,0xf5, + 0x4a,0x11,0x7f,0x41,0x26,0x50,0x20,0x88,0x47,0x54,0x50,0x89,0x10,0x22,0x2a, + 0x38,0x14,0xf1,0x03,0xb8,0x8a,0xf0,0x00,0x34,0x8e,0x83,0x0b,0xf5,0xea,0xc9, + 0xff,0xc1,0x8e,0x0a,0xaa,0x42,0x17,0x01,0x0b,0x20,0x42,0x88,0xc0,0x72,0x41, + 0x64,0x4f,0xcd,0x20,0xc4,0x4a,0xb9,0xdf,0xf7,0x40,0xf5,0xca,0x85,0xff,0x40, + 0x25,0xa0,0x30,0x10,0x43,0xa8,0x41,0x89,0x10,0x02,0x69,0x34,0x14,0x68,0x16, + 0xa6,0x89,0xe2,0x10,0x34,0xfb,0x66,0x2a,0xf5,0x5a,0xd0,0xbf,0x80,0x86,0x0a, + 0xa2,0x4a,0xfb,0xfa,0xef,0xdb,0xb7,0xfc,0xf3,0xf1,0xd9,0xe3,0x86,0x16,0x78, + 0xde,0x4d,0x71,0xdb,0xbe,0x00,0xf5,0xca,0xa4,0x9f,0x84,0x2b,0xa0,0x30,0x20, + 0xb7,0xcd,0x5d,0x9b,0x6d,0xfe,0x6e,0xb4,0x99,0xe8,0x53,0x86,0xee,0xfb,0x16, + 0x34,0x9e,0xf7,0xaa,0xf5,0x5a,0x79,0xa2,0x0f,0x43,0x0a,0xa4,0x8a,0xb3,0xbd, + 0x59,0xbf,0x7f,0xff,0x66,0xb1,0xbb,0x62,0x04,0x57,0xdc,0xf7,0x43,0xb1,0xba, + 0xb6,0x01,0xf5,0x4a,0xb4,0xd5,0x1e,0x8b,0xa0,0x32,0x00,0xfb,0xfb,0x1d,0x9b, + 0x6d,0xc6,0x77,0xb8,0xb1,0x70,0x51,0x0e,0xcd,0xf3,0x16,0x38,0x0c,0xbb,0x53, + 0xf5,0xda,0x5b,0x41,0x23,0x26,0x0a,0x60,0x55,0xb3,0xf5,0x59,0xbf,0xed,0xde, + 0xe6,0xf2,0x75,0x65,0x9a,0xac,0xfc,0xff,0xbe,0x72,0xcf,0xb3,0x05,0xf5,0x4a, + 0x76,0xff,0x55,0x84,0xa0,0x2a,0x80,0xbf,0xbf,0x3f,0xf6,0xed,0xfc,0xce,0xd4, + 0xe8,0xf0,0x18,0x7a,0x7a,0xfe,0x3c,0x78,0xd3,0xe9,0x50,0xf5,0xda,0xff,0xff, + 0xff,0xff,0xff,0x7f,0xaa,0x44,0x04,0xa4,0x02,0x25,0x05,0x29,0x20,0x22,0x2a, + 0xa5,0x00,0x01,0x81,0xa2,0x0a,0x08,0xa2,0x04,0xf5,0x4a,0x00,0x09,0x01,0x12, + 0x04,0x80,0x00,0x10,0x51,0x09,0x50,0x10,0x50,0x82,0x0a,0xb9,0x40,0x08,0xaa, + 0xa8,0x28,0x38,0x40,0x45,0x08,0x51,0xf5,0x0a,0x55,0x44,0xa8,0x44,0x51,0x15, + 0x54,0x45,0x04,0xa0,0x0a,0x85,0x04,0x28,0x40,0x3c,0x0a,0xa1,0x00,0x04,0x84, + 0x82,0x2a,0x20,0x22,0x04,0xf5,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xf5,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xf4,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0}; diff --git a/TCLSpecs/bitmaps/KVoicForm.xbm b/TCLSpecs/bitmaps/KVoicForm.xbm new file mode 100644 index 0000000..ef9b130 --- /dev/null +++ b/TCLSpecs/bitmaps/KVoicForm.xbm @@ -0,0 +1,117 @@ +#define KVoicForm_width 220 +#define KVoicForm_height 61 +static char KVoicForm_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xfe,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0x02,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0xfa,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xf5,0x5a,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xf5,0xea,0xff,0xff,0xff,0xff,0xff,0xbf,0xaa,0xaa,0xaa,0xfa,0xed,0xff,0xef, + 0xbf,0x7f,0xff,0xfb,0x55,0xd5,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xf5,0xca, + 0xaa,0xaa,0xfa,0xea,0xbd,0x6a,0x00,0x00,0x00,0xbc,0xcf,0x7d,0x8f,0x2f,0xbe, + 0xfc,0xe0,0x02,0xc0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x5a,0x00,0x00, + 0x06,0x10,0x36,0x20,0x55,0x55,0x55,0x0d,0xdc,0xf9,0x2c,0x8f,0x0c,0x7c,0xca, + 0x50,0xd5,0x57,0x55,0x55,0x55,0x55,0x55,0x55,0xf5,0x4a,0x55,0xd5,0x91,0x84, + 0x2c,0x35,0x00,0x00,0x00,0x4e,0x4d,0x7a,0x8c,0x2f,0x42,0x79,0x40,0x04,0x80, + 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x6a,0x00,0x60,0x08,0x51,0x78,0x60, + 0x29,0xa5,0x94,0x1e,0xd8,0x78,0x2a,0x9f,0x13,0xf4,0x6a,0x22,0x55,0x29,0xa5, + 0x94,0x52,0x4a,0x29,0x55,0xf5,0xca,0x52,0x3a,0x45,0x04,0xf2,0x29,0x42,0x08, + 0x41,0x7e,0x05,0x7c,0x11,0xcf,0x44,0xf1,0x20,0xe9,0xc1,0x03,0x0f,0x79,0x84, + 0x10,0x42,0x00,0xf5,0x4a,0x04,0x4c,0x10,0xa1,0xe0,0x63,0x08,0x21,0x14,0xfd, + 0x50,0x79,0x84,0xff,0x10,0xf4,0x5b,0x30,0x97,0xd7,0x79,0xc6,0x10,0x42,0x08, + 0x55,0xf5,0x5a,0xa1,0x06,0xff,0x09,0x4a,0x2b,0x42,0x08,0x41,0xfc,0x07,0x7a, + 0x21,0xff,0x45,0xe1,0x11,0x9d,0x86,0xc3,0x3c,0xee,0x85,0x10,0x42,0x00,0xf5, + 0x4a,0x88,0xd3,0x01,0xff,0xc7,0xa6,0x28,0xa2,0x10,0xf2,0xa7,0x78,0x14,0xff, + 0x11,0xd2,0x5b,0x5c,0xde,0xeb,0xb9,0xc7,0x51,0x44,0x11,0xa9,0xf5,0x6a,0xc5, + 0x38,0x24,0x00,0x9c,0x3c,0x02,0x09,0x84,0xc8,0x0f,0x7c,0x41,0xef,0x47,0xc4, + 0x1b,0x1d,0x8e,0xe3,0x24,0xff,0x05,0x12,0x48,0x02,0xf5,0x4a,0x60,0x0e,0x01, + 0x49,0x90,0xab,0xa8,0xa0,0x52,0x22,0x5f,0x79,0x24,0xcf,0x17,0xa1,0x4f,0xbc, + 0xae,0xeb,0x01,0x27,0x50,0x41,0x05,0x50,0xf5,0x6a,0xb5,0xe1,0xff,0x10,0x35, + 0x2a,0x02,0x0a,0x00,0x8b,0x0e,0x7a,0x89,0xaf,0x4f,0x94,0x17,0x1e,0x8e,0xe7, + 0xa8,0x0f,0x05,0x14,0x50,0x05,0xf5,0x4a,0xd0,0x38,0xc0,0x5f,0xe0,0xbe,0xa8, + 0x40,0x55,0x26,0x9e,0xf8,0x20,0x0f,0x1f,0xc1,0x87,0x5c,0xaf,0xf3,0x05,0xaf, + 0x50,0x41,0x05,0x50,0xf5,0xda,0x5a,0x8e,0x14,0xe0,0x75,0x26,0x02,0x2a,0x00, + 0x8e,0x46,0x7c,0x0a,0xaf,0x3e,0x14,0x57,0x1a,0x96,0xc3,0x63,0x0e,0x05,0x14, + 0x50,0x05,0xf5,0x4a,0xcc,0x23,0x00,0x89,0x12,0xb2,0x90,0x80,0xaa,0x2e,0x0b, + 0x79,0xa0,0x0f,0x7e,0x81,0x07,0xb0,0xc3,0xab,0x9f,0xfe,0x21,0x81,0x04,0x50, + 0xf5,0x6a,0x66,0x88,0xaa,0x10,0xb4,0x60,0x44,0x24,0x00,0xf2,0x43,0xfe,0xc9, + 0x7f,0xff,0x28,0xa2,0xea,0xcb,0x07,0x2f,0x3a,0x88,0x28,0x51,0x05,0xf5,0xca, + 0x36,0x22,0x00,0x5e,0x3d,0x2a,0x12,0x89,0x54,0x09,0x28,0x92,0x22,0x88,0x04, + 0x82,0x12,0x20,0x20,0x52,0x89,0x48,0x25,0x02,0x04,0x50,0xf5,0x5a,0x93,0x88, + 0xfa,0xe3,0xe8,0x20,0x41,0x20,0x01,0xa2,0x82,0x40,0x88,0x12,0xa1,0x28,0x88, + 0x0a,0x89,0x04,0x22,0x22,0x80,0x50,0x91,0x04,0xf5,0xca,0x01,0x7f,0x0f,0x88, + 0xca,0x6a,0x14,0x0a,0xa4,0x08,0x28,0x14,0x22,0x40,0x14,0x42,0x42,0x40,0x22, + 0xa0,0x88,0x88,0x2a,0x0a,0x04,0x51,0xf5,0xca,0xd4,0x01,0x40,0xe2,0xf8,0x20, + 0x41,0x41,0x09,0x42,0x82,0x82,0x08,0x15,0x81,0x08,0x11,0x2a,0x88,0x0a,0x02, + 0x22,0x80,0x20,0x51,0x04,0xf5,0xda,0x60,0xa0,0x94,0x3c,0x24,0x35,0x12,0x14, + 0x90,0x28,0x24,0x28,0xa2,0x40,0x28,0x22,0x44,0x81,0x22,0xa0,0x50,0x08,0x29, + 0x44,0x04,0x51,0xf5,0x4a,0x34,0x0a,0x01,0x87,0x1e,0xa0,0x20,0x81,0x22,0x02, + 0x89,0x82,0x08,0x0a,0x85,0x08,0x11,0x28,0x88,0x0a,0x0a,0x42,0x02,0x11,0x51, + 0x04,0xf5,0x6a,0x11,0x41,0x28,0xf1,0x7b,0x35,0x8a,0x28,0x88,0xa8,0x20,0x28, + 0x91,0x40,0x20,0x42,0x84,0x02,0x21,0x90,0xa0,0x28,0xa8,0x44,0x04,0xa1,0xf5, + 0x4a,0x5a,0x14,0xc5,0x3d,0x60,0xa0,0x20,0x84,0x03,0x02,0x74,0x02,0x44,0xfc, + 0x8a,0x28,0x27,0xa8,0x4c,0xe2,0x1f,0x82,0xf7,0x6e,0x48,0x14,0xf5,0xda,0x08, + 0x41,0x60,0x04,0x69,0x29,0x0a,0xd1,0xa9,0x50,0xe5,0x50,0x01,0xdd,0x20,0xc2, + 0x96,0x02,0x8e,0x28,0xb7,0x24,0x66,0x6e,0x05,0x41,0xf5,0x4a,0x4c,0x14,0x35, + 0x46,0x3c,0xa4,0x40,0xc4,0x03,0x04,0x6e,0x04,0x54,0x8c,0x8a,0x68,0x06,0x90, + 0x28,0x62,0x13,0x88,0xee,0x43,0x2e,0x12,0xf5,0x5a,0x15,0x41,0xf0,0x13,0x46, + 0x31,0x2a,0x51,0xfb,0xf3,0xef,0xf3,0x1b,0x5d,0xf3,0xf3,0x5f,0xdf,0xcf,0x13, + 0xd3,0xf3,0x66,0x79,0x8f,0x40,0xf5,0x4a,0x44,0x14,0x05,0x88,0x12,0xa4,0x00, + 0x64,0x67,0xdf,0x6f,0x73,0x57,0x78,0xd7,0x6e,0x3e,0x77,0x6e,0x8a,0xe7,0xdf, + 0xef,0xe3,0x26,0x14,0xf5,0x6a,0x15,0x41,0x40,0x42,0x4a,0x31,0xa9,0xa8,0x76, + 0xbb,0x67,0xf7,0x17,0xea,0xf3,0xe6,0x76,0xff,0xfd,0x23,0x6b,0xbe,0x67,0x6b, + 0x8e,0x42,0xf5,0x4a,0x44,0x10,0x95,0x28,0x03,0x24,0x02,0xf2,0x67,0x9b,0x77, + 0xb3,0x86,0xd4,0xd6,0x6f,0x36,0xe7,0xcf,0x0b,0xe3,0x9e,0x77,0xe7,0x26,0x10, + 0xf5,0x6a,0x1d,0x45,0x00,0x02,0xaa,0xa8,0xa8,0x30,0xee,0xbb,0xe7,0x7b,0x2e, + 0xcd,0xcf,0xe6,0x76,0x2f,0x6f,0x43,0xeb,0xbe,0xe7,0x6e,0x0e,0x45,0xf5,0x4a, + 0x50,0x10,0xaa,0x50,0x05,0x22,0x02,0xba,0x7f,0xff,0x7c,0xe7,0x0f,0x7c,0xfc, + 0xde,0x77,0xfe,0xff,0xa9,0xc7,0xf7,0x7f,0xfe,0x4d,0x10,0xf5,0x6a,0x35,0x85, + 0x00,0x0a,0xac,0xb0,0xa8,0x08,0x92,0xa0,0x12,0x24,0x51,0x49,0x06,0x01,0x09, + 0x41,0x89,0x04,0x52,0x20,0x11,0x12,0x20,0x45,0xf5,0xca,0x60,0x50,0xaa,0x40, + 0x0d,0x24,0x02,0x42,0x08,0x0a,0x44,0x41,0x04,0x22,0x57,0x48,0x44,0x14,0x20, + 0xa2,0x04,0x4a,0x84,0x88,0x0a,0x10,0xf5,0xda,0x44,0x05,0x00,0x14,0xa8,0xb2, + 0x90,0x28,0xa2,0x40,0x11,0x14,0xa1,0x08,0x03,0x12,0x11,0x81,0x8a,0x10,0x50, + 0x01,0x51,0x42,0x40,0x45,0xf5,0xca,0x62,0x10,0x20,0x00,0x0a,0x20,0x24,0x82, + 0x08,0x14,0x44,0x41,0x08,0xa2,0x54,0x41,0x44,0x28,0x20,0x44,0x05,0x54,0x04, + 0x28,0x2a,0x20,0xf5,0xda,0xa8,0x84,0x0a,0x42,0x88,0xa2,0x82,0x28,0x42,0x81, + 0x10,0x14,0x45,0x08,0x02,0x14,0x11,0x05,0x09,0x11,0x20,0x01,0xa1,0x02,0x81, + 0x8a,0xf5,0xca,0x32,0xc2,0x8f,0x88,0x02,0x30,0x28,0x82,0x10,0x54,0x44,0x41, + 0x20,0xa2,0x50,0x41,0x44,0x50,0xa2,0x84,0x4a,0x54,0x14,0x50,0x28,0x20,0xf5, + 0x5a,0x90,0x18,0xd0,0xeb,0x89,0xa0,0x82,0x27,0x4a,0x01,0x11,0x12,0x8a,0x08, + 0x3a,0x08,0xf1,0x07,0xb8,0x20,0xe0,0x01,0x71,0x8f,0x83,0x0b,0xf5,0x4a,0x15, + 0x96,0x4a,0x00,0x00,0x20,0x50,0x8b,0x00,0x55,0x44,0x44,0x21,0xc2,0x34,0x45, + 0x68,0xa6,0xce,0x95,0xca,0x48,0x38,0xdf,0xf7,0x40,0xf5,0x6a,0xb8,0x07,0x00, + 0x02,0x22,0x64,0x05,0x23,0xaa,0x01,0x81,0x10,0x88,0x70,0xb0,0x10,0xe5,0x16, + 0xae,0x00,0xd0,0x12,0x35,0xfb,0x66,0x2a,0xf5,0x4a,0x09,0x09,0x90,0x48,0x04, + 0x30,0x50,0xff,0xf8,0xef,0xdf,0xb6,0xfe,0xf7,0xfa,0xba,0x61,0x86,0x86,0xfc, + 0xde,0x4c,0x70,0xdb,0xbe,0x00,0xf5,0x6a,0x4c,0x41,0x45,0x00,0x20,0x22,0x05, + 0xb3,0xcd,0x5d,0xbb,0x6f,0xee,0xe6,0xb0,0x99,0xf4,0x2b,0x16,0xed,0xfb,0x0e, + 0x35,0x9e,0xf7,0xaa,0xf5,0x4a,0x05,0x0b,0x00,0xa2,0x44,0x60,0xa0,0xf3,0xbf, + 0x59,0x9b,0x7d,0xfe,0x6e,0xb4,0xbb,0x61,0x82,0x46,0xdc,0xf7,0x43,0xb0,0xba, + 0xb6,0x01,0xf5,0x5a,0x54,0x81,0x8a,0x00,0x00,0x25,0x0a,0xb7,0xf9,0x3b,0xbb, + 0xed,0xd6,0x66,0xb2,0xb1,0xe8,0x28,0x16,0xcd,0xf3,0x2e,0x3a,0x0c,0xbb,0x53, + 0xf5,0xca,0x06,0x15,0x10,0x48,0x41,0x60,0x41,0xb3,0xf7,0x99,0x9f,0x6d,0xce, + 0xf7,0xf8,0x75,0x65,0x1a,0x8d,0xdc,0xff,0x3d,0xb1,0xce,0xb3,0x05,0xf5,0x5a, + 0xaa,0x41,0x45,0x02,0x88,0x24,0x94,0xbf,0x7f,0x3f,0xf6,0xef,0xfd,0xce,0xd2, + 0x61,0xf0,0xb8,0xfc,0x7a,0xfe,0xbc,0x78,0xd3,0xe9,0x50,0xf5,0xca,0xff,0xff, + 0xff,0xff,0xff,0x3f,0x21,0x49,0x00,0x92,0x4a,0x20,0x48,0x20,0x08,0xb4,0x2a, + 0x05,0x20,0x48,0x21,0x22,0x4a,0x0a,0xa2,0x04,0xf5,0x4a,0x00,0x09,0x00,0x48, + 0x02,0x50,0x44,0x20,0x2a,0x21,0x20,0x8a,0x22,0x8a,0xa2,0x38,0x40,0x90,0x8a, + 0x22,0x88,0x98,0x80,0x40,0x08,0x51,0xf5,0x1a,0x55,0xa2,0xaa,0x82,0x50,0x05, + 0x11,0x0a,0x81,0x08,0x09,0x21,0x08,0x21,0x08,0x9a,0x0a,0x45,0x20,0x88,0x22, + 0x22,0x2a,0x2a,0x22,0x04,0xf5,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xf5,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xf4,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0}; diff --git a/TCLSpecs/bitmaps/KVoiceFM.xbm b/TCLSpecs/bitmaps/KVoiceFM.xbm new file mode 100644 index 0000000..b795a8b --- /dev/null +++ b/TCLSpecs/bitmaps/KVoiceFM.xbm @@ -0,0 +1,117 @@ +#define KVoiceFM_width 220 +#define KVoiceFM_height 61 +static char KVoiceFM_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xfe,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0x02,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0xfa,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xf5,0x5a,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xf5,0xea,0xff,0xff,0xff,0xff,0xff,0xbf,0xaa,0xaa,0xaa,0xfa,0xed,0xff,0xef, + 0xbf,0x7f,0xff,0xfb,0x55,0xd5,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xf5,0xca, + 0xaa,0xaa,0xfa,0xea,0xbd,0x6a,0x00,0x00,0x00,0xbc,0xcf,0x7d,0x8f,0x2f,0xbe, + 0xfc,0xe0,0x02,0xc0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x5a,0x00,0x00, + 0x06,0x10,0x36,0x20,0x55,0x55,0x55,0x0d,0xdc,0xf9,0x2c,0x8f,0x0c,0x7c,0xca, + 0x50,0xd5,0x57,0x55,0x55,0x55,0x55,0x55,0x55,0xf5,0x4a,0x55,0xd5,0x91,0x84, + 0x2c,0x35,0x00,0x00,0x00,0x4e,0x4d,0x7a,0x8c,0x2f,0x42,0x79,0x40,0x04,0x80, + 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0x6a,0x00,0x60,0x08,0x51,0x78,0x60, + 0x29,0xa5,0x94,0x1e,0xd8,0x78,0x2a,0x9f,0x13,0xf4,0x6a,0x22,0x55,0x29,0xa5, + 0x94,0x52,0x4a,0x29,0x55,0xf5,0xca,0x52,0x3a,0x45,0x04,0xf2,0x29,0x42,0x08, + 0x41,0x7e,0x05,0x7c,0x11,0xcf,0x44,0xf1,0x20,0xe9,0xc1,0x03,0x0f,0x79,0x84, + 0x10,0x42,0x00,0xf5,0x4a,0x04,0x4c,0x10,0xa1,0xe0,0x63,0x08,0x21,0x14,0xfd, + 0x50,0x79,0x84,0xff,0x10,0xf4,0x5b,0x30,0x97,0xd7,0x79,0xc6,0x10,0x42,0x08, + 0x55,0xf5,0x5a,0xa1,0x06,0xff,0x09,0x4a,0x2b,0x42,0x08,0x41,0xfc,0x07,0x7a, + 0x21,0xff,0x45,0xe1,0x11,0x9d,0x86,0xc3,0x3c,0xee,0x85,0x10,0x42,0x00,0xf5, + 0x4a,0x88,0xd3,0x01,0xff,0xc7,0xa6,0x28,0xa2,0x10,0xf2,0xa7,0x78,0x14,0xff, + 0x11,0xd2,0x5b,0x5c,0xde,0xeb,0xb9,0xc7,0x51,0x44,0x11,0xa9,0xf5,0x6a,0xc5, + 0x38,0x24,0x00,0x9c,0x3c,0x02,0x09,0x84,0xc8,0x0f,0x7c,0x41,0xef,0x47,0xc4, + 0x1b,0x1d,0x8e,0xe3,0x24,0xff,0x05,0x12,0x48,0x02,0xf5,0x4a,0x60,0x0e,0x01, + 0x49,0x90,0xab,0xa8,0xa0,0x52,0x22,0x5f,0x79,0x24,0xcf,0x17,0xa1,0x4f,0xbc, + 0xae,0xeb,0x01,0x27,0x50,0x41,0x05,0x50,0xf5,0x6a,0xb5,0xe1,0xff,0x10,0x35, + 0x2a,0x02,0x0a,0x00,0x8b,0x0e,0x7a,0x89,0xaf,0x4f,0x94,0x17,0x1e,0x8e,0xe7, + 0xa8,0x0f,0x05,0x14,0x50,0x05,0xf5,0x4a,0xd0,0x38,0xc0,0x5f,0xe0,0xbe,0xa8, + 0x40,0x55,0x26,0x9e,0xf8,0x20,0x0f,0x1f,0xc1,0x87,0x5c,0xaf,0xf3,0x05,0xaf, + 0x50,0x41,0x05,0x50,0xf5,0xda,0x5a,0x8e,0x14,0xe0,0x75,0x26,0x02,0x2a,0x00, + 0x8e,0x46,0x7c,0x0a,0xaf,0x3e,0x14,0x57,0x1a,0x96,0xc3,0x63,0x0e,0x05,0x14, + 0x50,0x05,0xf5,0x4a,0xcc,0x23,0x00,0x89,0x12,0xb2,0x90,0x80,0xaa,0x2e,0x0b, + 0x79,0xa0,0x0f,0x7e,0x81,0x07,0xb0,0xc3,0xab,0x9f,0xfe,0x21,0x81,0x04,0x50, + 0xf5,0x6a,0x66,0x88,0xaa,0x10,0xb4,0x60,0x44,0x24,0x00,0xf2,0x43,0xfe,0xc9, + 0x7f,0xff,0x28,0xa2,0xea,0xcb,0x07,0x2f,0x3a,0x88,0x28,0x51,0x05,0xf5,0xca, + 0x36,0x22,0x00,0x5e,0x3d,0x2a,0x12,0x89,0x54,0x09,0x28,0x92,0x22,0x88,0x04, + 0x82,0x12,0x20,0x20,0x52,0x89,0x48,0x25,0x02,0x04,0x50,0xf5,0x5a,0x93,0x88, + 0xfa,0xe3,0xe8,0x20,0x41,0x20,0x01,0xa2,0x82,0x40,0x88,0x12,0xa1,0x28,0x88, + 0x0a,0x89,0x04,0x22,0x22,0x80,0x50,0x91,0x04,0xf5,0xca,0x01,0x7f,0x0f,0x88, + 0xca,0x6a,0x14,0x0a,0xa4,0x08,0x28,0x14,0x22,0x40,0x14,0x42,0x42,0x40,0x22, + 0xa0,0x88,0x88,0x2a,0x0a,0x04,0x51,0xf5,0xca,0xd4,0x01,0x40,0xe2,0xf8,0x20, + 0x41,0x41,0x09,0x42,0x82,0x82,0x08,0x15,0x81,0x08,0x11,0x2a,0x88,0x0a,0x02, + 0x22,0x80,0x20,0x51,0x04,0xf5,0xda,0x60,0xa0,0x94,0x3c,0x24,0x35,0x12,0x14, + 0x90,0x28,0x24,0x28,0xa2,0x40,0x28,0x22,0x44,0x81,0x22,0xa0,0x50,0x08,0x29, + 0x44,0x04,0x51,0xf5,0x4a,0x34,0x0a,0x01,0x87,0x1e,0xa0,0x20,0x81,0x22,0x02, + 0x89,0x82,0x08,0x0a,0x85,0x08,0x11,0x28,0x88,0x0a,0x0a,0x42,0x02,0x11,0x51, + 0x04,0xf5,0x6a,0x11,0x41,0x28,0xf1,0x7b,0x35,0x8a,0x28,0x88,0xa8,0x20,0x28, + 0x91,0x40,0x20,0x42,0x84,0x02,0x21,0x90,0xa0,0x28,0xa8,0x44,0x04,0xa1,0xf5, + 0x4a,0x5a,0x14,0xc5,0x3d,0x60,0xa0,0x20,0x84,0x03,0x02,0x74,0x02,0x44,0xfc, + 0x8a,0x28,0x27,0xa8,0x4c,0xe2,0x1f,0x82,0xf7,0x6e,0x48,0x14,0xf5,0xda,0x08, + 0x41,0x60,0x04,0x69,0x29,0x0a,0xd1,0xa9,0x50,0xe5,0x50,0x01,0xdd,0x20,0xc2, + 0x96,0x02,0x8e,0x28,0xb7,0x24,0x66,0x6e,0x05,0x41,0xf5,0x4a,0x4c,0x14,0x35, + 0x46,0x3c,0xa4,0x40,0xc4,0x03,0x04,0x6e,0x04,0x54,0x8c,0x8a,0x68,0x06,0x90, + 0x28,0x62,0x13,0x88,0xee,0x43,0x2e,0x12,0xf5,0x5a,0x15,0x41,0xf0,0x13,0x46, + 0x31,0x2a,0x51,0xfb,0xf3,0xef,0xf3,0x1b,0x5d,0xf3,0xf3,0x5f,0xdf,0xcf,0x13, + 0xd3,0xf3,0x66,0x79,0x8f,0x40,0xf5,0x4a,0x44,0x14,0x05,0x88,0x12,0xa4,0x00, + 0x64,0x67,0xdf,0x6f,0x73,0x57,0x78,0xd7,0x6e,0x3e,0x77,0x6e,0x8a,0xe7,0xdf, + 0xef,0xe3,0x26,0x14,0xf5,0x6a,0x15,0x41,0x40,0x42,0x4a,0x31,0xa9,0xa8,0x76, + 0xbb,0x67,0xf7,0x17,0xea,0xf3,0xe6,0x76,0xff,0xfd,0x23,0x6b,0xbe,0x67,0x6b, + 0x8e,0x42,0xf5,0x4a,0x44,0x10,0x95,0x28,0x03,0x24,0x02,0xf2,0x67,0x9b,0x77, + 0xb3,0x86,0xd4,0xd6,0x6f,0x36,0xe7,0xcf,0x0b,0xe3,0x9e,0x77,0xe7,0x26,0x10, + 0xf5,0x6a,0x1d,0x45,0x00,0x02,0xaa,0xa8,0xa8,0x30,0xee,0xbb,0xe7,0x7b,0x2e, + 0xcd,0xcf,0xe6,0x76,0x2f,0x6f,0x43,0xeb,0xbe,0xe7,0x6e,0x0e,0x45,0xf5,0x4a, + 0x50,0x10,0xaa,0x50,0x05,0x22,0x02,0xba,0x7f,0xff,0x7c,0xe7,0x0f,0x7c,0xfc, + 0xde,0x77,0xfe,0xff,0xa9,0xc7,0xf7,0x7f,0xfe,0x4d,0x10,0xf5,0x6a,0x35,0x85, + 0x00,0x0a,0xac,0xb0,0xa8,0x08,0x92,0xa0,0x12,0x24,0x51,0x49,0x06,0x01,0x09, + 0x41,0x89,0x04,0x52,0x20,0x11,0x12,0x20,0x45,0xf5,0xca,0x60,0x50,0xaa,0x40, + 0x0d,0x24,0x02,0x42,0x08,0x0a,0x44,0x41,0x04,0x22,0x57,0x48,0x44,0x14,0x20, + 0xa2,0x04,0x4a,0x84,0x88,0x0a,0x10,0xf5,0xda,0x44,0x05,0x00,0x14,0xa8,0xb2, + 0x90,0x28,0xa2,0x40,0x11,0x14,0xa1,0x08,0x03,0x12,0x11,0x81,0x8a,0x10,0x50, + 0x01,0x51,0x42,0x40,0x45,0xf5,0xca,0x62,0xa0,0x52,0x01,0x08,0x20,0x24,0x82, + 0x08,0x14,0x44,0x41,0x08,0xa2,0x54,0x41,0x44,0x28,0x20,0x44,0x05,0x54,0x04, + 0x28,0x2a,0x20,0xf5,0xda,0x28,0x0a,0x04,0x84,0x8a,0xa2,0x82,0x28,0x42,0x81, + 0x10,0x14,0x45,0x08,0x02,0x14,0x11,0x05,0x09,0x11,0x20,0x01,0xa1,0x02,0x81, + 0x8a,0xf5,0xca,0x32,0xe1,0x5f,0x21,0x06,0x30,0x28,0x82,0x10,0x54,0x44,0x41, + 0x20,0xa2,0x50,0x41,0x44,0x50,0xa2,0x84,0x4a,0x54,0x14,0x50,0x28,0x20,0xf5, + 0x5a,0x50,0xbc,0xf0,0xef,0x89,0xa0,0x82,0x27,0x4a,0x01,0x11,0x12,0x8a,0x08, + 0x3a,0x08,0xf1,0x07,0xb8,0x20,0xe0,0x01,0x71,0x8f,0x83,0x0b,0xf5,0x4a,0x15, + 0x06,0x04,0x44,0x02,0x20,0x50,0x8b,0x00,0x55,0x44,0x44,0x21,0xc2,0x34,0x45, + 0x68,0xa6,0xce,0x95,0xca,0x48,0x38,0xdf,0xf7,0x40,0xf5,0x6a,0x98,0x53,0x51, + 0x01,0x20,0x64,0x05,0x23,0xaa,0x01,0x81,0x10,0x88,0x70,0xb0,0x10,0xe5,0x16, + 0xae,0x00,0xd0,0x12,0x35,0xfb,0x66,0x2a,0xf5,0x4a,0x49,0x09,0x04,0x08,0x04, + 0x30,0x50,0xff,0xf8,0xef,0xdf,0xb6,0xfe,0xf7,0xfa,0xba,0x61,0x86,0x86,0xfc, + 0xde,0x4c,0x70,0xdb,0xbe,0x00,0xf5,0x6a,0x1c,0x45,0xa1,0xa2,0x22,0x22,0x05, + 0xb3,0xcd,0x5d,0xbb,0x6f,0xee,0xe6,0xb0,0x99,0xf4,0x2b,0x16,0xed,0xfb,0x0e, + 0x35,0x9e,0xf7,0xaa,0xf5,0x4a,0x85,0x21,0x08,0x00,0x40,0x60,0xa0,0xf3,0xbf, + 0x59,0x9b,0x7d,0xfe,0x6e,0xb4,0xbb,0x61,0x82,0x46,0xdc,0xf7,0x43,0xb0,0xba, + 0xb6,0x01,0xf5,0x6a,0x24,0x0b,0xa5,0x8a,0x0a,0x25,0x0a,0xb7,0xf9,0x3b,0xbb, + 0xed,0xd6,0x66,0xb2,0xb1,0xe8,0x28,0x16,0xcd,0xf3,0x2e,0x3a,0x0c,0xbb,0x53, + 0xf5,0xca,0x16,0xa1,0x00,0x40,0x40,0x60,0x41,0xb3,0xf7,0x99,0x9f,0x6d,0xce, + 0xf7,0xf8,0x75,0x65,0x1a,0x8d,0xdc,0xff,0x3d,0xb1,0xce,0xb3,0x05,0xf5,0x5a, + 0x82,0x09,0xaa,0x0a,0x85,0x24,0x94,0xbf,0x7f,0x3f,0xf6,0xef,0xfd,0xce,0xd2, + 0x61,0xf0,0xb8,0xfc,0x7a,0xfe,0xbc,0x78,0xd3,0xe9,0x50,0xf5,0xca,0xff,0xff, + 0xff,0xff,0xff,0x3f,0x21,0x49,0x00,0x92,0x4a,0x20,0x48,0x20,0x08,0xb4,0x2a, + 0x05,0x20,0x48,0x21,0x22,0x4a,0x0a,0xa2,0x04,0xf5,0x2a,0x52,0x44,0x00,0x20, + 0x10,0x50,0x44,0x20,0x2a,0x21,0x20,0x8a,0x22,0x8a,0xa2,0x38,0x40,0x90,0x8a, + 0x22,0x88,0x98,0x80,0x40,0x08,0x51,0xf5,0x8a,0x04,0x11,0xaa,0x0a,0x45,0x05, + 0x11,0x0a,0x81,0x08,0x09,0x21,0x08,0x21,0x08,0x9a,0x0a,0x45,0x20,0x88,0x22, + 0x22,0x2a,0x2a,0x22,0x04,0xf5,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xf5,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xf4,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0}; diff --git a/TCLSpecs/bitmaps/Klar.xbm b/TCLSpecs/bitmaps/Klar.xbm new file mode 100644 index 0000000..a9f8653 --- /dev/null +++ b/TCLSpecs/bitmaps/Klar.xbm @@ -0,0 +1,117 @@ +#define Klar_width 220 +#define Klar_height 61 +static char Klar_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xfe,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0x02,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0xfa,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xf5,0x5a,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0xf5,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xf5,0xea,0xff,0xff,0xff,0xff,0xff,0xbf,0xaa,0xaa,0xaa,0xfa,0xed,0xff,0xef, + 0xbf,0x7f,0x5f,0x55,0x55,0xd5,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xf5,0x4a, + 0x53,0xbd,0xaa,0xaa,0xaa,0x6a,0x00,0x00,0x00,0xbc,0xcf,0x7d,0x8f,0x2f,0xbe, + 0x3c,0x00,0x00,0xc0,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0xf5,0x6a,0x02,0x66, + 0x00,0x00,0x00,0x20,0x55,0x55,0x55,0x0d,0xdc,0xf9,0x2c,0x8f,0x0c,0x1e,0x55, + 0x55,0xd5,0xab,0xaa,0xaa,0xaa,0x55,0x55,0x55,0xf5,0xca,0x81,0x44,0x55,0x75, + 0x55,0x35,0x00,0x00,0x00,0x4e,0x4d,0x7a,0x8c,0x2f,0x82,0x5c,0x00,0x00,0x80, + 0x03,0x00,0x00,0x80,0x01,0x00,0x00,0xf5,0x5a,0x40,0x69,0x00,0xdc,0x00,0x60, + 0x29,0xa5,0x94,0x1e,0xd8,0x78,0x2a,0x9f,0x53,0x1c,0x4a,0x29,0x55,0xa8,0x94, + 0x52,0xea,0x4b,0x29,0x55,0xf5,0x4a,0xc0,0x42,0xa9,0x87,0x4a,0x29,0x42,0x08, + 0x41,0x7e,0x05,0x7c,0x11,0xcf,0x08,0xbe,0x7c,0xf2,0xcc,0xe3,0x39,0xe4,0xe1, + 0x17,0x42,0x00,0xf5,0x6a,0x40,0x10,0x82,0xfc,0x10,0x62,0x08,0x21,0x14,0xfd, + 0x50,0x79,0x84,0xff,0xa2,0x1c,0xc2,0xe4,0xbf,0xcb,0xfd,0x18,0xcb,0x41,0x08, + 0x55,0xf5,0xca,0x80,0x8a,0x28,0x42,0x42,0x28,0x42,0x08,0x41,0xfc,0x07,0x7a, + 0x21,0xff,0x08,0xbc,0xef,0xf1,0x9c,0xd3,0xe7,0xba,0xd3,0x15,0x42,0x00,0xf5, + 0x5a,0x01,0xa0,0x82,0x10,0x11,0xa2,0x28,0xa2,0x10,0xf2,0xa7,0x78,0x14,0xff, + 0x43,0x1d,0xc7,0xe3,0xc2,0xc7,0xe9,0x1c,0xc7,0x41,0x11,0xa9,0xf5,0x4a,0x5a, + 0x0a,0x27,0x4a,0x44,0x31,0x02,0x09,0x84,0xc8,0x0f,0x7c,0x41,0xef,0x2b,0x3c, + 0xe9,0xe9,0x91,0xe3,0xe1,0xfd,0xef,0x15,0x48,0x02,0xf5,0x6a,0x95,0x40,0x8d, + 0x00,0x11,0xa4,0xa8,0xa0,0x52,0x22,0x5f,0x79,0x24,0xdf,0x07,0x9d,0xd8,0xe3, + 0x88,0xcb,0xeb,0x3c,0xc1,0x41,0x05,0x50,0xf5,0x4a,0x14,0x94,0x28,0x54,0x44, + 0x31,0x02,0x0a,0x00,0x8b,0x0e,0x7a,0x41,0x8f,0xaf,0x1c,0xd6,0xe9,0xc5,0xc3, + 0xe1,0x1d,0xd4,0x15,0x50,0x05,0xf5,0x5a,0xf1,0x02,0x18,0x01,0x11,0xa4,0xa8, + 0x40,0x55,0x26,0x9e,0xf8,0x14,0x4f,0x1f,0xbe,0xc7,0xe1,0x90,0xeb,0xeb,0x7c, + 0xc1,0x41,0x05,0x50,0xf5,0x4a,0x84,0x51,0x8f,0x28,0x22,0x31,0x02,0x2a,0x00, + 0x8e,0x46,0x7c,0x40,0x2f,0xbe,0x1c,0xd7,0xeb,0xa4,0xc3,0xe1,0x3a,0xec,0x1b, + 0x50,0x05,0xf5,0xda,0x48,0x09,0x48,0x42,0x44,0xa4,0x90,0x80,0xaa,0x2e,0x0b, + 0x79,0x15,0x0f,0x3f,0x5c,0xff,0xe3,0x81,0xd7,0xf5,0xf8,0xc3,0x87,0x04,0x50, + 0xf5,0x4a,0x11,0xa3,0x22,0x08,0x11,0x31,0x44,0x24,0x00,0xf2,0x43,0xfe,0xc1, + 0x7f,0xff,0x3f,0x8f,0xf9,0xeb,0xe7,0xf3,0xeb,0x94,0x2b,0x51,0x05,0xf5,0x5a, + 0x44,0x0a,0x88,0x42,0x40,0xa0,0x12,0x89,0x54,0x09,0x28,0x44,0x54,0x12,0x24, + 0x44,0xa8,0x04,0x82,0x10,0x44,0x40,0x81,0x00,0x04,0x50,0xf5,0x4a,0xf1,0x43, + 0x22,0x28,0x0a,0x35,0x40,0x20,0x01,0xa2,0x02,0x11,0x01,0x41,0x89,0x10,0x02, + 0xa2,0x28,0x44,0x11,0x15,0x54,0x54,0x91,0x04,0xf5,0x6a,0x1c,0x90,0x88,0x02, + 0x41,0x60,0x15,0x0a,0xa4,0x08,0xa8,0x44,0x54,0x14,0x20,0x44,0x91,0x10,0x82, + 0x12,0x44,0x40,0x01,0x02,0x04,0x51,0xf5,0xca,0x86,0x0a,0x22,0xa8,0x28,0x2a, + 0x40,0x41,0x09,0x42,0x02,0x10,0x01,0x81,0x0a,0x11,0x24,0x8a,0x20,0x40,0x11, + 0x12,0xa8,0x28,0x51,0x04,0xf5,0x5a,0x52,0x40,0x88,0x02,0x84,0xa0,0x12,0x14, + 0x90,0x28,0x51,0x45,0x54,0x28,0xa0,0x44,0x81,0x40,0x14,0x15,0x84,0x88,0x02, + 0x42,0x04,0x51,0xf5,0x4a,0x05,0x2a,0xfe,0xff,0x23,0x32,0x20,0x81,0x22,0x02, + 0x04,0x10,0x01,0x05,0x09,0x10,0x28,0x14,0x42,0x20,0x51,0x42,0xa8,0x08,0x51, + 0x04,0xf5,0xda,0xa1,0x00,0x03,0x00,0xff,0xac,0x8a,0x28,0x88,0x50,0xa1,0x44, + 0x48,0x50,0x44,0x45,0x05,0x41,0x11,0x09,0x04,0x10,0x02,0x42,0x04,0xa1,0xf5, + 0x4a,0x15,0xea,0xc3,0x0f,0x01,0x38,0x20,0x84,0x23,0x04,0xe8,0x11,0x22,0xf2, + 0x21,0x10,0xae,0x14,0x58,0xe2,0xbf,0x8a,0xfe,0xdd,0x48,0x14,0xf5,0x6a,0x81, + 0xf8,0xf7,0xcf,0x0d,0xba,0x0a,0x21,0x87,0xa2,0xca,0x44,0x09,0x99,0x8b,0xc4, + 0x0c,0x40,0x1d,0xc8,0x66,0x40,0xcc,0xdd,0x0a,0x41,0xf5,0xca,0x57,0x0e,0x02, + 0x08,0x01,0x38,0x40,0x94,0x27,0x10,0xdc,0x10,0x40,0x5c,0x21,0xc2,0x5d,0x15, + 0xa0,0x42,0x2e,0x15,0xdd,0x86,0x2c,0x12,0xf5,0x5a,0xde,0x77,0x23,0x1d,0x23, + 0xb3,0x2a,0xc1,0xee,0xe7,0xdf,0xc7,0x3f,0x39,0xee,0xf7,0x3d,0xfc,0x9f,0x97, + 0xa6,0xe7,0xcd,0xf6,0x9e,0x40,0xf5,0x4a,0xf9,0x02,0xaa,0x38,0xce,0x34,0x00, + 0xc8,0xc6,0xb6,0xcf,0xf6,0x6e,0xf4,0xa7,0xcd,0xec,0xee,0xde,0x24,0xc6,0xbe, + 0xdf,0xc3,0x2d,0x14,0xf5,0xda,0xfe,0xff,0xff,0xef,0xff,0x7f,0xa9,0x52,0xed, + 0xbe,0xef,0xe6,0x0f,0xd1,0xb7,0xdd,0x6e,0xfe,0xfb,0x0b,0xd7,0x7d,0xcf,0xd6, + 0x8c,0x42,0xf5,0xca,0xff,0xff,0xff,0xdf,0xfe,0x3f,0x02,0xe0,0xcf,0x36,0xcf, + 0x77,0x5d,0x88,0xed,0xcd,0xec,0x86,0x9f,0x47,0xc6,0x3c,0xef,0xce,0x2e,0x10, + 0xf5,0x6a,0xff,0xff,0xc9,0x0e,0x02,0x70,0xa8,0x2a,0xdc,0x77,0xdf,0xe6,0x0c, + 0xdd,0x9d,0xef,0x6d,0x6e,0xde,0x2e,0xd7,0x7f,0xcf,0xfd,0x1c,0x45,0xf5,0xca, + 0x5e,0x05,0x84,0x4b,0xff,0x3f,0x02,0x70,0xff,0xfe,0xf9,0xde,0x5f,0xf8,0xda, + 0x9d,0xff,0xfe,0xff,0x03,0x8f,0xef,0xff,0xfc,0x59,0x10,0xf5,0x5a,0x08,0x10, + 0x89,0x27,0xfc,0xbf,0xa8,0xaa,0x28,0x41,0x05,0x42,0x12,0x12,0x48,0x20,0x82, + 0x10,0x11,0x52,0x52,0xa0,0x24,0x05,0x05,0x45,0xf5,0xca,0x1a,0xc0,0x4d,0x43, + 0xc0,0x30,0x02,0x00,0x02,0x14,0xa0,0x10,0x81,0x44,0x2f,0x8a,0x28,0x44,0x84, + 0x08,0x84,0x04,0x00,0x50,0x50,0x10,0xf5,0x4a,0xfe,0xe7,0x2d,0x40,0x84,0xbf, + 0x48,0xa5,0x50,0x41,0x15,0x44,0x54,0x10,0x16,0x21,0x02,0x11,0x21,0x42,0x21, + 0x50,0x55,0x05,0x05,0x45,0xf5,0x6a,0x43,0xe0,0xbf,0x6c,0x99,0x3f,0x12,0x08, + 0x0a,0x12,0x40,0x11,0x01,0x45,0x85,0x88,0xa8,0x44,0x94,0x28,0x14,0x05,0x00, + 0x50,0x50,0x20,0xf5,0xca,0x15,0x0a,0xce,0x7f,0x98,0xbf,0x40,0xa1,0x40,0x44, + 0x15,0x44,0x54,0x10,0x20,0x22,0x02,0x10,0x01,0x02,0x81,0xa0,0xaa,0x84,0x04, + 0x8a,0xf5,0xda,0x40,0x41,0x36,0xf0,0x7e,0x24,0x14,0x08,0x14,0x11,0x40,0x01, + 0x01,0x45,0x95,0x88,0x50,0x45,0xa8,0x50,0x28,0x0a,0x00,0x11,0xa2,0x20,0xf5, + 0xca,0x14,0x14,0x12,0xba,0x01,0x69,0x81,0xaf,0x42,0x84,0x14,0x54,0x48,0x10, + 0x70,0x22,0xe4,0x17,0x72,0x05,0xc2,0x41,0x75,0x5c,0x0f,0x0b,0xf5,0xda,0x42, + 0x81,0x8e,0x98,0x54,0x22,0x54,0x06,0x10,0x22,0x41,0x01,0x22,0x84,0xe5,0x80, + 0xc2,0x4c,0x99,0x51,0xa9,0x15,0x70,0xb7,0xed,0x45,0xf5,0x4a,0x10,0x54,0x40, + 0x64,0x00,0x68,0x01,0x97,0x8a,0x13,0x14,0x54,0x09,0xe1,0x68,0x2a,0xd0,0x1d, + 0xac,0x05,0x80,0x81,0x64,0xb6,0xcd,0x21,0xf5,0xda,0x24,0x01,0x2a,0x11,0xaa, + 0x22,0x48,0xf6,0xf1,0xdf,0xf7,0x6d,0xf8,0xef,0xe1,0xb1,0xcb,0x8c,0x0e,0xf2, + 0xfe,0x3d,0x71,0xf7,0x6d,0x14,0xf5,0x4a,0x42,0x54,0x01,0x84,0x00,0xb0,0x22, + 0x6e,0xbb,0xf7,0x36,0xdb,0xfe,0xcd,0x6a,0x37,0xc5,0x47,0x9c,0xf8,0xf7,0x0d, + 0x64,0x3c,0xff,0x81,0xf5,0x6a,0x08,0x01,0x54,0x51,0x54,0x25,0x08,0x67,0x7b, + 0x33,0xb7,0xdb,0xfc,0xed,0x60,0x73,0xe1,0x14,0x4d,0x9c,0xef,0xa7,0x68,0x35, + 0x6d,0x2b,0xf5,0xca,0x42,0x28,0x01,0x04,0x01,0xa8,0x42,0xee,0xf7,0x37,0x36, + 0xff,0x8d,0xcf,0xf5,0x6b,0xcb,0x41,0x0c,0xb9,0xe7,0x1d,0xe2,0x58,0xe6,0x03, + 0xf5,0x4a,0x28,0x42,0x54,0x51,0xa4,0x22,0x28,0x66,0xcb,0xb3,0x7e,0xdb,0xbc, + 0xdd,0x60,0xe3,0xd0,0x38,0x5d,0xb9,0xef,0xfb,0x68,0x3e,0x6f,0x57,0xf5,0x6a, + 0x82,0x08,0x01,0x04,0x09,0xb0,0x82,0x7f,0x7f,0x7e,0xee,0xdb,0xfb,0x9d,0xab, + 0xd5,0xe5,0x73,0xf0,0xf4,0xfc,0x79,0xf2,0x86,0xd1,0x01,0xf5,0xca,0xff,0xff, + 0xff,0xff,0xff,0x3f,0x28,0x90,0xa4,0x92,0x10,0x24,0x08,0x42,0x80,0x40,0x20, + 0x08,0x25,0x82,0x4a,0xc4,0x10,0x51,0x85,0x54,0xf5,0x5a,0x24,0x42,0x24,0x41, + 0x90,0x92,0x02,0x25,0x08,0x20,0x44,0x01,0xa1,0x10,0x29,0x7a,0x89,0x22,0x88, + 0x28,0x10,0x31,0x44,0x08,0x20,0x02,0xf5,0x0a,0x81,0x10,0x11,0x14,0x25,0x44, + 0xa8,0x80,0xa2,0x0a,0x11,0xa8,0x08,0x4a,0x84,0x70,0x22,0x08,0x21,0x82,0x42, + 0x84,0x12,0xa2,0x8a,0x50,0xf5,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xf5,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xf4,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0}; diff --git a/TCLSpecs/bitmaps/prc.xbm b/TCLSpecs/bitmaps/prc.xbm new file mode 100644 index 0000000..e86d614 --- /dev/null +++ b/TCLSpecs/bitmaps/prc.xbm @@ -0,0 +1,101 @@ +#define prc_width 100 +#define prc_height 112 +static char prc_bits[] = { + 0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xb5,0x6a, + 0xad,0x55,0xfd,0xff,0xff,0xbf,0xaa,0x6a,0x6d,0x55,0xfd,0xff,0xff,0xff,0xff, + 0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd5,0xb6,0xb5,0xd5,0xff,0xff, + 0xff,0xff,0x6f,0xad,0xb5,0x6d,0xfb,0xbf,0xdf,0xdf,0xff,0xff,0xff,0x7f,0xff, + 0xff,0xff,0xff,0xbf,0xff,0xf6,0x75,0x7d,0xf5,0xff,0xff,0xf7,0xfb,0xff,0xd5, + 0xda,0xea,0xfd,0xbd,0xfe,0xef,0xff,0xff,0x7b,0xdf,0xae,0xff,0xff,0xff,0xbf, + 0xfe,0xef,0x57,0xbb,0xff,0xff,0xde,0xf5,0x75,0xfd,0xdb,0xb6,0xed,0xfb,0xbb, + 0xfd,0xef,0xff,0x57,0xab,0x2e,0x5b,0xf5,0xbf,0xff,0xdf,0xfe,0xee,0x57,0xfd, + 0x7f,0xab,0x6a,0x55,0xad,0xaa,0xff,0x6a,0xf5,0xfb,0x7b,0xfd,0xf7,0xff,0x75, + 0xad,0x6a,0xb5,0xa5,0xff,0xff,0x5f,0xff,0xde,0x57,0xfd,0x3f,0x95,0x55,0xab, + 0xd5,0xaa,0xfe,0x6f,0xfb,0xfd,0xb7,0xfd,0xff,0xaf,0x5a,0x55,0x55,0x55,0xab, + 0xfe,0xfb,0x6e,0xff,0xfb,0xaf,0xfe,0x5b,0x55,0x55,0x55,0x55,0xad,0xfa,0xbf, + 0xbb,0xfb,0xae,0xf5,0xff,0x6b,0x55,0x55,0xa9,0xaa,0x6a,0xf5,0xef,0xef,0xfd, + 0xfb,0xbf,0x7f,0xad,0x55,0x52,0x4a,0x55,0xb5,0xf6,0xbf,0xba,0xfe,0x6f,0xed, + 0xff,0x55,0xa5,0x4a,0xa5,0xaa,0x56,0xeb,0xff,0xef,0xfb,0xfb,0xf7,0x5f,0x5b, + 0x95,0x2a,0x29,0x55,0xd5,0xda,0xff,0xdd,0xfe,0xad,0xfd,0xbf,0x55,0x55,0x52, + 0xa5,0x54,0x55,0x6d,0xbf,0xbb,0xfb,0xff,0xef,0xef,0x56,0xaa,0x4a,0x95,0xaa, + 0xaa,0xb5,0xff,0xef,0xfe,0xd5,0xfa,0x5f,0x55,0x49,0xaa,0x54,0x55,0xb5,0xda, + 0xfe,0x7b,0xff,0xff,0xff,0xbf,0x55,0x55,0x55,0xaa,0xa4,0xaa,0x6d,0xff,0xaf, + 0xfb,0xd5,0xfa,0xef,0xaa,0xaa,0x24,0x45,0xaa,0xaa,0xd6,0xfe,0xfb,0xfe,0xff, + 0xff,0xbf,0xad,0x92,0xaa,0x28,0xa5,0xaa,0x7a,0xff,0xae,0xfb,0xda,0xfa,0xdf, + 0xaa,0x4a,0x45,0x55,0x29,0x55,0xd5,0xfe,0xfb,0xfe,0xf7,0xff,0x6f,0x55,0x55, + 0x28,0x82,0x94,0xaa,0xaa,0xff,0xaf,0xfb,0x7d,0xfd,0xbf,0x55,0x55,0x93,0x54, + 0x52,0xaa,0xf6,0xfe,0xff,0xfe,0xd7,0xff,0xdf,0xea,0x57,0x49,0x22,0xd5,0x75, + 0xab,0xff,0xb7,0xfb,0xfd,0xfd,0x6f,0xfd,0xff,0x2b,0x95,0x74,0xff,0x7d,0xff, + 0xef,0xff,0x6f,0xff,0xbf,0x6e,0x7f,0x95,0x40,0xda,0xff,0xaf,0xff,0xbf,0xfa, + 0xf5,0xfd,0x6f,0xff,0xef,0x5b,0x94,0xea,0xff,0x6f,0xff,0xef,0xff,0xbf,0xff, + 0xdf,0xba,0x7a,0xab,0x4a,0x74,0xbd,0xbf,0xff,0xff,0xfa,0xea,0xfd,0x6f,0xd7, + 0xaa,0x2a,0x21,0x95,0x67,0x7d,0xff,0xaf,0xff,0x7f,0xff,0xbf,0xad,0x5d,0xab, + 0x94,0xea,0xba,0xb6,0xff,0xf7,0xfb,0xda,0xfd,0xaf,0xf7,0xff,0x5d,0xaa,0x7a, + 0xdf,0xfb,0xfe,0xaf,0xfe,0x7d,0xff,0x6f,0x79,0xf7,0x6f,0x45,0xdf,0x77,0xad, + 0xff,0xff,0xfb,0xef,0xfb,0xdf,0xee,0x7f,0xbb,0x52,0xf7,0xfe,0xf7,0xff,0xaf, + 0xfe,0xf5,0xfe,0xaf,0xbe,0xbf,0xaf,0xaa,0xff,0xff,0xaf,0xfe,0xfb,0xfb,0xbf, + 0xff,0x77,0xfb,0xbe,0xf5,0xda,0xb6,0xff,0xdf,0xff,0xaf,0xfe,0xf5,0xf5,0xaf, + 0xbd,0x7f,0x5f,0xb7,0xdf,0xbe,0xaf,0xfe,0xfa,0xfb,0x7f,0xef,0xaf,0xd6,0xd4, + 0xb5,0xd9,0x75,0x6b,0x7b,0xff,0xaf,0xfe,0xd5,0xdf,0xb7,0x2a,0x6b,0xdf,0x6e, + 0xdf,0xad,0xad,0xbf,0xfa,0xfb,0x7e,0x6b,0x5f,0x55,0xbd,0xb5,0xaa,0xfb,0xb6, + 0xd6,0x7e,0x6f,0xff,0xeb,0xdd,0xaa,0xd5,0x52,0xd5,0x75,0xad,0xdb,0x5a,0xdb, + 0xbb,0xfb,0xff,0x6b,0xb7,0x6a,0x5f,0xad,0xae,0xf7,0x6e,0xab,0x76,0xed,0xfe, + 0x6a,0xaf,0x5d,0xb5,0x55,0x75,0xb3,0x95,0xb5,0x75,0xbb,0xbf,0xfb,0xff,0xbb, + 0xb6,0xda,0xaa,0xda,0xaa,0x5e,0xda,0xaa,0xd7,0xea,0xfe,0xdb,0xae,0xdb,0x4a, + 0x55,0xad,0xaa,0xb6,0xaa,0xaa,0x6e,0xbf,0xfb,0xf6,0xdb,0x56,0x55,0x8a,0x56, + 0xa5,0x7a,0x51,0x55,0xad,0xeb,0xfe,0xbf,0xbf,0x5b,0x55,0x51,0x55,0xa9,0xca, + 0xaa,0x6a,0xff,0xfe,0xfb,0xf5,0xd5,0x6f,0xab,0x8a,0xeb,0xa6,0xbf,0x45,0xad, + 0x5a,0x57,0xff,0xdf,0xff,0x5a,0x55,0x68,0xfd,0xfb,0x7f,0x93,0x6a,0xef,0xfb, + 0xfd,0x7b,0xb5,0x6e,0x95,0xaa,0xfe,0xef,0xdf,0x4d,0x52,0xbb,0xae,0xff,0xfe, + 0xdf,0xba,0x25,0x69,0xff,0xff,0xff,0x26,0xea,0xed,0xfb,0xfa,0x6b,0x75,0x5d, + 0x95,0xb4,0xff,0xff,0xff,0x5f,0xa9,0xd6,0xde,0xff,0xff,0x7f,0x6b,0x55,0xea, + 0xff,0xff,0xff,0x4f,0x6a,0xfb,0xfb,0xfd,0xb6,0xda,0xbd,0x2b,0xfd,0xff,0xff, + 0xff,0x7f,0xd5,0x6d,0x5f,0xff,0xdf,0xff,0xd6,0x94,0xfe,0xff,0xff,0xff,0xbf, + 0x6a,0xfb,0xf5,0xfb,0xf5,0xda,0x7d,0xab,0xfe,0xff,0xff,0xff,0xff,0xb4,0xbf, + 0xdf,0xfe,0x5f,0x7f,0xd7,0xaa,0xff,0xff,0xff,0xff,0xff,0xd6,0xfa,0xfb,0xff, + 0xfb,0xf7,0x7f,0xd5,0xff,0xff,0xff,0xff,0xff,0xe9,0xef,0x5e,0xfb,0x5f,0xbd, + 0xed,0xd5,0xff,0xff,0xff,0xff,0xff,0x5a,0xbf,0xf7,0xff,0xf6,0xef,0xbe,0xd6, + 0xff,0x7f,0x55,0xfd,0xff,0xea,0xfd,0xdf,0xfe,0xdf,0xfe,0x6b,0xd3,0xff,0xaa, + 0xb7,0xb7,0xff,0xb6,0xff,0xfa,0xff,0xfb,0x6b,0xff,0xda,0x5f,0xb7,0xd4,0xea, + 0x7e,0xea,0xdb,0x6f,0xfb,0x5f,0xff,0xad,0xd7,0xbf,0xfd,0xff,0xff,0xff,0xfd, + 0x7e,0xff,0xff,0xfb,0xd7,0xff,0xa9,0xd7,0xfe,0xff,0x5f,0x7d,0xd5,0xf7,0xbb, + 0xfd,0x6e,0xfb,0xb6,0xd6,0x6f,0xff,0xff,0xff,0x7e,0x7b,0xff,0xef,0xff,0xfb, + 0xaf,0xfb,0xdf,0xbf,0xfe,0xff,0xbf,0xfe,0xee,0xdd,0x7e,0xff,0x5f,0xfb,0xdf, + 0xea,0xbf,0xff,0xff,0xdf,0x7e,0xfb,0xfb,0xfb,0xfd,0xf7,0xdf,0xf6,0xbf,0xff, + 0xfe,0xff,0xaf,0xff,0xdd,0xff,0xdf,0xff,0xdf,0xf6,0xff,0xab,0xff,0xff,0xff, + 0xff,0x7f,0xff,0xbf,0xfd,0xfe,0xfb,0xbb,0xdb,0xfe,0xfe,0xfe,0xff,0xef,0xff, + 0xee,0xf6,0xef,0xff,0xdf,0xef,0xff,0xaf,0xff,0xff,0xff,0xff,0xff,0xf7,0xff, + 0xbe,0xfb,0xfd,0xfd,0xf6,0xfb,0xff,0xff,0xff,0xff,0x7f,0x5f,0xf7,0xfb,0xff, + 0xb7,0xd7,0xff,0xae,0xfe,0xff,0xff,0xff,0xff,0xbb,0xde,0xef,0xfe,0xff,0xff, + 0x9b,0xfa,0xff,0xff,0xff,0xff,0xbf,0xbd,0x7e,0xff,0xff,0xdb,0xf6,0x4f,0xef, + 0xfe,0xff,0xff,0xff,0xff,0xff,0xfa,0xbb,0xfd,0xfe,0xdf,0xe2,0xb7,0xff,0xff, + 0xff,0xff,0x5f,0xf5,0xfc,0xff,0xff,0xef,0x7b,0xf9,0xf7,0xfe,0xff,0xff,0xff, + 0xff,0xfd,0xd9,0xdd,0xff,0xbd,0x3f,0xfe,0xab,0xfd,0xff,0xff,0xff,0x6f,0xfb, + 0xf8,0xf7,0xfd,0xff,0x9d,0xff,0xff,0xfb,0xff,0xff,0xff,0xbb,0xfd,0xf9,0xbf, + 0xff,0xed,0xcf,0xff,0x57,0xef,0xff,0xff,0xff,0xef,0xf6,0x70,0xff,0xff,0xff, + 0xdd,0xff,0xaf,0xbd,0xff,0xff,0x7f,0x5b,0xfb,0xfa,0xdb,0xfd,0xb7,0xcf,0xff, + 0xf7,0x76,0xdd,0xff,0xd7,0x6e,0xfd,0xd0,0xff,0xff,0xfe,0xcb,0xff,0x5b,0xef, + 0xb6,0xd4,0x7a,0xb7,0xfe,0x01,0xfa,0xfe,0xff,0x8e,0xff,0xaf,0xba,0xdb,0x56, + 0xd5,0xda,0x7b,0x84,0xd0,0xff,0xed,0xa7,0xff,0x7b,0xdb,0xaa,0xaa,0xae,0x55, + 0x3f,0x10,0x82,0xfe,0xff,0x8b,0xff,0xaf,0x6d,0x55,0xd5,0x6a,0xab,0xbf,0x40, + 0x10,0xf8,0xf7,0x0a,0xfe,0xbf,0xb6,0xb7,0x55,0x55,0xd5,0x1f,0x02,0x40,0xf2, + 0x7e,0x41,0xfe,0xdb,0xda,0x54,0xaa,0xaa,0xfa,0x0f,0x20,0x05,0xf0,0x17,0x00, + 0xfc,0x7f,0x6b,0x55,0x55,0x55,0xd5,0x01,0x04,0x10,0xf2,0x47,0x12,0xfc,0xdf, + 0xaa,0x56,0xa9,0xaa,0xfe,0x00,0x20,0x81,0xf0,0x00,0x80,0xf8,0xff,0xd7,0x52, + 0xa5,0xaa,0x7d,0x22,0x01,0x08,0xf2,0x00,0x08,0xf0,0x7f,0xad,0xaa,0x2a,0x55, + 0x2f,0x00,0x24,0x02,0xf0,0x24,0x21,0xf0,0xff,0x57,0x15,0x49,0xe9,0x0f,0x00, + 0x00,0x48,0xf0,0x00,0x00,0xe1,0xff,0x7d,0xa5,0x24,0xf6,0x03,0x42,0x90,0x00, + 0xf2,0x92,0x08,0xa0,0xff,0xaf,0x12,0x49,0x7d,0x01,0x00,0x02,0x04,0xf0,0x00, + 0x42,0x80,0xff,0xff,0xaa,0x24,0x57,0x40,0x08,0x08,0x90,0xf0,0x08,0x08,0x04, + 0xff,0xb7,0x4a,0xd2,0x00,0x09,0x20,0x80,0x00,0xf2,0x40,0x40,0x01,0xfe,0xff, + 0x55,0xa9,0x40,0x02,0x00,0x11,0x02,0xf0,0x02,0x01,0x10,0xfc,0x7f,0xaf,0x6a, + 0x28,0x50,0x02,0x00,0x48,0xf0,0x08,0x24,0x42,0xe4,0xff,0x5d,0x3b,0x82,0x00, + 0x08,0x42,0x00,0xf2,0x20,0x80,0x00,0x8a,0xfe,0xff,0x7d,0x00,0x52,0x40,0x08, + 0x20,0xf0,0x01,0x01,0x08,0x34,0xfc,0xff,0x3f,0x00,0x48,0x00,0x20,0x82,0xf0, + 0x08,0x10,0x82,0xf4,0xf1,0xfe,0x3f,0x49,0x20,0x84,0x00,0x00,0xf2,0x40,0x42, + 0x10,0xe0,0xd3,0x60,0x7f,0x00,0x52,0x10,0x82,0x08,0xf0,0x02,0x00,0x42,0x84, + 0x87,0xc1,0xff,0x25,0x00,0x00,0x08,0x20,0xf0,0x48,0x08,0x10,0x00,0x0a,0x80, + 0xff,0x81,0x28,0x01,0x20,0x00,0xf2,0x00,0x21,0x81,0x10,0x24,0x84,0xff,0x07, + 0x00,0x48,0x00,0x42,0xf0,0x00,0x00,0x10,0x00,0x10,0x00,0xfe,0x07,0x92,0x01, + 0x81,0x00,0xf1,0x24,0x09,0x40,0x42,0x48,0x00,0xfc,0x27,0x88,0x05,0x08,0x08, + 0xf0}; diff --git a/TCLSpecs/bitmaps/prcFunny.xbm b/TCLSpecs/bitmaps/prcFunny.xbm new file mode 100644 index 0000000..31e09c2 --- /dev/null +++ b/TCLSpecs/bitmaps/prcFunny.xbm @@ -0,0 +1,60 @@ +#define prcFunny_width 100 +#define prcFunny_height 65 +static char prcFunny_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xf0,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0x07,0xf0,0x00,0xa8,0xea,0x7d,0xef,0x7f,0xfb,0xdb,0xb5,0x5e,0x55,0x05, + 0xf0,0x00,0xfc,0xff,0xf7,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0x07,0xf0,0x00, + 0x58,0xd5,0x5f,0x5f,0xf7,0xff,0xdb,0xbb,0x7f,0x55,0x05,0xf0,0x00,0xf4,0x7f, + 0x01,0x39,0x76,0xbc,0x91,0x13,0xe3,0xff,0x07,0xf0,0x00,0xbc,0xed,0x01,0x39, + 0x76,0xb2,0x11,0x12,0xe3,0x6d,0x05,0xf0,0x00,0xd8,0xfb,0x00,0x00,0xf6,0xb3, + 0x0d,0x62,0x83,0xdf,0x07,0xf0,0x00,0xec,0xfe,0x00,0x00,0x80,0x0f,0x0c,0x00, + 0x83,0x77,0x05,0xf0,0x00,0x7c,0x1f,0x00,0x00,0x80,0x0f,0xe0,0x0f,0x00,0xdf, + 0x07,0xf0,0x00,0xd4,0x03,0x00,0xff,0x07,0x02,0x1e,0xf0,0x00,0x7f,0x05,0xf0, + 0x00,0x7c,0x03,0xf8,0x00,0x78,0xc0,0x01,0x00,0x03,0xec,0x07,0xf0,0x00,0xd4, + 0x03,0x1f,0x00,0x80,0x73,0x00,0x00,0x04,0x7c,0x05,0xf0,0x00,0xfc,0x03,0x00, + 0x00,0x00,0x3e,0x00,0x00,0x18,0xd8,0x07,0xf0,0x00,0xa8,0x00,0xc0,0xff,0x3f, + 0x8e,0xff,0x7f,0x60,0x78,0x05,0xf0,0x00,0xfc,0x00,0x20,0x00,0x70,0x40,0x00, + 0x80,0x00,0xe0,0x07,0xf0,0x00,0xd8,0x00,0x1e,0x00,0xc0,0x31,0x00,0x00,0x07, + 0x40,0x05,0xf0,0x00,0xec,0x00,0x07,0x00,0x00,0x0e,0x00,0x08,0x1c,0xe0,0x07, + 0xf0,0x00,0xfc,0x00,0x01,0x00,0x00,0x02,0x00,0x00,0x78,0x60,0x05,0xf0,0x00, + 0xe4,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x07,0xf0,0x00,0x64,0xe4, + 0x80,0x02,0x08,0x10,0x00,0x00,0x80,0x23,0x04,0xf0,0x00,0x64,0x24,0x00,0x00, + 0x00,0x00,0x00,0x00,0x80,0x20,0x04,0xf0,0x00,0x60,0x38,0x00,0x00,0x00,0x10, + 0x04,0x00,0x80,0x20,0x04,0xf0,0x00,0x60,0x38,0x00,0x00,0x00,0x02,0x00,0x00, + 0x80,0x20,0x04,0xf0,0x00,0x60,0x18,0x08,0x00,0x00,0x00,0x04,0x00,0x81,0x00, + 0x04,0xf0,0x00,0x60,0x18,0x00,0x00,0x3f,0x04,0x00,0x20,0x00,0xc0,0x04,0xf0, + 0x00,0x64,0x18,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0xc3,0x04,0xf0,0x00,0x64, + 0x18,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0xc3,0x04,0xf0,0x00,0xe4,0x18,0x00, + 0x00,0x0e,0x80,0x03,0x00,0x00,0xc3,0x07,0xf0,0x00,0xfc,0x38,0x00,0x00,0x00, + 0xc0,0x0f,0x00,0x80,0xc3,0x07,0xf0,0x00,0xfc,0x23,0x00,0x00,0x00,0xc0,0x0f, + 0x00,0x80,0x00,0x05,0xf0,0x00,0xa8,0xe3,0x80,0x00,0x00,0x80,0x03,0x00,0x80, + 0x00,0x07,0xf0,0x00,0xfc,0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05, + 0xf0,0x00,0xac,0x03,0x40,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x06,0xf0,0x00, + 0xf8,0x03,0x01,0x00,0x02,0x02,0x00,0x00,0x78,0xc0,0x07,0xf0,0x00,0xac,0x03, + 0x07,0x00,0x00,0x0e,0x80,0x00,0x1c,0x60,0x03,0xf0,0x00,0xfc,0x03,0x20,0x00, + 0x72,0x40,0x00,0x80,0x00,0xc0,0x06,0xf0,0x00,0xa8,0x03,0xc0,0xff,0x3f,0x80, + 0x7f,0x7f,0x00,0xc0,0x07,0xf0,0x00,0xfc,0x03,0x00,0x00,0x80,0x31,0x00,0x00, + 0x00,0x40,0x05,0xf0,0x00,0x58,0x03,0x00,0x00,0x80,0x31,0x00,0x00,0x00,0xc0, + 0x07,0xf0,0x00,0xf4,0x03,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x40,0x05,0xf0, + 0x00,0xbc,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x07,0xf0,0x00,0xd8, + 0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x05,0xf0,0x00,0x74,0x1d,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x07,0xf0,0x00,0xdc,0x37,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x60,0x05,0xf0,0x00,0x78,0xfd,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xe0,0x07,0xf0,0x00,0xdc,0xd7,0x00,0x07,0x81,0x03,0x10,0x00,0x00, + 0x40,0x05,0xf0,0x00,0xf4,0xfd,0xc0,0xf8,0xff,0x3f,0xfe,0x0f,0x00,0xfc,0x07, + 0xf0,0x00,0x5c,0xaf,0x00,0x00,0x70,0xc0,0xed,0x0f,0x00,0x6c,0x05,0xf0,0x00, + 0xf4,0xf5,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x07,0xf0,0x00,0x5c,0xbf, + 0x1e,0x00,0x00,0x00,0x00,0x00,0x80,0x77,0x05,0xf0,0x00,0xf4,0xd6,0x3b,0x00, + 0x00,0x00,0x00,0x00,0x80,0xdd,0x07,0xf0,0x00,0xdc,0xfd,0xfe,0x01,0x00,0x00, + 0x00,0x80,0xff,0x77,0x05,0xf0,0x00,0xb8,0xb7,0xd7,0x0f,0x00,0x00,0x00,0xf0, + 0xaf,0xde,0x07,0xf0,0x00,0xec,0xee,0x7a,0xff,0xff,0xff,0x9f,0xff,0xfb,0x7b, + 0x05,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xf0}; diff --git a/TestAllNext b/TestAllNext new file mode 100755 index 0000000..c20dfec --- /dev/null +++ b/TestAllNext @@ -0,0 +1,65 @@ +testMono Plucked scores/duelingb.ski +sndplay test.snd +mv test.snd Plucked.snd + +testMono Mandolin scores/mandtune.ski +sndplay test.snd +mv test.snd MandTune.snd +testMono Mandolin scores/funicula.ski +sndplay test.snd +mv test.snd MandSolo.snd + + +testMono Clarinet scores/simplgft.ski +sndplay test.snd +mv test.snd Clarinet.snd +testMono Flute scores/simplgft.ski +sndplay test.snd +mv test.snd Flute.snd +testMono Brass scores/pictures.ski +sndplay test.snd +mv test.snd Brass.snd +testMono Bowed scores/fiddle.ski +sndplay test.snd +mv test.snd Bowed.snd + +testMono Marimba scores/spain.ski +sndplay test.snd +mv test.snd Marimba.snd +testMono Vibraphn scores/spain.ski +sndplay test.snd +mv test.snd Vibraphn.snd +testMono AgogoBel scores/morazbel.ski +sndplay test.snd +mv test.snd AgogoBel.snd + +testMono Rhodey scores/doogie.ski +sndplay test.snd +mv test.snd Rhodey.snd +testMono Wurley scores/riderson.ski +sndplay test.snd +mv test.snd Wurley.snd +testMono TubeBell scores/tubebell.ski +sndplay test.snd +mv test.snd TubeBell.snd +testMono PercFlut scores/misacrio.ski +sndplay test.snd +mv test.snd PercFlut.snd +testMono HeavyMtl scores/streetsf.ski +sndplay test.snd +mv test.snd HeavyMtl.snd +testMult 0.33 BeeThree scores/organs.ski +sndplay test.snd +mv test.snd BeeThree.snd + +testMono Moog1 scores/thecars.ski +sndplay test.snd +mv test.snd Moog1.snd + +Lacrymosa +mv test.snd Vocaliz.snd + +DrumSynt +sndplay test.snd +mv test.snd DrumSynt.snd + diff --git a/TestAllSGIRT b/TestAllSGIRT new file mode 100755 index 0000000..6565e4d --- /dev/null +++ b/TestAllSGIRT @@ -0,0 +1,30 @@ +testMono Plucked scores/duelingb.ski +testMult 1.0 Mandolin scores/mandtune.ski +testMono Mandolin scores/funicula.ski + +testMono Clarinet scores/simplgft.ski +testMono Flute scores/simplgft.ski +testMono Brass scores/pictures.ski +testMono Bowed scores/fiddle.ski + +testMono Marimba scores/spain.ski +testMono Vibraphn scores/spain.ski +testMono AgogoBel scores/morazbel.ski + +testMono Rhodey scores/doogie.ski +testMono Wurley scores/riderson.ski +testMono TubeBell scores/tubebell.ski +testMono PercFlut scores/misacrio.ski +testMono HeavyMtl scores/streetsf.ski +testMono BeeThree scores/bookert.ski +testMult 0.33 BeeThree scores/organs.ski + +testMono Moog1 scores/thecars.ski + +testMono FMVoices scores/lacrymos.ski +testMono VoicForm scores/lacrymos.ski + +Vocaliz +Lacrymosa + +DrumSynt diff --git a/ToDo.txt b/ToDo.txt new file mode 100644 index 0000000..304926c --- /dev/null +++ b/ToDo.txt @@ -0,0 +1,116 @@ +Need to iron out the differences between RawWvIn, NIWave1S, NIFileIn, etc. +Need to make DrumSyn1 vs. DrumSyn2 + One real-time large memory, one non real-time small memory +***************************************************** +Legend: + +x = done <1 - 9> = How Good? : = by Inheritance N = Not Applicable +Ex = Exists +Cm = Compiles +On = Note On +Of = Note Off +Pt = Pitch (5 octave range) +Vl = Velocity (0-128) +Bn = Pitch Bend +Md = Mod Wheel +C1 = Controller 1, Algorithm Specific +C2 = Controller 2, Algorithm Specific +Lg = Long/Int/Double verification +Op = Optimization pass 1 +Com. = Comments + +FILE/CLASS Ex Cm On Of Pt Vl Bn Md C1 C2 C3 Lg Op Com + +README.TXT x N N N N N N N N N N N N + +OBJECT.H x x N N N N N N N N N x N + +FILTER.H x x N N N N N N N N N x N + +ONEPOLE.H x x N N N N N N N N N x +ONEZERO.H x x N N N N N N N N N x +DCBLOCK.H x x N N N N N N N N N x +BIQUAD.H x x N N N N N N N N N x +TWOZERO.H x x N N N N N N N N N x +TWOPOLE.H x x N N N N N N N N N x +ALLPASS1.H + +FORMSWEP.H x x N N N N N N N N N x + +DLINEA.H x x N N N N N N N N N x +DLINEL.H x x N N N N N N N N N x +DLINEN.H x x N N N N N N N N N x + +RAWWAVE.H x x N N N N N N N N N x +RAWLOOP.H x x N N N N N N N N N x +NIWAVE1S.H +SINGWAVE.H x x N N N N N N N N N x +RAWWVOUT.H x x N N N N N N N N N x +RAWWVIN.H x x N N N N N N N N N x + +REEDTABL.H x x N N N N N N N N N x +JETTABL.H x x N N N N N N N N N x +LIPFILT.H x x N N N N N N N N N x Add Lip Tension Modulation? +BOWTABL.H x x N N N N N N N N N x + +ENVELOPE.H x x N N N N N N N N N x +ADSR.H x x N N N N N N N N N x +NOISE.H x x N N N N N N N N N x +SUBNOISE.H x x N N N N N N N N N x Noise each n samples + +FILE/CLASS Ex Cm On Of Pt Vl Bn Md C1 C2 C3 Lg Op Com + +PLUCKED.H x x x x 7 8 N N N N x tuning funny, allpass approx. +CLARINET.H x x x x 7 5 7 7 7 7 x +FLUTE.H x x x x 7 5 7 7 7 7 x +BRASS.H x x x x 7 5 7 7 7 7 x +BOWED.H x x x x 7 5 7 7 7 7 x Need Better Body Filter + +PLUCKED2.H x x N x N N N N N N x +MANDOLIN.H x x x : 8 8 9 9 9 9 x tuning funny, allpass approx. + +MODAL4.H x x N x N N 7 N N N x +MARIMBA.H x x x : 7 x : 7 7 7 x Check 4 Clipping Mid Range +VIBRAPHN.H x x x : x x : 7 7 7 x AMDept StickHard Pos AMFreq +AGOGOBEL.H x x x : x x : 7 7 7 x StickHard Position + +FM4OP.H x x N x N N N N N x 9 x + +FM4ALG8.H x x N : N N N 9 9 | x +BEETHREE.H x x x : x x 9 : : : x + +FM4ALG5.H x x N : N N N 9 9 : x +RHODEY.H x x x : 8 x 9 : : : x Minor Aliasing High Range +WURLEY.H x x x : 8 x 9 : : : x " " " " +TUBEBELL.H x x x : x x 9 : : : x + +FM4ALG4.H x x N : N N N 9 9 : x +PERCFLUT.H x x x : 8 x 9 : : : x Minor Aliasing High Range + +FM4ALG3.H x x N : N N N 9 9 : x +HEAVYMTL.H x x x : x x 9 : : : x Minor Aliasing High Range + +SAMPLER.H x x N x N +SAMPLFLT.H x x N : N +MOOG1.H x x x : x x + +VOICFORM.H x x ? ? ? ? ? ? ? ? ? x Need much phoneme!! + +DRUMSYNT.H x x x N x N N N N N x Need New Drum Samples + +FILE/CLASS Ex Cm On Of Pt Vl Bn Md C1 C2 C3 Lg Op Com + +Legend: +Es = Exists +Cm = Compiles +On = Note On +Of = Note Off +Pt = Pitch (5 octave range) +Vl = Velocity (0-128) +Bn = Pitch Bend +Md = Mod Wheel +C1 = Controller 1, Algorithm Specific +C2 = Controller 2, Algorithm Specific +Lg = Long/Int/Double verification +Op = Optimization pass 1 +Com. = Comments diff --git a/TubeBell.cpp b/TubeBell.cpp new file mode 100644 index 0000000..aaf1cce --- /dev/null +++ b/TubeBell.cpp @@ -0,0 +1,53 @@ +/******************************************/ +/* Tubular Bell (Orch. Chime) Subclass */ +/* of Algorithm 5 (TX81Z) Subclass of */ +/* 4 Operator FM Synth */ +/* by Perry R. Cook, 1995-96 */ +/******************************************/ + +#include "TubeBell.h" + +TubeBell :: TubeBell() : FM4Alg5() +{ + this->loadWaves("rawwaves/sinewave.raw", + "rawwaves/sinewave.raw", + "rawwaves/sinewave.raw", + "rawwaves/sinewave.raw"); + + this->setRatio(0,1.0 * 0.995); + this->setRatio(1,1.414 * 0.995); + this->setRatio(2,1.0 * 1.005); + this->setRatio(3,1.414 ); + gains[0] = __FM4Op_gains[94]; + gains[1] = __FM4Op_gains[76]; + gains[2] = __FM4Op_gains[99]; + gains[3] = __FM4Op_gains[71]; + adsr[0]->setAll(0.03,0.00001,0.0,0.02); + adsr[1]->setAll(0.03,0.00001,0.0,0.02); + adsr[2]->setAll(0.07,0.00002,0.0,0.02); + adsr[3]->setAll(0.04,0.00001,0.0,0.02); + twozero->setGain(0.5); + vibWave->setFreq(2.0); +} + +void TubeBell :: setFreq(MY_FLOAT frequency) +{ + baseFreq = frequency; + waves[0]->setFreq(baseFreq * ratios[0]); + waves[1]->setFreq(baseFreq * ratios[1]); + waves[2]->setFreq(baseFreq * ratios[2]); + waves[3]->setFreq(baseFreq * ratios[3]); +} + +void TubeBell :: noteOn(MY_FLOAT freq, MY_FLOAT amp) +{ + gains[0] = amp * __FM4Op_gains[94]; + gains[1] = amp * __FM4Op_gains[76]; + gains[2] = amp * __FM4Op_gains[99]; + gains[3] = amp * __FM4Op_gains[71]; + this->setFreq(freq); + this->keyOn(); +#if defined(_debug_) + printf("TubeBell : NoteOn: Freq=%lf Amp=%lf\n",freq,amp); +#endif +} diff --git a/TubeBell.h b/TubeBell.h new file mode 100644 index 0000000..aacb484 --- /dev/null +++ b/TubeBell.h @@ -0,0 +1,21 @@ +/******************************************/ +/* Tubular Bell (Orch. Chime) Subclass */ +/* of Algorithm 5 (TX81Z) Subclass of */ +/* 4 Operator FM Synth */ +/* by Perry R. Cook, 1995-96 */ +/******************************************/ + +#if !defined(__TubeBell_h) +#define __TubeBell_h + +#include "FM4Alg5.h" + +class TubeBell : public FM4Alg5 +{ + public: + TubeBell(); + virtual void setFreq(MY_FLOAT frequency); + virtual void noteOn(MY_FLOAT freq, MY_FLOAT amp); +}; + +#endif diff --git a/TwoPole.cpp b/TwoPole.cpp new file mode 100644 index 0000000..362fd5f --- /dev/null +++ b/TwoPole.cpp @@ -0,0 +1,61 @@ +/*******************************************/ +/* Two Pole Filter Class, */ +/* by Perry R. Cook, 1995-96 */ +/* See books on filters to understand */ +/* more about how this works. Nothing */ +/* out of the ordinary in this version. */ +/*******************************************/ + +#include "TwoPole.h" + +TwoPole :: TwoPole() : Filter() +{ + outputs = (MY_FLOAT *) malloc(2 * MY_FLOAT_SIZE); + poleCoeffs[0] = 0.0; + poleCoeffs[1] = 0.0; + gain = 1.0; + this->clear(); +} + +TwoPole :: ~TwoPole() +{ +// free(inputs); + free(outputs); +} + +void TwoPole :: clear() +{ + outputs[0] = 0.0; + outputs[1] = 0.0; + lastOutput = 0.0; +} + +void TwoPole :: setPoleCoeffs(MY_FLOAT *coeffs) +{ + poleCoeffs[0] = coeffs[0]; + poleCoeffs[1] = coeffs[1]; +} + +void TwoPole :: setFreqAndReson(MY_FLOAT freq, MY_FLOAT reson) +{ + poleCoeffs[1] = - (reson * reson); + poleCoeffs[0] = 2.0 * reson * cos(TWO_PI * freq / SRATE); +} + +void TwoPole :: setGain(MY_FLOAT aValue) +{ + gain = aValue; +} + +MY_FLOAT TwoPole :: tick(MY_FLOAT sample) /* Perform Filter Operation */ +{ /* TwoPole is a two pole filter (duh!) */ + MY_FLOAT temp; /* Look it up in your favorite DSP text */ + temp = sample * gain; + temp += poleCoeffs[0] * outputs[0]; + temp += poleCoeffs[1] * outputs[1]; + outputs[1] = outputs[0]; + outputs[0] = temp; + lastOutput = outputs[0]; + return lastOutput; +} + diff --git a/TwoPole.h b/TwoPole.h new file mode 100644 index 0000000..007090e --- /dev/null +++ b/TwoPole.h @@ -0,0 +1,28 @@ +/*******************************************/ +/* Two Pole Filter Class, */ +/* by Perry R. Cook, 1995-96 */ +/* See books on filters to understand */ +/* more about how this works. Nothing */ +/* out of the ordinary in this version. */ +/*******************************************/ + +#if !defined(__TwoPole_h) +#define __TwoPole_h + +#include "Filter.h" + +class TwoPole : public Filter +{ + protected: + MY_FLOAT poleCoeffs[2]; + public: + TwoPole(); + ~TwoPole(); + void clear(); + void setPoleCoeffs(MY_FLOAT *coeffs); + void setGain(MY_FLOAT aValue); + void setFreqAndReson(MY_FLOAT freq, MY_FLOAT reson); + MY_FLOAT tick(MY_FLOAT sample); +}; + +#endif diff --git a/TwoZero.cpp b/TwoZero.cpp new file mode 100644 index 0000000..9c4ad5d --- /dev/null +++ b/TwoZero.cpp @@ -0,0 +1,53 @@ +/*******************************************/ +/* Two Zero Filter Class, */ +/* by Perry R. Cook, 1995-96 */ +/* See books on filters to understand */ +/* more about how this works. Nothing */ +/* out of the ordinary in this version. */ +/*******************************************/ + +#include "TwoZero.h" + +TwoZero :: TwoZero() : Filter() +{ + inputs = (MY_FLOAT *) malloc(2 * MY_FLOAT_SIZE); + zeroCoeffs[0] = 0.0; + zeroCoeffs[1] = 0.0; + gain = 1.0; + this->clear(); +} + +TwoZero :: ~TwoZero() +{ + free(inputs); +} + +void TwoZero :: clear() +{ + inputs[0] = 0.0; + inputs[1] = 0.0; + lastOutput = 0.0; +} + +void TwoZero :: setZeroCoeffs(MY_FLOAT *coeffs) +{ + zeroCoeffs[0] = coeffs[0]; + zeroCoeffs[1] = coeffs[1]; +} + +void TwoZero :: setGain(MY_FLOAT aValue) +{ + gain = aValue; +} + +MY_FLOAT TwoZero :: tick(MY_FLOAT sample) /* Perform Filter Operation */ +{ /* TwoZero is a two zero filter (duh!) */ + /* Look it up in your favorite DSP text */ + lastOutput = zeroCoeffs[0] * inputs[0]; + lastOutput += zeroCoeffs[1] * inputs[1]; + inputs[1] = inputs[0]; + inputs[0] = gain * sample; + lastOutput += inputs[0]; + return lastOutput; +} + diff --git a/TwoZero.h b/TwoZero.h new file mode 100644 index 0000000..d68adf8 --- /dev/null +++ b/TwoZero.h @@ -0,0 +1,27 @@ +/*******************************************/ +/* Two Zero Filter Class, */ +/* by Perry R. Cook, 1995-96 */ +/* See books on filters to understand */ +/* more about how this works. Nothing */ +/* out of the ordinary in this version. */ +/*******************************************/ + +#if !defined(__TwoZero_h) +#define __TwoZero_h + +#include "Filter.h" + +class TwoZero : public Filter +{ + protected: + MY_FLOAT zeroCoeffs[2]; + public: + TwoZero(); + ~TwoZero(); + void clear(); + void setZeroCoeffs(MY_FLOAT *coeffs); + void setGain(MY_FLOAT aValue); + MY_FLOAT tick(MY_FLOAT sample); +}; + +#endif diff --git a/Vibraphn.cpp b/Vibraphn.cpp new file mode 100644 index 0000000..f6a922f --- /dev/null +++ b/Vibraphn.cpp @@ -0,0 +1,75 @@ +/*******************************************/ +/* Vibraphone SubClass of Modal4 */ +/* Instrument, by Perry R. Cook, 1995-96 */ +/* */ +/* Controls: CONTROL1 = stickHardness */ +/* CONTROL2 = strikePosition*/ +/* CONTROL3 = vibFreq */ +/* MOD_WHEEL= vibAmt */ +/*******************************************/ + +#include "Vibraphn.h" + +Vibraphn :: Vibraphn() : Modal4() +{ + wave = new RawWave("rawwaves/marmstk1.raw"); + wave->normalize(); + wave->setRate(13.33); + vibr->setFreq(4.0); + onepole->setPole(0.2); + this->setRatioAndReson(0, 1.0,0.99995); /* Set */ + this->setRatioAndReson(1, 2.01,0.99991); /* our */ + this->setRatioAndReson(2, 3.9,0.99992); /* resonance */ + this->setRatioAndReson(3,14.37,0.99990); /* values here */ + this->setFiltGain(0,0.025); + this->setFiltGain(1,0.015); + this->setFiltGain(2,0.015); + this->setFiltGain(3,0.015); + masterGain = 1.0; + directGain = 0.0; + vibrGain = 0.2; +} + +Vibraphn :: ~Vibraphn() +{ +} + +void Vibraphn :: setStickHardness(MY_FLOAT hardness) +{ + wave->setRate(2.0 + (22.66 * hardness)); + masterGain = 0.2 + (hardness * 1.6); +} + +void Vibraphn :: setStrikePosition(MY_FLOAT position) +{ + MY_FLOAT temp,temp2; + temp2 = position * PI; + strikePosition = position; /* Hack only first three modes */ + temp = sin(strikePosition * PI); + this->setFiltGain(0,0.025 * temp); + temp = sin(0.1 + (2.01 * temp2)); + this->setFiltGain(1,0.015 * temp); + temp = sin(3.95 * temp2); + this->setFiltGain(2,0.015 * temp); +} + +void Vibraphn :: controlChange(int number, MY_FLOAT value) +{ +#if defined(_debug_) + printf("Vibraphn : ControlChange: Number=%i Value=%f\n",number,value); +#endif + if (number == MIDI_control1) + this->setStickHardness(value * NORM_7); + else if (number == MIDI_control2) + this->setStrikePosition(value * NORM_7); + else if (number == MIDI_control3) + vibr->setFreq((value * NORM_7 * 12.0)); + else if (number == MIDI_mod_wheel) + vibrGain = (value * NORM_7); + else if (number == MIDI_after_touch) + this->strike(value * NORM_7); + else { + printf("Vibraphn : Undefined Control Number!!\n"); + } +} + diff --git a/Vibraphn.h b/Vibraphn.h new file mode 100644 index 0000000..ebef735 --- /dev/null +++ b/Vibraphn.h @@ -0,0 +1,27 @@ +/*******************************************/ +/* Vibraphone SubClass of Modal4 */ +/* Instrument, by Perry R. Cook, 1995-96 */ +/* */ +/* Controls: CONTROL1 = stickHardness */ +/* CONTROL2 = strikePosition*/ +/* CONTROL3 = vibFreq */ +/* MOD_WHEEL= vibAmt */ +/*******************************************/ + +#if !defined(__Vibraphn_h) +#define __Vibraphn_h + +#include "Modal4.h" + +class Vibraphn : public Modal4 +{ + protected: + public: + Vibraphn(); + ~Vibraphn(); + void setStickHardness(MY_FLOAT hardness); + void setStrikePosition(MY_FLOAT position); + virtual void controlChange(int number, MY_FLOAT value); +}; + +#endif diff --git a/Vocaliz b/Vocaliz new file mode 100755 index 0000000..5c04c5d --- /dev/null +++ b/Vocaliz @@ -0,0 +1 @@ +time textVoic =100.00 eee ahh .... eee + + + + ahh .... eee + + + ahh . eee - - ahh . eee - ahh . eee - - ahh . eee - - ahh ..... =150.0 ...... =200.0 ...... diff --git a/VoicForm.cpp b/VoicForm.cpp new file mode 100644 index 0000000..daa7911 --- /dev/null +++ b/VoicForm.cpp @@ -0,0 +1,228 @@ +/*******************************************/ +/* 4 Formant Synthesis Instrument */ +/* by Perry R. Cook, 1995-96 */ +/* This instrument contains an excitation */ +/* singing wavetable (looping wave with */ +/* random and periodic vibrato, smoothing */ +/* on frequency, etc.), excitation noise, */ +/* and four sweepable complex resonances. */ +/* */ +/* Measured Formant data (from me) is */ +/* included, and enough data is there to */ +/* support either parallel or cascade */ +/* synthesis. In the floating point case */ +/* cascade synthesis is the most natural */ +/* so that's what you'll find here. */ +/* */ +/* For right now, there's a simple command*/ +/* line score interface consisting of 3 */ +/* letter symbols for the phonemes, =xx */ +/* sets the pitch to x, + and - add and */ +/* subtract a half step, and ... makes it */ +/* keep doing what it's doing for longer. */ +/*******************************************/ + +#include "VoicForm.h" + +VoicForm :: VoicForm() : Instrmnt() +{ + voiced = new SingWave("rawwaves/impuls40.raw"); + voiced->normalize(); + voiced->setGainRate(0.001); + voiced->setGainTarget(0.0); + + noise = new Noise; + + filters[0] = new FormSwep; + filters[1] = new FormSwep; + filters[2] = new FormSwep; + filters[3] = new FormSwep; + filters[0]->setSweepRate(0.001); + filters[1]->setSweepRate(0.001); + filters[2]->setSweepRate(0.001); + filters[3]->setSweepRate(0.001); + + onezero = new OneZero; + onezero->setCoeff(-0.9); + onepole = new OnePole; + onepole->setPole(0.9); + + noiseEnv = new Envelope; + noiseEnv->setRate(0.001); + noiseEnv->setTarget(0.0); + + this->setPhoneme("eee"); + this->clear(); +} + +VoicForm :: ~VoicForm() +{ + delete voiced; + delete noise; + delete filters[0]; + delete filters[1]; + delete filters[2]; + delete filters[3]; + delete onezero; + delete onepole; + delete noiseEnv; +} + +void VoicForm :: clear() +{ + onepole->clear(); + filters[0]->clear(); + filters[1]->clear(); + filters[2]->clear(); + filters[3]->clear(); +} + +void VoicForm :: setFreq(double frequency) +{ + voiced->setFreq(frequency); +} + +void VoicForm :: setFormantAll(int whichOne, double freq,double reson,double gain) +{ + filters[whichOne]->setTargets(freq,reson,gain); +} + + extern double phonGains[32][2]; + extern double phonParams[32][4][3]; + extern char phonemes[32][4]; + +int VoicForm :: setPhoneme(char *phoneme) +{ + int i=0,found=0; + + while(i<32 && !found) { + if (!strcmp(phonemes[i],phoneme)) { + found = 1; + this->setFormantAll(0,phonParams[i][0][0],phonParams[i][0][1],pow(10.0,phonParams[i][0][2] / 20.0)); + this->setFormantAll(1,phonParams[i][1][0],phonParams[i][1][1],1.0); + this->setFormantAll(2,phonParams[i][2][0],phonParams[i][2][1],1.0); + this->setFormantAll(3,phonParams[i][3][0],phonParams[i][3][1],1.0); + this->setVoicedUnVoiced(phonGains[i][0],phonGains[i][1]); + printf("Found Formant: %s (number %i)\n",phoneme,i); + } + i++; + } + if (!found) printf("Phoneme %s not found\n",phoneme); + return found; +} + +void VoicForm :: setVoiced(double vGain) +{ + voiced->setGainTarget(vGain); +} + +void VoicForm :: setUnVoiced(double nGain) +{ + noiseEnv->setTarget(nGain); +} + +void VoicForm :: setVoicedUnVoiced(double vGain, double nGain) +{ + this->setVoiced(vGain); + this->setUnVoiced(nGain); +} + +void VoicForm :: setFiltSweepRate(int whichOne,double rate) +{ + filters[whichOne]->setSweepRate(rate); +} + +void VoicForm :: setPitchSweepRate(double rate) +{ + voiced->setSweepRate(rate); +} + +void VoicForm :: speak() +{ + voiced->noteOn(); +} + +void VoicForm :: quiet() +{ + voiced->noteOff(); + noiseEnv->setTarget(0.0); +} + +void VoicForm :: noteOn(MY_FLOAT freq, MY_FLOAT amp) +{ + voiced->setGainTarget(amp); + onepole->setPole(0.95 - (amp * NORM_7 * 0.2)); + voiced->setFreq(freq); +} + +void VoicForm :: noteOff(MY_FLOAT amp) +{ + voiced->noteOff(); +} + +MY_FLOAT VoicForm :: tick() +{ + MY_FLOAT temp; + temp = onepole->tick(onezero->tick(voiced->tick())); + temp += noiseEnv->tick() * noise->tick(); + lastOutput = filters[0]->tick(temp); + lastOutput = filters[1]->tick(lastOutput); + lastOutput = filters[2]->tick(lastOutput); + lastOutput = filters[3]->tick(lastOutput); + lastOutput *= 0.02; + return lastOutput; +} + +void VoicForm :: controlChange(int number, MY_FLOAT value) +{ + MY_FLOAT temp; + int tempi; + +#if defined(_debug_) + printf("VoicForm : ControlChange: Number=%i Value=%f\n",number,value); +#endif + if (number == MIDI_control1) { + this->setVoiced(1.0 - (value*NORM_7)); + this->setUnVoiced(0.01 * value * NORM_7); + } + else if (number == MIDI_control2) { + tempi = (int) (value / 2); + if (tempi < 16) { + tempi = tempi; + temp = 0.9; + } + else if (tempi < 32) { + tempi = tempi - 16; + temp = 1.0; + } + else if (tempi < 48) { + tempi = tempi - 32; + temp = 1.1; + } + else if (tempi < 64) { + tempi = tempi - 48; + temp = 1.2; + } + this->setFormantAll(0,temp*phonParams[tempi][0][0], + phonParams[tempi][0][1], + pow(10.0,phonParams[tempi][0][2] / 20.0)); + this->setFormantAll(1,temp*phonParams[tempi][1][0], + phonParams[tempi][1][1],1.0); + this->setFormantAll(2,temp*phonParams[tempi][2][0], + phonParams[tempi][2][1],1.0); + this->setFormantAll(3,temp*phonParams[tempi][3][0], + phonParams[tempi][3][1],1.0); + } + else if (number == MIDI_control3) + voiced->setVibFreq(value * NORM_7 * 12.0); /* 0 to 12 Hz */ + else if (number == MIDI_mod_wheel) + voiced->setVibAmt(value * NORM_7 * 0.2); + else if (number == MIDI_after_touch) { + this->setVoiced(value*NORM_7); + onepole->setPole(0.99 - (value*NORM_7 * 0.2)); + } + else { + printf("VoicForm : Undefined Control Number!!\n"); + } +} + diff --git a/VoicForm.h b/VoicForm.h new file mode 100644 index 0000000..bba660c --- /dev/null +++ b/VoicForm.h @@ -0,0 +1,65 @@ +/*******************************************/ +/* 4 Formant Synthesis Instrument */ +/* by Perry R. Cook, 1995-96 */ +/* This instrument contains an excitation */ +/* singing wavetable (looping wave with */ +/* random and periodic vibrato, smoothing */ +/* on frequency, etc.), excitation noise, */ +/* and four sweepable complex resonances. */ +/* */ +/* Measured Formant data (from me) is */ +/* included, and enough data is there to */ +/* support either parallel or cascade */ +/* synthesis. In the floating point case */ +/* cascade synthesis is the most natural */ +/* so that's what you'll find here. */ +/* */ +/* For right now, there's a simple command*/ +/* line score interface consisting of 3 */ +/* letter symbols for the phonemes, =xx */ +/* sets the pitch to x, + and - add and */ +/* subtract a half step, and ... makes it */ +/* keep doing what it's doing for longer. */ +/*******************************************/ + +#if !defined(__VoicForm_h) +#define __VoicForm_h + +#include "Instrmnt.h" +#include "Envelope.h" +#include "Noise.h" +#include "SingWave.h" +#include "FormSwep.h" +#include "OnePole.h" +#include "OneZero.h" + +class VoicForm : public Instrmnt +{ + protected: + SingWave *voiced; + Noise *noise; + Envelope *noiseEnv; + FormSwep *filters[4]; + OnePole *onepole; + OneZero *onezero; + public: + VoicForm(); + ~VoicForm(); + void clear(); + void setFreq(double frequency); + void setFormantAll(int whichOne, double freq, double reson, double gain); + int setPhoneme(char* phoneme); + void setVoiced(double vGain); + void setUnVoiced(double nGain); + void setVoicedUnVoiced(double vGain, double nGain); + void setFiltSweepRate(int whichOne,double rate); + void setPitchSweepRate(double rate); + void speak(); + void quiet(); + virtual void noteOn(MY_FLOAT freq, MY_FLOAT amp); + virtual void noteOff(MY_FLOAT amp); + MY_FLOAT tick(); + virtual void controlChange(int number, MY_FLOAT value); +}; + +#endif diff --git a/VoicMang.cpp b/VoicMang.cpp new file mode 100644 index 0000000..83b095e --- /dev/null +++ b/VoicMang.cpp @@ -0,0 +1,307 @@ +/******************************************/ +/* Simple Voice Manager (Mangler) */ +/* for ToolKit96, 1996 Perry R. Cook */ +/* Princeton University */ +/* */ +/* Make one of these by telling it the */ +/* maximum number of voices you'll want, */ +/* and also what flavor instrument */ +/* group it will be mangling. Pipe TSIDI*/ +/* messages into it and it will return */ +/* the mixed channel signal each tick. */ +/* For multi-channel (multi-timbral), */ +/* make one for each channel and mix */ +/* their outputs. */ +/* */ +/* Each note on returns a unique tag, */ +/* (credits to the NeXT MusicKit here), */ +/* so you can send control changes to */ +/* unique instances of instruments */ +/* within an ensemble. */ +/* */ +/* TSIDI (ToolKit Synthesis Instrument */ +/* Digital Interfaceis like MIDI, but */ +/* allows for floating point control */ +/* changes, note numbers, etc. Example: */ +/* noteOn(1,60.01,111.132) plays a sharp */ +/* middle C with a velocity of 111.132 */ +/* */ +/******************************************/ + +#include "VoicMang.h" +#include "Marimba.h" +#include "Vibraphn.h" +#include "AgogoBel.h" +#include "Plucked.h" +#include "Mandolin.h" +#include "Clarinet.h" +#include "Flute.h" +#include "Brass.h" +#include "Bowed.h" +#include "Rhodey.h" +#include "Wurley.h" +#include "TubeBell.h" +#include "HeavyMtl.h" +#include "PercFlut.h" +#include "BeeThree.h" +#include "Moog1.h" + +VoicMang :: VoicMang(int maxVoices, char *instrType) +{ + int i; + max_voices = maxVoices; + if (max_voices > __VMang_MAX_) { + printf("You ask for too many voices, setting to %i\n",__VMang_MAX_); + max_voices = __VMang_MAX_; + } + if (!strcmp(instrType,"Marimba")) { + for (i=0;inoteOn(temp,amp); +} + +#define ONE_OVER_12 0.083333 + +long VoicMang :: noteOn(MY_FLOAT note_num, MY_FLOAT amp) +{ + int i,gotOne; + int temp1; + long temp2; + MY_FLOAT temp3,temp4; + MY_FLOAT freq; + freq = 220.0*pow(2.0,(note_num-57.0) * ONE_OVER_12); + gotOne = 0; + for (i=0;inoteOn(freq,amp*NORM_7); + frequencies[i] = freq; + gotOne = 1; + i = max_voices; + } + } + if (!gotOne) { /* if can't find a free one */ + return -1; /* report back */ + } + return newTag-1; +} + +long VoicMang :: oldestVoice() +{ + int i; + long temp,temp2,gotOne; + temp = newTag; + gotOne = -1; + for (i=0;i 0 && temp2 < newTag) { + temp = temp2; + gotOne = temp2; + } + } + return gotOne; +} + +int VoicMang :: noteOffN(int note_num, MY_FLOAT amp) +{ + int i,gotOne; + MY_FLOAT temp; + gotOne = -1; + for (i=0;inoteOff(amp*NORM_7); + voicesOn[i] = -mute_time; + gotOne = 1; + } + } + return gotOne; +} + +void VoicMang :: noteOff(long tag, MY_FLOAT amp) +{ + int i; + for (i=0;inoteOff(amp*NORM_7); + voicesOn[i] = -mute_time; + } + } +} + +void VoicMang :: kill(long tag) +{ + int i; + for (i=0;inoteOff(1.0); + voicesOn[i] = 0; + notesOn[i] = -1; + } + } +} + +void VoicMang :: pitchBend(MY_FLOAT value) +{ + int i; + pitch_bend = value; + for (i=0;isetFreq(freqBases[i]*frequencies[i]); + } +} + +void VoicMang :: pitchBend(long tag, MY_FLOAT value) +{ + int i; + for (i=0;isetFreq(freqBases[i]*frequencies[i]); + i = max_voices; + } + } +} + +MY_FLOAT VoicMang :: tick() +{ + int i,j; + MY_FLOAT temp; + temp = 0.0; + for (i=0;itick(); + } + if (voicesOn[i] < 0) { + voicesOn[i] += 1; + if (voicesOn[i] == 0) { + notesOn[i] = -1; + frequencies[i] = 0.0; + freqBases[i] = 1.0; + } + } + } + return temp; +} + +void VoicMang :: controlChange(int number, MY_FLOAT value) +{ + int i; + for (i=0;icontrolChange(number,value); + } +} + +void VoicMang :: controlChange(long tag, int number, MY_FLOAT value) +{ + int i; + for (i=0;icontrolChange(number,value); + i = max_voices; + } + } +} + + diff --git a/VoicMang.h b/VoicMang.h new file mode 100644 index 0000000..9420a66 --- /dev/null +++ b/VoicMang.h @@ -0,0 +1,69 @@ +/******************************************/ +/* Simple Voice Manager (Mangler) */ +/* for ToolKit96, 1996 Perry R. Cook */ +/* Princeton University */ +/* */ +/* Make one of these by telling it the */ +/* maximum number of voices you'll want, */ +/* and also what flavor instrument */ +/* group it will be mangling. Pipe TSIDI*/ +/* messages into it and it will return */ +/* the mixed channel signal each tick. */ +/* For multi-channel (multi-timbral), */ +/* make one for each channel and mix */ +/* their outputs. */ +/* */ +/* Each note on returns a unique tag, */ +/* (credits to the NeXT MusicKit here), */ +/* so you can send control changes to */ +/* unique instances of instruments */ +/* within an ensemble. */ +/* */ +/* TSIDI (ToolKit Synthesis Instrument */ +/* Digital Interfaceis like MIDI, but */ +/* allows for floating point control */ +/* changes, note numbers, etc. Example: */ +/* noteOn(1,60.01,111.132) plays a sharp */ +/* middle C with a velocity of 111.132 */ +/* */ +/******************************************/ + +#include "Object.h" + +#if !defined(__VoicMang_h) +#define __VoicMang_h + +#include "Instrmnt.h" + +#define __VMang_MAX_ 8 + +class VoicMang : public Object +{ + protected: + char InstrumentType[16]; // Instrument Flavor + int max_voices; + long newTag; // Unique NoteOn tag counter + Instrmnt *instrument[__VMang_MAX_]; // The actual Instruments + long voicesOn[__VMang_MAX_]; // Tags of Sounding Notes + int notesOn[__VMang_MAX_]; // Note Numbers On + long mute_time; // Instrument time to shut up + MY_FLOAT freqBases[__VMang_MAX_]; // Indiv. Pitch Bend Multipliers + MY_FLOAT frequencies[__VMang_MAX_]; // Indiv. Sounding Frequencies + MY_FLOAT pitch_bend; // Channel Pitch Bend Mult. + public: + VoicMang(int maxVoices, char *instrType); + ~VoicMang(); + long noteOn(MY_FLOAT noteNum, MY_FLOAT amp); + long noteOnF(MY_FLOAT freq, MY_FLOAT amp); + void noteOff(long tag, MY_FLOAT amp); + int noteOffN(int note_num, MY_FLOAT amp); + long oldestVoice(); + void kill(long tag); + void controlChange(int number, MY_FLOAT value); + void controlChange(long tag, int number, MY_FLOAT value); + void pitchBend(MY_FLOAT value); + void pitchBend(long tag, MY_FLOAT value); + MY_FLOAT tick(); +}; + +#endif diff --git a/Wurley.cpp b/Wurley.cpp new file mode 100644 index 0000000..5685437 --- /dev/null +++ b/Wurley.cpp @@ -0,0 +1,53 @@ +/******************************************/ +/* Wurlitzer Electric Piano Subclass */ +/* of Algorithm 5 (TX81Z) Subclass of */ +/* 4 Operator FM Synth */ +/* by Perry R. Cook, 1995-96 */ +/******************************************/ + +#include "Wurley.h" + +Wurley :: Wurley() : FM4Alg5() +{ + this->loadWaves("rawwaves/sinewave.raw", + "rawwaves/sinewave.raw", + "rawwaves/sinewave.raw", + "rawwaves/fwavblnk.raw"); + + this->setRatio(0,1.0); + this->setRatio(1,4.0); + this->setRatio(2,-510.0); + this->setRatio(3,-510.0); + gains[0] = __FM4Op_gains[99]; + gains[1] = __FM4Op_gains[82]; + gains[2] = __FM4Op_gains[92]; + gains[3] = __FM4Op_gains[68]; /* Originally 78, but sounded stinky */ + twozero->setGain(2.0); + adsr[0]->setAll(0.05,0.00003,0.0,0.02); + adsr[1]->setAll(0.05,0.00003,0.0,0.02); + adsr[2]->setAll(0.05,0.0002,0.0,0.02); + adsr[3]->setAll(0.05,0.0003,0.0,0.02); + vibWave->setFreq(8.0); +} + +void Wurley :: setFreq(MY_FLOAT frequency) +{ + baseFreq = frequency; + waves[0]->setFreq(baseFreq * ratios[0]); + waves[1]->setFreq(baseFreq * ratios[1]); + waves[2]->setFreq(ratios[2]); /* Note here a 'fixed resonance' */ + waves[3]->setFreq(ratios[3]); +} + +void Wurley :: noteOn(MY_FLOAT freq, MY_FLOAT amp) +{ + gains[0] = amp * __FM4Op_gains[99]; + gains[1] = amp * __FM4Op_gains[82]; + gains[2] = amp * __FM4Op_gains[82]; /* Originally 92 */ + gains[3] = amp * __FM4Op_gains[68]; /* Originally 78 */ + this->setFreq(freq); + this->keyOn(); +#if defined(_debug_) + printf("Wurley : NoteOn: Freq=%lf Amp=%lf\n",freq,amp); +#endif +} diff --git a/Wurley.h b/Wurley.h new file mode 100644 index 0000000..7be2f8e --- /dev/null +++ b/Wurley.h @@ -0,0 +1,21 @@ +/******************************************/ +/* Wurlitzer Electric Piano Subclass */ +/* of Algorithm 5 (TX81Z) Subclass of */ +/* 4 Operator FM Synth */ +/* by Perry R. Cook, 1995-96 */ +/******************************************/ + +#if !defined(__Wurley_h) +#define __Wurley_h + +#include "FM4Alg5.h" + +class Wurley : public FM4Alg5 +{ + public: + Wurley(); + virtual void setFreq(MY_FLOAT frequency); + virtual void noteOn(MY_FLOAT freq, MY_FLOAT amp); +}; + +#endif diff --git a/miditabl.h b/miditabl.h new file mode 100644 index 0000000..4c2c08f --- /dev/null +++ b/miditabl.h @@ -0,0 +1,17 @@ +double __MIDI_To_Pitch[128] = { +8.18,8.66,9.18,9.72,10.30,10.91,11.56,12.25, +12.98,13.75,14.57,15.43,16.35,17.32,18.35,19.45, +20.60,21.83,23.12,24.50,25.96,27.50,29.14,30.87, +32.70,34.65,36.71,38.89,41.20,43.65,46.25,49.00, +51.91,55.00,58.27,61.74,65.41,69.30,73.42,77.78, +82.41,87.31,92.50,98.00,103.83,110.00,116.54,123.47, +130.81,138.59,146.83,155.56,164.81,174.61,185.00,196.00, +207.65,220.00,233.08,246.94,261.63,277.18,293.66,311.13, +329.63,349.23,369.99,392.00,415.30,440.00,466.16,493.88, +523.25,554.37,587.33,622.25,659.26,698.46,739.99,783.99, +830.61,880.00,932.33,987.77,1046.50,1108.73,1174.66,1244.51, +1318.51,1396.91,1479.98,1567.98,1661.22,1760.00,1864.66,1975.53, +2093.00,2217.46,2349.32,2489.02,2637.02,2793.83,2959.96,3135.96, +3322.44,3520.00,3729.31,3951.07,4186.01,4434.92,4698.64,4978.03, +5274.04,5587.65,5919.91,6271.93,6644.88,7040.00,7458.62,7902.13, +8372.02,8869.84,9397.27,9956.06,10548.08,11175.30,11839.82,12543.85}; diff --git a/phonTabl.h b/phonTabl.h new file mode 100644 index 0000000..45d148a --- /dev/null +++ b/phonTabl.h @@ -0,0 +1,189 @@ +double phonGains[32][2] = + {{1.0,0.0}, // eee + {1.0,0.0}, // ihh + {1.0,0.0}, // ehh + {1.0,0.0}, // aaa + + {1.0,0.0}, // ahh + {1.0,0.0}, // aww + {1.0,0.0}, // ohh + {1.0,0.0}, // uhh + + {1.0,0.0}, // uuu + {1.0,0.0}, // ooo + {1.0,0.0}, // rrr + {1.0,0.0}, // lll + + {1.0,0.0}, // mmm + {1.0,0.0}, // nnn + {1.0,0.0}, // nng + {1.0,0.0}, // ngg + + {0.0,1.0}, // fff + {0.0,1.0}, // sss + {0.0,1.0}, // thh + {0.0,1.0}, // shh + + {0.0,1.0}, // xxx + {0.0,0.1}, // hee + {0.0,0.1}, // hoo + {0.0,0.1}, // hah + + {1.0,0.1}, // bbb + {1.0,0.1}, // ddd + {1.0,0.1}, // jjj + {1.0,0.1}, // ggg + + {1.0,1.0}, // vvv + {1.0,1.0}, // zzz + {1.0,1.0}, // thz + {1.0,1.0} // zhh +}; + +double phonParams[32][4][3] = + {{ { 273,0.996, 0}, // eee (beet) + {2086,0.945, -16}, + {2754,0.979, -12}, + {3270,0.440, -17}}, + { { 385,0.987, 10}, // ihh (bit) + {2056,0.930, -20}, + {2587,0.890, -20}, + {3150,0.400, -20}}, + { { 515,0.977, 10}, // ehh (bet) + {1805,0.810, -10}, + {2526,0.875, -10}, + {3103,0.400, -13}}, + { { 773,0.950, 10}, // aaa (bat) + {1676,0.830, -6}, + {2380,0.880, -20}, + {3027,0.600, -20}}, + + { { 770,0.950, 0}, // ahh (father) + {1153,0.970, -9}, + {2450,0.780, -29}, + {3140,0.800, -39}}, + { { 637,0.910, 0}, // aww (bought) + { 895,0.900, -3}, + {2556,0.950, -17}, + {3070,0.910, -20}}, + { { 637,0.910, 0}, // ohh (bone) NOTE:: same as aww (bought) + { 895,0.900, -3}, + {2556,0.950, -17}, + {3070,0.910, -20}}, + { { 561,0.965, 0}, // uhh (but) + {1084,0.930, -10}, + {2541,0.930, -15}, + {3345,0.900, -20}}, + + { { 515,0.976, 0}, // uuu (foot) + {1031,0.950, -3}, + {2572,0.960, -11}, + {3345,0.960, -20}}, + { { 349,0.986, -10}, // ooo (boot) + { 918,0.940, -20}, + {2350,0.960, -27}, + {2731,0.950, -33}}, + { { 394,0.959, -10}, // rrr (bird) + {1297,0.780, -16}, + {1441,0.980, -16}, + {2754,0.950, -40}}, + { { 462,0.990, +5}, // lll (lull) + {1200,0.640, -10}, + {2500,0.200, -20}, + {3000,0.100, -30}}, + + { { 265,0.987, -10}, // mmm (mom) + {1176,0.940, -22}, + {2352,0.970, -20}, + {3277,0.940, -31}}, + { { 204,0.980, -10}, // nnn (nun) + {1570,0.940, -15}, + {2481,0.980, -12}, + {3133,0.800, -30}}, + { { 204,0.980, -10}, // nng (sang) NOTE:: same as nnn + {1570,0.940, -15}, + {2481,0.980, -12}, + {3133,0.800, -30}}, + { { 204,0.980, -10}, // ngg (bong) NOTE:: same as nnn + {1570,0.940, -15}, + {2481,0.980, -12}, + {3133,0.800, -30}}, + + { {1000,0.300, 0}, // fff + {2800,0.860, -10}, + {7425,0.740, 0}, + {8140,0.860, 0}}, + { {0,0.000, 0}, // sss + {2000,0.700, -15}, + {5257,0.750, -3}, + {7171,0.840, 0}}, + { { 100,0.900, 0}, // thh + {4000,0.500, -20}, + {5500,0.500, -15}, + {8000,0.400, -20}}, + { {2693,0.940, 0}, // shh + {4000,0.720, -10}, + {6123,0.870, -10}, + {7755,0.750, -18}}, + + { {1000,0.300, -10}, // xxx NOTE:: Not Really Done Yet + {2800,0.860, -10}, + {7425,0.740, 0}, + {8140,0.860, 0}}, + { { 273,0.996, -40}, // hee (beet) (noisy eee) + {2086,0.945, -16}, + {2754,0.979, -12}, + {3270,0.440, -17}}, + { { 349,0.986, -40}, // hoo (boot) (noisy ooo) + { 918,0.940, -10}, + {2350,0.960, -17}, + {2731,0.950, -23}}, + { { 770,0.950, -40}, // hah (father) (noisy ahh) + {1153,0.970, -3}, + {2450,0.780, -20}, + {3140,0.800, -32}}, + + { {2000,0.700, -20}, // bbb NOTE:: Not Really Done Yet + {5257,0.750, -15}, + {7171,0.840, -3}, + {9000,0.900, 0}}, + { { 100,0.900, 0}, // ddd NOTE:: Not Really Done Yet + {4000,0.500, -20}, + {5500,0.500, -15}, + {8000,0.400, -20}}, + { {2693,0.940, 0}, // jjj NOTE:: Not Really Done Yet + {4000,0.720, -10}, + {6123,0.870, -10}, + {7755,0.750, -18}}, + { {2693,0.940, 0}, // ggg NOTE:: Not Really Done Yet + {4000,0.720, -10}, + {6123,0.870, -10}, + {7755,0.750, -18}}, + + { {2000,0.700, -20}, // vvv NOTE:: Not Really Done Yet + {5257,0.750, -15}, + {7171,0.840, -3}, + {9000,0.900, 0}}, + { { 100,0.900, 0}, // zzz NOTE:: Not Really Done Yet + {4000,0.500, -20}, + {5500,0.500, -15}, + {8000,0.400, -20}}, + { {2693,0.940, 0}, // thz NOTE:: Not Really Done Yet + {4000,0.720, -10}, + {6123,0.870, -10}, + {7755,0.750, -18}}, + { {2693,0.940, 0}, // zhh NOTE:: Not Really Done Yet + {4000,0.720, -10}, + {6123,0.870, -10}, + {7755,0.750, -18}} +}; + +char phonemes[32][4] = + {"eee","ihh","ehh","aaa", + "ahh","aww","ohh","uhh", + "uuu","ooo","rrr","lll", + "mmm","nnn","nng","ngg", + "fff","sss","thh","shh", + "xxx","hee","hoo","hah", + "bbb","ddd","jjj","ggg", + "vvv","zzz","thz","zhh"}; diff --git a/rawwaves/MAKEFUNC.C b/rawwaves/MAKEFUNC.C new file mode 100644 index 0000000..9148919 --- /dev/null +++ b/rawwaves/MAKEFUNC.C @@ -0,0 +1,55 @@ +/**********************************************/ +/** Utility to make various functions **/ +/** like exponential and log gain curves. **/ +/** **/ +/** Included here: **/ +/** Yamaha TX81Z curves for master gain, **/ +/** Envelope Rates (in normalized units), **/ +/** envelope sustain level, and more.... **/ +/**********************************************/ + +#include +#include +#include + +void main() +{ + int i,j; + double temp; + double data[128]; + +/*************** TX81Z Master Gain *************/ + for (i=0;i<100;i++) { + data[i] = pow(2.0,-(99-i)/10.0); + } + data[0] = 0.0; + printf("double __FM4Op_gains[99] = {"); + for (i=0;i<100;i++) { + if (i%8 == 0) printf("\n"); + printf("%lf,",data[i]); + } + printf("};\n"); +/*************** TX81Z Sustain Level ***********/ + for (i=0;i<16;i++) { + data[i] = pow(2.0,-(15-i)/2.0); + } + data[0] = 0.0; + printf("double __FM4Op_susLevels[16] = {"); + for (i=0;i<16;i++) { + if (i%8 == 0) printf("\n"); + printf("%lf,",data[i]); + } + printf("};\n"); +/****************** Attack Rate ***************/ + for (i=0;i<32;i++) { + data[i] = 6.0 * pow(5.7,-(i-1)/5.0); + } + printf("double __FM4Op_attTimes[16] = {"); + for (i=0;i<32;i++) { + if (i%8 == 0) printf("\n"); + printf("%lf,",data[i]); + } + printf("};\n"); + exit(1); +} + diff --git a/rawwaves/MAKEMIDI.C b/rawwaves/MAKEMIDI.C new file mode 100644 index 0000000..de68d25 --- /dev/null +++ b/rawwaves/MAKEMIDI.C @@ -0,0 +1,33 @@ +/**********************************************/ +/** Utility to make various functions **/ +/** like exponential and log gain curves. **/ +/** Specifically for direct MIDI parameter **/ +/** conversions. **/ +/** Included here: **/ +/** A440 Referenced Equal Tempered Pitches **/ +/** as a function of MIDI note number. **/ +/** **/ +/**********************************************/ + +#include +#include +#include + +void main() +{ + int i,j; + double temp; + double data[128]; + +/********* Pitch as fn. of MIDI Note **********/ + + printf("double __MIDI_To_Pitch[128] = {"); + for (i=0;i<128;i++) { + if (i%8 == 0) printf("\n"); + temp = 220.0 * pow(2.0,((double) i - 57) / 12.0); + printf("%.2lf,",temp); + } + printf("};\n"); + exit(1); +} + diff --git a/rawwaves/MAKEWAVS.C b/rawwaves/MAKEWAVS.C new file mode 100644 index 0000000..ab52ed3 --- /dev/null +++ b/rawwaves/MAKEWAVS.C @@ -0,0 +1,116 @@ +/**********************************************/ +/** Utility to make various flavors of **/ +/** sine wave (rectified, etc), and **/ +/** other commonly needed waveforms, like **/ +/** triangles, ramps, etc. **/ +/** The files generated are all 16 bit **/ +/** linear signed integer, of length **/ +/** as defined by LENGTH below **/ +/**********************************************/ + +#include +#include +#include + +#define LENGTH 256 +#define PI 3.14159265358979323846 + +void main() +{ + int i,j; + double temp; + short data[LENGTH + 2]; + FILE *fd; + + /////////// Yer Basic TX81Z Waves, Including Sine /////////// + fd = fopen("halfwave.raw","wb"); + for (i=0;i~M~!}VDT103`#-8qaw2R$pwOYkS>qvBxVZs?-$L-wuwRR2%^&;kPm zy$HJw{Ta9*ups;%T^KM81^+PfL+uXjkn?E#TLy~|Bo>wzJrarxiU+m?1p$lz`U5=% mjRznE&H`Qlll}VpCHsK@5(Q8P`3RZ{O$2r8;b{`6*##P8K#Qo<-D`bG`bTUB=n4{9GHMGBzsRjPO=y87@?@{%?X@9e24O&mpMS&1^)>7i0~7d?QA91H_M6Zt)A!@V$7KEwCy zWc1cvqHM8mXq)&=6oWoh`<9&#cvn;Xh)F))^FgMY%3eqiY>0zsB5fq9)dZp;bqm0LeS5;gEb}0=|Ot&5P4C& z0Rzx#eBJrfc=l#+pid4oX4?wX-J#nZG zeW;HD$CR03D^Cj|;Sa2UDfj+>NUDfJ5QD5WBa~-zh&?>PN zj1Z~r4wV_&Yx`eO3Y+qAVmH|YcHk(u)>$Fi!%k!$f2*7m&v1rxsgacr_1df+d}&`% z7t`M2iCj-QSxwYEc9E>E$16c9 zT*Ref(ND;GPQDr;mg7b6AnXFifWP2m8m{fOGhN{#78HX>r!^~5_KGqVsyB85U;yb< zJ}Ds6drglQob3ocT)ebexi1_)0OhP1Sz_HY9$8b#DAq~dLWWm!S2MpvBhb(68>QI% zTeqAyTJa+RCQca)ZOVNI^?xHiSh1%6S(_LD5Ui+N473;O)H;-!lQ`W_( zMTd}$EJ^#!ISr~JFZ-Rh4AhEq>eqSxvie?gKA$fSTIsHp?5H|ZI{dkI(Yrffr{{~H z{bs6?jLPgiM#0y$zEYjrB0E^9E+p2BH?o~ka+UZ?))TkUU{3H8cng%sPazgdX)_3|LPiF8ZZ*_N=XNA%Z<+A%~p*db@36ofkKGHm@M){T-apooW z(8@MOA)PLM2A5>G^L^kbJ4kDcE>w0gh}}n72`<7DGD8!VPx%!RdwJjj-$5;wv@#pG zez8l@X8g>)L2AjT7W zP#{UNccUq64ZEpK1eoMGsd%5KNzfa!x;9;&haKf1G|RbyN7H=mGN`IV@FEcdE`w#D z2ptnQL>JexN)#w)Z#>({)Bo`eHdZ^Kz*Gk~lazcO%42Xd9z~|hJ8%g2#~N!SStX<@ z&nC6lSEw^QZ0^&3athQVAXf|nt=KZ$lzT}pr;sF(du9i1ws(q}Pg7j!>{mRSk46Qc z6~6)&!6Y&QE|+<5AKQx_%1dMmdrxU;JyDMGdZ@9SE%M26Ib4pHt9T#HO^3Ml(eLCd z8N|2YOg<40qWiTxM}UuEHs3Cjw69qh`apKE=PF@f8OfzS6v^`Vc(R2CqHI!%Qprvp zC&ts?Ui{TY*b?OotwW~bwZ1>Kh2k^u zr5evoaY1$h(|IL6DdIsLG9NbK>)}ulEe?_+&QrY2pY{a!BkO?ogA)2ed(J-qh3I46 zkra!kARL|GSMX|jiu}SJ&%nm$THpl)fQc$CbQvr^uRx#L0}6o!95uYs*+ZAn)W9P1~Zi#^eP{z{$){h z6PQG^T;bM-+G^*#L~^@$tqo?=m67(33ZcOy+rF)a^90yIPFLeSZS{+yAv}xjqL$7R z(o;M^jYT%{i678$5F*3mL3miMAg|C-`=ya%Zc`HdiHSwy@MT+S-&+^dZBCK0UY>w^ zKsw;OfjX48<@fXx=2Y#nvl3lLU$Iaa1qOmJk%C%^Y48NRPNS4GQAaEzWo!~@%dWu% z;%|9VT}5kBe_J+kedt;H`xTV!%x^4UJI=PjK0$A*yqthP($g% zbCvs`zLNr;p)9-woB^H1RQ$qM7&y@L&Q*=Z=n2lhu$a$g?X~4#r%WSsI0cp|RB zAK~HrIlk{Vgy~p@Uwj>*<${WG=fnw4cVZGMUhb=3D)2>h~OS@0Dmk0r7Qr2;EL=GCgDH)KGhh# zXW!Bios0T!bStSz&yw5DAL>@N3Vs33f}dcxf3h9H9?=RP0`=H4ZJu>R-{vG}5$rhN z@-mtUKR`&n1S9xB6o^VhA`16+#!z>3&q>n^zMNd6&-Ddn6;+C1u#?~NyJNvyqrUJj z&=sA9$$X&}_YZxs#21{H)@4SKWW-fMV-F@!hw8}7} zA)hMuiUcL!nW%;HC!&fr#IB+;lI3ARV?7s0x^l!RF;bi_VF)bY9c7lXiMddLve4NF zKU0>O3tiOLCg7dbNO>!!_+2>>MLP`Nm6nV_hd?TL9~av}%5-_3|A5Am?oNWzmli0m z`3_hv-^mj=U7VCda2A`O&ZGHwHw=-JQCoDw?+KIjIhDiRE1co*251Gp5JB<>Whiuu z6=b8BfpS2)6QO0WozR1Rls&kqUi017Q>{zdXxb5#V(i~R4b{4wvjX+H1C-ZtJm?Fr z`AK$5ZlLu7j(g{5IpQ8PaWwTR^Q_Zq3GbmUm$zUalxfv*QEMJtuY}thLt@MK1pue1 zderwrXjqvYFq#qB*w4R2yg_`~tj#hZxtIapK6l?SniDc0*3HF3xN>4xeK7z-@$Lv4uu<}B88a?9QxU-dy=~K7{ z-4W}Qkxo0K$g|nKlh(w`U}q->#o&YVj*=)&_+97-eqk zQL#lLcB8Kv6a`u8Qg(Od-nsM6@6X>k@44sPIlFVuo_(JAJfHc39v~IGfH$ccnrE)D z5$rv#R=Hb!Lwi}*Y3OMjZEQ0gaoFcH#XN*T{P#TZSJS zl0PUssx34&WJq|IxUZ7e4!@gvYUF`I{UY1~cDd{HdT<@x#(GpLO=8>>Rr({2I(I`) zml!xOF_9YBrSHbRWzlXy1-{+}E1KGPw7T&>Yf->PYJQ^%)|;~&P}^t-wI z*47*NPT=F`k5ArT{nsB)qF<%HX|DP0W4JllQf!U4-E5RvCY}wl-s4%PuX)@@VcPj9w&R3hbDxq2rdrV z*6UHP{=q+nybj6_GV~bdNBm2ArG=TJj`iI*Fd^y5$kf!TVfus({i&!a!3X?jd%yBA zbRW`vhyRoA7Qa{iU3?dK>fL_zaPkZ4aWvpjK#9MfU%F3}SFuNLHy4*ymjdHm?M-bT z%_t2~$8rbROl}b8%tmqxxfFUW(RQA(^tX6h?ziu-_Tje*TlfmQTW3*ccIS$A=e9)4 z+P0M)C+rlNC}~AKzK=~pvhXc##M6Y8R@7G1da5a`;Yh1W7{lJwb#b`kI?Q#nL$0Ar zdtLdHI!RNfey3Wme4)~)59>os7H5U)A@_rx`@FyNdlEne#CNaveeQePcd~E2593DZ zv(%$hlNDo`zVsXJg8HQDm9j)vXxO7`*9zK1t)MS7b}<$i*PB9389ION5L6=znjmzb zYpB*fz;>P=#s~8MijS!T_7Uevxf5?RT~PBjzM5w{ueIqL{;oYn=9`)Um`CCxoHVw*8jomWakm^Pq-`Ce#|!ZnM$${~&MN7c69kF^P0ks+ zeVTk*yxKkQc0KK3@d)rVcr5F>v)l4+d%NX%zV+#7_jvB`~8eMYTmb$)kyk;8cIL0;8?K_u1m+P+II!!XB=_1vGl)otUt4?ThHLFz% zxV20#@EKYrn0PO2faBN%HK&=be9T(eHFPEX9*VS?O<<-lE|f*|=W7wm_p}DJH(Q>y zp|+WA+d4Mc1QH9+)5qwKR4i>^r*qwu{^~Mqxh_FpU|Qug+4ZekKc^PMW~Ex%X`RsG zXwIvORR$=aS>>=+xU`v#EWH&IcVD4X4y!F^)tKKH67XQ`!?-k2KwFNchyN zrt;ml)x+Pud|UFbYjvNR=DJ?>!^}UJ6U_nUN%dKEeC^!2FX}rR);2C|N@~t%Uf!Z= z(Kalv9bc__HR$=KCwCrgsap8pY1P(8lb>zawHs}>?W_3V{1PEhQ1NetTC@!BCZW=4 zPy@C}gT-ooc>8wC=$4$;dluYQ-I?09s*P$FEj^mQYIySL?@vSPLh3GmGS?mcw4%Oe z{rHBQ=G0cFmIck@T6(tjZ^>)+YaZHi$8xyip-pLD$xpX;2#e4n#G!J$2Iq)Jq&cvO z8?3sa8K+xl_-Im?&N=db4toUU9SX>im#>hiTWHBeQm%u(dAjdTZ`N)BU! zh6u4phtGl-${P|ooEgb@(YvXI&>d*VX>kDBE~MI9ZPTq8oj#r2I<*}$Iu^B4mM>a< zZQj(pusODAL}O;d=!Ss}JI#LPS&g7Es_{y5ee2EE#MT^3iv?Q>ER}87+siwMb&73( zU=rgLkTbe=)t;KNaChUj0CGT6<5|N4G}5Sl?B@P9Lc|r@NwEtev5Gtolcl zpdPF_qI1{H)s513(_0N63_t7D+Nl~h^?Y@NYLUuCm7+SV-mG4vny9Q&{-g?3WhkB5 zR;HYp#7t#;=p=|hA)uv7X$3h&c9SwGR@x!;B$@aQS|_{`-lC_X3mHJ}iyi?o~E zAXCUZGKM?=6xa(+fwy3`luF!07yL7xjf3!5QAJjRI5>=g)C>9vGmkmJoMU>@ec=z% zJaIRUM8((%?-7GZm{bJJ@E&{%YhW8Z46ne;@G5MlBB@c-ms9}kgw=2Kcwn&SmUqB+b55r+TEPzKT9Ti9YNc+=i z^w0EVI-UNSq2yG)nyuhMIW=3ve$Rf%4v;%g!+JCA%vIglTeo5b@Ptm{8@iI$UGFxg8CdH9s;!AOvct9*8USuP=M;ggBvYB{@ znfM{j!LfJuBak1h&!!IwYB_ve*- z7XMC|FVr9p6oY`UPe>5FglJ)fa1uqKG8}_#WS}%ldJ1B|E!YR%GM3mSE64{=;ZSI%GAJAEO-Io4=>c>sy3z%##XUA*+}LS^9M7L=IQgaH?hvH!{wCl75|MQ_j^l!?AUE744J zRQ~iD5!t4`s7209Ji3myqd6!7u`)vskqdf_-;-czDaeO=sl{}toXJ{bwma!Ux{O9l z1hbk+WX3QXnFCB6>&N=AySQ|&jH}_Ea}N}>g64=~lpxM|=t&z(3;oI8lCoJVJ$Xf;fOM&KFC`F0zAMkrJhi(jlM$D&PR>;dFS7 z(o?C_McPH?yPo-s$z?7w$C=;R5H^n4%Ve>TE#@3pJ6pz5 zjBGz9o9W7UF@E$%x`sYM|G|VZvzhTsFnxzUOCP6m>1e7`o~Etx^%Ye?4S)xrBRCAc z15>10X|kjzuVf!YiATg}x!O6{4_%RIjzUvW0E$N`f{2u;8`2<8v;dW$b!ag15Q>Eq z{3;I5A!r0j5~_qH!ZYM7+q6x1BG1Zx^bwV# xGIR?)!~JA?s>I%6lBmNs88Rv;3L+>1Dy|6wMqFJnr&TfQs%s9Ib5>SY7vnYSD&~m0 zCR}xmC2J9fH$x^rFH1J`j{?H-?iZiNcFhXc4+JS zthr`ob#=~xH|sJ|PK-;D&)&V>>FVekBX8GdPIwz#x(Me9&wYKHjMm;`T7@q4YuNa5 z;6?A^MjpP5AFscpPYw(VQv`L2+d4CR(z)?zGoqI_nBmd0UGsy|a&uUI*zCFj^PA+h&CYt0^Z18nTkSbAEo1w_D zTC<~GWxQN}>zC81r!F5|e(?H1)49pHqq+61jlD~{mUrBpur1+kM=5%FupAT@(j%g< z*{slWjjsA>8$;y8E=k?@#dc~nKXP-_owoW`zXfbIeo@b?@c%pPOzd7*|7=~#hTy$_ zTui??JnirM;fp(!L+|Z*zM&zGu z=Xbx->tP=up=bBOQ7xM$>gugrN&lRCZ|6Sle#84}?tM$Pn7#W==l7W(4FzLr_6w&} zO+7v;c0q>hXTSfoZ_bIwo1d@DTAjJ*LqtUy-V!{olmCy`CWp>hH-66$NBy)Vu#3GTLm$R+(Qz@EJr>3nw%r_5rXQq@^cbg0Rc=I`WnM@YW#t9q5%06cHeO5p zt-dde%M>r2YbipS7 z^+h*|#uesQ_?WudjMgY_ex-(EVscxlbg)&To0 zsRLS~>Sp-eSYXh&t>h;tZfUpqIGX&`xR+Oy=8SR;)6W%Ld!}S;-aj86e%w`jv0SJb zT0hCM$N7SJqkN5%%?C_F9CPGcS?SPOEG}8vDLP1m;mQXK&2xSd3(l9^EYGR=$@T=fD|c}XrG~;F>5#a__H*^<0>#Itc~d`j z$O->gQ~0LLr_K#zGO%dv$35B4-x;!B<@GGyU3$CB`L&UGH}>JL^Y6Kh z+zoa_6N`10% zj^VUhF&l^13Pq-aU*6`#z3crpHFMe9hVK^^{8Fv5H6xy?58VifXG?G#>QM@j2s(4V$&qNMkCkJY61DUSGDkXiCAlqF$vj z6+Np~)Wm(iWU||5fK~I*W1jmsZExKcokMe+eJK3pY$f=K3y2$cOLN|kZ#-gH;T7UN z-LO*AKs8Nc^Vq3BuDzg+RVtOUxW3XkD^v5KEWfy>w8=Lg%YEAg#}N6ELa!?1UdsQ7 zoVd<4&A!OG*rv6ftY29dX+Goh6q>rW3nx*zuBYG6fvtnTH9y#*zIlhhm7WuLn=8ds zQv2q6im8*S$dqq8j$Nv`+DL7Z)<-+R&6{gXG{QK03QAr zjz@tuLV1ZPBg4eqw$S>&ENh*ui79ZOZVH-O{Ki0ojAQxl^3JJ<>80z_>$__R;#+7K< zQG2O+X61jXW`0fie%W%{`J22Lr713HjM{B(&-gm%FD|j+dgj~lud13U-%D(ZNtSxM zuD$k%-rKX%=cK2gD^lH3Bype6d^|?lFE^A7VwCtvdLZ{A3`*ty)XZ^jsKM$m#d-E` zGG2IRUu3yn-^0|(gf02bPOgd06xTy}JvoZcio2cP#R2e+*D3ZYeH7>TH|%D_z<4qn zx0ll8rQ{3qnyukRsYd7y7}^=I;e^LTU84G|LR1b@1fdSDFiXq2pqhY+>e7G99#oI3 zSGxe8U_L8HYTM}d8Z`Q!+{#&_xY({WXPN`dTW#UaPx1&fg5AgOR=w23X)E;q7*>0j zv~9RB>@Q{r)y_WF!{#4tQ-wV^i@l&O^9b~g_V4VU=3T433UBO3>#lu!UwxvysB~x9 z>&p2x?M&@#qO<``=7*~cZo{>V=BfIkO08<4{Kh{euY?NMDrr81Fi({2wOc*98D!%% zLqA=LYB{?U-jZEXt)r#6O?^vCwmsdk-g(Ux=@gwEoRPvu{4@Ll00>ocDkhCMKpN)zBd-D809k@tHaU*lfwdzF?QMf9RwP`g$+ zBW&Rof7>YMMKME~CRss`zM_2q@)O~pBgxvdKA~=QZHI6A?_I5Zq@mnCb%k!X(co3& z?d{n}-%As$9LCNh*Q6c7T34#`jq9R3i;3rLiZW%PTQgmu$9j)ux=yMQ%xK}5`Np?a zl{Mv_<;|*we`7E|Ixg^~Xzu`300R0VC6v+I@Y{zxNAp3309?NBGfupNX zERT}wu$r_2C1IpFqF#)Vj$sYq$tQTpT<4ZiX4NX=_#`focdC-zg4N-?lUWJ89O@cv zn_@m}wp&*?WT_fi6ra>qZ8!Ht`fT^rZY#NdL?b?Q^>MVdjk0yHMcG?9_lVo&FL)C) zV2<-uDo@2B)}MTqJp^wDvP78Po7S1n+y5gLF+)_lbPElGy=r|DyaNqyw7IHA+#m=N zQyd}I&6ap`sWsXD(e*+)j-8B=&rng?su;yYzLpgrR3y#_dn4O5dspX1!6|#-AiR*g zM1L}?Q4-0*X3~)O<6U?F{!A`IJlfCl>|y31l9=7>4Sp0qh5Mb&AYNU9f+}YdiZd+#G;@m2X5R36l)PNbpTx8Wu5_FZ@i^Ier;vg|f zh;coYe8^d5DxaXVxp`=N>F&6D>(rXgs!iM#l!zaRBOH@$N~>&t;(8?I!gzLxV!X<% z#_DR-VLll7%iDy>j`@~aQ(9d=Q$I_*eXy&Y#E}VX8^uD^GWB%zAXOLsF`I<^akTiS zYm}?AI1Ou%ii=i8tFyI8ciVlb?!0EW@&k92*##S9tFXtBYkzKk;F#{%<(T65%hg=4 zN;Bl=xUn1|O%y+iMdDvVwNM}h;<;!p`sm!zc6(<)P&$ zo{3-=a&Bx-REJ`bH_}2jECU0H!#!|_Y?2;{=Y&V%blDSMChs7Cti?#IbD5mp_BgA< znr(0Dd@X%L@!SPvj^-!#&hA)uQxm1~=&J=ELZ_5-K;RVRTk5yKx1}cB#r?azBCOjqoVp-0T1nIq8 zM(&~Zj1P02eal}}4pB8#ja9mok^B;7BY7kT3Y(n2JClT_(%-n85V(OZGP9VrXc)O6 z6KRXsTA1XjalH~Ii92NupCh#}8MYt;(}i8b-eWJYC)p;4PMa&nz30Fm<)I}E*HlNjv#V=`sFAAi30TXtVejxi@VEI^Tt_yE z`4zPz^Wh<9ZHe3^DE z<|ivID#s~(_++*RIu5-^cf3npE3K0_@u_%Kd@h}k^NA9UFx}WwTnqL*vkE0c26=$P zq%tX0W@SwJfR%}4Rctobp6kg5LK)7Nv*Z)<2lLWwwA>M#F@E1;Zt#WmnA zaCO{&*m0;Fej{UWE2&s~C?<+)#4}Q$^bJQ72|3x#Tnf)}$5|JvL`AR=uax$S1I32o zcey=23G$I?1{496D|58s8>@kXaJms{l$!LMI@nQUyOdyYdg>`5jlgXavBDh2@kiE&gfDGJQiWQ!^ z1i@P<6H8vq0C$+pK&rbndWE&y*ped20TtS%hfmz7m?ZIATTI|xy{}o3b+jUNKEsH+CXBpN(U7(4N(Zw8U>H zyI3-X6u~kSNBjLArkFW}%8(!Y3ayBlbirG(T0SMulSj%+<KnHk4+V_&h4*=fvsrWd+{ykH91hu`5^Psu!@rxpJZC*WITISc?9twL2y3=@qo+6wugC#~^D z94x<-kIR4K2wXu9QMFBjHE<5TqaYLkc34Bo$$Zj-G$)=!L*hv(JVP5$ITOqbWFk=p z>I{p>Ldu9WvYTv>_v7C98?E9^sCUQsf=*R$?S)pe_7MRkIc?K#gEOc#y*+k@Tn5 zmn4xxM1-GUE^LL<@Br!%f@gG2#nPIeBSUDo5AaERiMW#+umt&0>@QFOI)lPtJ~>JN zpQjnzhHv3&5W-bK_8jZH2%_s>qg?rGNW-uC?aX#%N zT3XG2pdqY+LYkjQ6pB14_H7VKF4G%B9ZtuocrQMMKavi#H^xz}OQ;D7L;$bhSE~Kp zq#uc+IaxvWlgFT@dN>I0Xy$B?2e)AZ^dJJQ=M>VL?(axdlT23t%D|~)J4vUvh2}6CR>K}R z3I|{#%z|FvPEWW_*|~`-d?ID~9s1w#7|PK?%JDjQLNnEn+$Ga!4TDGsJ!=%%MGBw| zETSGxP!(*TUiw2bIzK+si1w2$WFwuPM`_ovKrBUd04`Eaq{19%M=Ug=$)po$OCwrL znGSU4R``=zDn&Jk&Z1@n(|B%DW$h;W$Pt>$yW|617x}-MPlbsvk}|-TRM0gk6#rRz zrvr$foESs1G6e=g3yS*_xkq=Vl08&`*GMKYffkxlR>s3Hm`-DwMYGTa{K$98^t0qQ zde#~8lGvaDbfjFK3bP@JuJtCBMkQT_MU5=)=8q29dd{Y9jh zN=YFpAbHe^XjiQzE~;`5@S}au3p4x8z04r(ik`oB z`n2Zg=;zF|s;jC20O$y`ZHV?jn}*12h&DhgpgGW@A)5o~|Nm^(u>LQa0Zo83AO%PT zk{dGV|1+s!{oh+!!?$#xH;^X-$4CzrbQ&p4zOj#pX!4tD?l@+a_5Gb`A9KSReIYC5 zr!xCYd~zytlI_kS$MLd*4d`jGxE92yDx_om>=hMIiAP#V?E!v>#&rC#B2q;jT*I<+1tD zDBkNB7k6gaHRp-Ua3FvCe{mQ4FSs`4+rz;(zExC?l^^yO>&MgyVou~9)_$@-v^^GW z`~4N>c`^gx{^6iCac+g=uRLqN&Z?XV_E6 ze+9!cj+u@5g$V=WKj!}Q?amOGS7#4atV*8GdS=IHb^Oqh+Qgy(&7Q;T;q#^z{jIv3 zIyB>;6!3(w2tpfNqZ%!2Rd|ZCK;(GGk+#(KzrLT>4=8(=%38^Md-qZxvUklfEd*H;L_Zjb^i!1o@bsc8s>g8J!{$+Y>05Bpt9py4S-D@I%4(~YRR77$M(P}!$u)yN%TKbGi*5uC%gVdO z`@RVh(((dx1g!;I-PO{+fp6Zbl7L8ob~p8|jNrCl*1f&WdRWw@5YZM2+SPZhDJ9=D zN}@5_!weK!Q@5sBuR+bx@>7DB`KTq7 zC3kJfQas$SA%BTzuRP$34ZPQX8-QY+a@Iugxw%qT^KouN(|sAazVUV9uuox7AU=6p z@vZu*w1>u9CiU-1sl|QuUPq?5_(h;oMZa$oSkLJ>AD&lE6c3;u2FIWYPhyii%|(Sp zramzS_SUqfubS~+rS7T!jFd|6(Zz}JjgN|}XmN9YTiU-EeBNz#tin5X6nlXA71;Py z{QDAa_|!mKpVN^CSDJTR*;A4wc=*kny}9IpWBT_N7Wcs?H(n5~^)C=?JA%@+kP!+e&!v#b4Q;Cc=W6 zlJne5OCdhevZb~X?CJ_F8>q3jHL^#z*2rF{N*o`=6lVy2wWJ!_MfMB4s=MmLOTUy+ zya}9jm3ifV;!qx!s5X`fExaZ0ccumYH1wSDR?UUfa3+$N=e5}%c>NrYfqpCYubXS*M61yUI%BZ1j|avh>nj$AGt%5y9ckD(&ZNLx;48d+e+n$tn;0$ zqHE?p217WW{j})3_Xgdx_bzZ0=a^z-dQZ*$02*a~jis1NkV-?CZTKC8>0u}`@N z5@(F9>(=O#f}4z;-Ai7?{aq8o)pszwqb?Qp;V3gY*WZ8>l~dh)!VKZ2rEKen5Jzs_1HT3 zs_^AKdfBV0YU6gWxW?`N2j2(17n&=4C!SUOy~pnFj_|TdH>JByj0elwHylzJk}7hY*V-$2}Bw09;gAY3S0oUkssR%7mvNQtn2y+ulr{8BW6TK}BFZdMn)I(Rv@Y@I3Z!Mz73 zvins9YQOxLmRm^1Qg`Hs9Xq9yQ%;AkkG~LSbIpj_+5c6fCE|PIRh?6#h6?t#4AX1~ z`a5#Us<50{pEcPc*IV2WF-?aRoFgIBi#$^O47?0ox_ofI&4prapu zhID3d+e6kj^E~iEyoXs{H_Az{pE?wlZ-uK9-&UJ(MQ}*@JaA}g{~WvRkaD4Sm@bc* z#QX^WoE70I*cGrvZK_<#?T!1iG}Er>KOzb3jvUVfi;U-^9~s_{t1@J@emSFfEGM^SVd-En4oa8rR}BW&fCmyD zWu|ss>-?kqDLLBhUnsTIw$(3+Rh>Pf*BV-~$h zQtWkm+JTSi@37ZfT2_XY>C5ADCRPn7-U1Z=8f8zSyD@_`_e6K>1AYGqM@D@VjL;Q_ zE)+f1n3GDpvnb2v zvNq2mezo~L4*XPB|GQp1qWY=l2j|dVmvxZmC3a3YpGtLniOg$zD|NSdqTp`C-E?_O zch$(yO#`PjiJ~9@b7mX z-1tg4u4T#J%!Ayf6Qh$rmnNCdz2&pYCk_=Adfq7iti=ZFl3<9Rm& zD&cGo67APaV*8?owQI^>>+6}cGxiA6Oesrxr(#~pMLTL84789fVo6LPlH>k| zP*&tHSubi%=unX#u+aBI!zJ$mICqdN2wElISdo0N_6wLqvYcz#Q@={Rqnv;1c9vey zH!CQ#Zqmyg63>3u1?VPj5ieywf>tA6VpU=RaG?3Ai0C9u)N5pcafk3s$Uvk8I5I>b zoGJgDDve$u`H#^k*YTc|^5rI|thBMJYuPo7^>cnrz!q=4~*R8oHeE@!Q^s%-; zhT0MXgP5*?+g{4@k24*)r#S@uwk{K;dfxEPMc6F^=uU#i@=3OT6n}WVS?lU^=nJ(6 z{uYS`^1k3-S^LoDc^QsAky>K2?_kYw-Z$WMb}zx&`pTL#{AyuO-&1dOeIb--zE(d? zZ?9UE^~1UX*+A>CU*41Cx^7LwW<@vENK@~0nb31&qm;P2Ee`em(j|)DPb-tMqc(#e zI567Mqj5Y5!zrea9v$Ld%vDs?aq}y8x%n1JZZ5 zi`30%znr^Uo{*#w!@Tq1Ni)-s!BBHt|igY*!=#pwqhL1DEj0O2~jMf z{e-{+`-P~B(E|0`xDjD}!rt_1J^YTmO+sCl#HLR(UP|3ArtxvfN6$7|L{a{`A1}G5 zmJP`r{o7sgqWt_zx~7AEvF&v!{k_@*+uL!ZrRPh+MP$@z<8Uz)yFmU}CvPujhj1NT z`?T!J&&YVFSSzhex$IgcKI~F=~gjySu$KH*JR~hZM&ZRt)4O=~nBbSr6!m+%v@0>|NMJ;Dhjy zW%gf9Wxn+b@i}{TUOxfX+x}e%69Ptp7i6|3-K7IKonsDB26&tfiHH|&4rKa5#F4gU zIG3EuoU2GI!wD_eESMAS0*4guvps`Gx^^4B$!`_cx*odP@sEqlo-EEt2QT>0AN=|@ z*e^KC`Ci}s_YbH`O;KGR_Y!l<5?y6Wac0qe4y#$AStUs6x=PkXxS++~kWQ)>nerAF z6B-L2N9>G|ss2m2sc-8V$6OIlu7WBFq>aC_g!^`2#Z2mBk^fq$B->e@XyEV!1*`5%n<+Q-R$i4oPCU03v5rr0W!fMO- z&6$30C@U zBCqwwcsq2zJoUol_IuK!Sr?Rjk%@TAXm-TiO0!|6s6D>UxfPZP?)$Vw?R*ZsynYh@ z2RGF-1aUAETwmcTNjtK}^~b|w+}Lx`MEP-EBbAvq+P@7gkd9E?vU8lzLZpFthHS7E zD~UfuGoo&G)p8M+BO=No3WVoaJW)RUAhLbntMa=#B{0xE*f&uGR= zwmvc_@ghlrwt_oNx2rB7SeUW(`G_mLw1_Awg*P~Y$LnU?E)QWudDX04%rN?01_5_8pV=Nx#l)W~@#w?VSpm+G6NVBhJEziEV{;a(j zHN|Sp@5l>Lu&7e`IUV9@k5Un1lw{OP*xz^6CdYKsts0pr)#G%Us7>NbbcZO5p9UWwxB4ftW_nR_ytm3< z2Gs>S0B;F1laGcnp9M>$?bLBe{|dRh`^k%pg{=PUcco(MR%t)a{;b1w5riK&5}0f* zu3qTruSk=Pvb6KA2yZIxXmJB@R0!1(O4M}#4@kN-Imy|?s&A5_sRDOuKJm85e}$Gp zhpRzDoUaeO)OMh%vM8xy0iTVLcFF)*mWQ5mseEIQEzDM`h{wfTlC!C3ng~!V5T2N|?>L2@CzBuxH;_A|Bu?sz;dL*6c zyk{%N)(D0Z+~756E8piE71~)i!QE2uP^PZCl#_08OBB|wGskL}rxj{GXm5q;B!ddp*Pw>j|du5b9{U|*ldLd0!@oLn0kEx)S!jlE*x z;U~(Sjs6p5Isd@DLRIJu>M|T}zv-K>vTgweC;exT=3Ee;1%`wQ8UIAydt3 zB3YWK(=}4wmCeb>iz_Gg=&Ca#TZW09!I7f7F)cZ2`v%`ff0pMf>zRJMJst>{cifn2J4R#GV0=lN5I3Zzn%RaU#e`PF;cxEm-Yde$G%bIi}{$MHLa zS6AqQX2AfsJzpT**t}=l$LIygNnu5b)$yh@idbXrtY1s~gmiVoZM%#g>|;ym`rd!^ zSZ}@Gy0+|(;RExZop9H1Gl3_bT4|#oa1Zi^mlrHi zzNK#q5W%UyZFk$s-rk}751!){uWOC97OJ~gU(muZ2;XD=?)>F@z<@#$o(?VG)ZrI& z`=k4)vf?u%$4HxKIVn3*`a`Eee!>-|H|X8?1W!jxjESav{)>8UZfpf^9aEiCzwh^l zAAgPY#8OzqD)1>GC$v^1r5DokwNE)~Wz(X&3!7^3xHrl|TnNdful;qL-{Gy0wOosQ zBX=}rYV2%u(Qoqar-rD_!c^NStD3}o@tp2Hk@bYT6<-o)Uljmuf-AiHglDLCD2le% zc4y7Nc5*?qk7zfOiFQ$`U;#Wwt`o#d-)k>0$$@f|&ztZ3%-pd{UW~>mNp;1LiXs88 za<`?}IbOeu+gu*&-j4NFTx=3-^gQmeFk5bj(?=(>2gyc7RYpEl{fEyb_#r*Ry=;j4 z!STi$LmsYamfyMVsBLC(d&Bpa@;05CWR5XceJ7kY&$PO1yo9rylGjM=TZuT=8sguo1@2bT!Q>bt;_Zws!!%$Y%}weo&?j_2 z$WH)|^(Q$ZS178Oi`*s2e>4l&d+3cpez-N5_dTQTspl-`j4`h8%daJ-<=B=A+%Vmq z;%redh&~F9mn!VfkxdNBI>_4%RZ0(tGI)`S>GqSNbFym!E`lQC>(1AVM)#;XgB7H= zKE*pWx*KrbCU@wAmynbGPrrwl4kq1%l8e;#F^*zQbFkhq9d|^oWh$7poc@su)pJ5K z1>FOM(zD7Sb(MRR*@cW`M+eWCG4g;w;D`#`ugR`PDz^Im62_9N?^T7{3S+9*>Svk; zbH00DyTKY=(TI>iihA;$_ZiR3^Mv|a?u?i!EE7t=%bF`GZ4_GWEcr(DP31<(IpIsF zOZuY_wyC`+6&e_f29l`ezuVfIGgDlx3|A`lX7#F>UR7Gq^miX~Pure6*gwphT|bTR z6B$g3YOk_a*iq3tutVs75hpdC(4PrwqmD=oI$el_^;jw5vu%+TcU-Z-3ivTHG`DM= z#50m^!}(ZOZXZGYhg|~KOMVLJ2tjCputc(6wKHmKSTvoR7{eLqnV^k{$@6W5p5dtb zIs{a&@SXNvuRUbB7RUgfxjt8&vF>5LW^FSLEdad(xfAtsU>$ISbix1^2$F&bty*h| zxgeDY7sa)V>zdAQ`7LsXP#p`!?F`Qk8ObMY)1W`l2rOJ2N-gtu{cFY#SSwxqs`0$< z6_aF<{D|U zq%vN*urVAFiN!?gM({UeSW+y~U*ZX>oNwk>MigQ^9gYcZrd6)wI&T!M(_rn)USM zb;D}Y)bf8#lS>QgPxv;vrk5Y|eS;nZfso(qU*_2&Zb;wQw~BS@Yf=iFC~vN65i&_s z3VvsYhTRsPQPDClmhC=o`REw$6WAhaDZ?+*v)mldc=v8U%I@LASbprURIiwf9_6dT z9|&hDR-$(#WTTPF(Lotks+~eD=FOy^n!C$FsMWqAW3pj|@w_?8Isf;gKXGJ4;qAgv zxVvzQp@mJTUrkp_w*~uA0lprcqh6TMOwv!06LLP55yhwm#K^)5Vjn1a<3pt%V!FyV zhVk%3cRPD$uRs>YK2aH0Bc}8G6~6ymRaU4h^V^@Q&%`F%i=wguUF|M#iS3}?>pDvJ zlSV*8^gVz?O?9|Q_6>1sA|g)4gvOHEw#p9*22Bi|rwOt=OH*_Ahaer+y|>A8`zf} zKXhYw8=*VR{z=`V`XC}=?`V^f$_1y|Ea#L{UA0|Ll74)nZ2|fd49A@Of5Q?4Ufx~x*3gMjj)Z6UQfNeYcVs;8 ztF9XC#6h*`>U-kpfZF*T=|QLeZB?IY=wb>F+^uF6!Omx7i@G|06+8wP`gv$2a#wOR zAx&oHg=mK~85>H)Y*d{E%0nE{hjsHK5GWqb)aCLg3Npy{0d+8jF*_!fJhYVA*MD#S zb(y7s{Vl#!NBse9S)A0m4zz_-_!c!F`*pNM9p0!)X%MDM`I^nLwxLgC*G1D+K3K*- zk=`fVW3Cc>l-J{p`46}}b6e;P_{5aAQwqw?Qu7A-&bKCMzYzlGN zvd`1rF@Teaq#4edI)t@@g}`1(Tj5{cmEam~mgH&JXw`(kC6R*b<;SaMNv07igb#vi zY=flFw5l*Ru-DJ22YYThT~<4D{8@gA@5%;7oXrz(TBM?+ElD zqImn2cR2Cv@1o+Mi3gyKI2qClz(UhH^9r973r14bB-2-N89pdR2X!oM@Tk4zsNHt@Ol~OfFy< z(ke&RnauslW*K5hu&A2@7p}vj>pr4K#R1+J;cGTYer392SNLx6Hczohx~?;d?$^MMYHdevf_;&5q3Z-+%v1ZyEZyZr#9>pD zfRC)Q-S+x?6UZX^Hl{-Ea>h~@=}LiH{)h)fFp`17eDD_Ia)@~UD31E4JNA-IL6PVN z+)Cdw&`ds+_ttLry@+`hZ4y(gbKnNF3+JZ9EILPyvWbG_#7~D5m2!IcH`$f=O86~z z6s7a%SRz3q^8v6Y0@ENzVno00)IxRpLM+K961qgk2mpW`&QNO3oL|p8ZQzz zfIa@p&=29o-~-!Eo`ye~N2?FWF=ja>(@Yk(R%}#m)@H%)gHGvbp@Hs89TDNsF`V*j z_C1juCziSEEW256xwS|qGb^dg_o%$fD$G3Sqc}FrYxOZtWdk^;>cQm>{ z^D#k(PEa<6B{CX22MtkoBL@Yy1<1+zu4LseyTpo2Rh~hS0gQGC*iSBsk$BdOpz=s7w=PM@zcTU?A@G5!Cm;K^7lLlz5Z7!c2xS=f49aAPL z`%BJO56kLj41sVg(P*Q}8FG%twPwR!?4Q`d?lyj-`qcz0Y#j?x3 zgL!HjlzYg%+W)35ns~-OX5ATzHY=p!!3Q-?*iSPhX%8PZ57P^V1_Hpu6YBSBPdP!nJ zFR%@r%iO_puuq(lKnw_@4?HeMpSruY<^eI{CpH8B8gk4#4XX@y9S4Y5Y6ta$zUd#2 z7OHEaeB?L(300+Pth_B>jc$P}MH9dg&W=!PrXG=aGW-_sxS^vh52~h$v009b%t*>d znE)$3H0bAs`kD%NhlHWA?iNmd?M~wslAr zVz&^$FI{8h7G+n>U)~H=+tjC_q-v5nRdrw2EL`TETsud2pDFju^Lo(9xY{|D+s{15 zmqf++!hpx-Np(I>FEq?J$sxjyqZfcwGA3{zWXUz8Slo%1tm`VNQ~eYjp$=;g@B?m5 zaI5H>xSGZFw_)D{pX0sl^SozR{VADbhUmHLKNeql52~+t6s_d%Bwj7x{G7$H5rP7WmGN z=cE}C>q}-bYq}_pk+~uJ0_HiP#>dK@fIMNEdMJI>yI5k6{SSG{?kTvhI1utmaR#l> ztP}dmuT^x0Fh!Jait|kk!HE$3vPU^qU?Pf3Z(tjOm5$58#%cywfwAp3?3)8SxdU-m zbqDurbSe}d{AGTxZKi96?=rooE+-9$EAze~+R0NzC1jO{^y>J%P#x#Kd90fQi}-uN zLrgQ*Zq|8ml7A<1K|y;UO9+_i)+26sg$FYB@O+}y0H;6&ZvwHO-H4rrMHp8bO?Zu< zEzWicxu2MF#q#L;d>j*@ zHm-o@XU;k0cW{e+8Y`L}$y7;9 z+-6WyNxp2e=aXEnts`(QD8vP5NPF}r)rdWu|3luGY;Aw#Md9AcCH#%9mfmu*(AOlu zGo)DuquCq@J{9K`(cGuPX%zabxQbEY%w0xdDdQKU>%9MgGM$UG*MYuDvhTS#}0zc{s#$ zQ$OESjX>@o#=#zLr?3yN~$ zBBU@NA7A~CHL0N@Z9wO+h6k5&!UTgvdytEvZFOhCb(&&%n0luMm&GD; zV7X`+dYcnwDf29<0jjC)hGHV+Os@`#@@NNT$wVL>w2Bh`KwxB zYZ2fFE;=go0cyMIRm5}HN*&;jRwgK8>11e(CPRB%Cg5_8nFiHKH_OoL7N)?%mQA>TX26e}+9?|By^`<=8E* z9i+q-Wgg~jTQ8(9Gf%MoNDg-;Gmuy!l*z}aAaA$&>fl4^OyM8bW`{6vox6#-WEbN* z#R~2>nMZ-!rovl7&T-bEDc}cA9CcVEV|E84~b&u>SvKo#-+=4Z_ zF6^n2yCI6up7Pni3(q=;FaPc9UKQ&;fESv1m-)8#_B23vrU*)GF&~ z{efT~as>uqb?j+m>wp>np%-BH;AT^yV=pmWbp!2dqnvimarS`Va_?>?CUl>)6PCrv zh%>7ZZA66J)60HGK1!=WJ>0jT7SW4F2lYfQ6U(`drJHN5Zc52}j5l{LsTi-1q+?yT zYbzbuthUY)izs+dx>wx^nMh|y72;H~N-%@{l)A{Plt!|CW6L-j`LQxPHLk|u9f;(! zR{yU9_I0#xpr-_TJN9@@5SxniHfJlLF%7kD7m+5OD9aF*@Q(0ahsK7pxJCX^G{i22 ziY49HC*8Sxd8FCj#nqV8f(iJVn)Lci5RMH#ay4gaR6~SIm@_b?E>W(R4wU$!W+~&y4csM)Ug!qaMY5r9kwiV1An@ED7g_&^px_)asKc~5iM|Nk9|TB-=Mj9On$HFP_Ws^Bu$`;J$5$3nR`mt?@7JT9UDE zW~!;r#zpQKtYX_Q!zBMu?2;ml{N`!Ha*|Rk2xBD48ZB&tpAeM1@O{>(l0Mb1FtaWF?7uPXI6=lLT`)ei(Kz%1Dlah6OAH$qw< zFNHIKhT0u$XWBumK|2yc(|pf3-aqW_^dw>`w!pbVaT}gXU10SFZ;6kxBk>~kY;*+3 zV%`xQ*snNZw~>8DO5>y_j_5$l2Ziu>&oQvd^_je{RhI~fQ=vr2kEKwA?j^*Bu zpor@3b-0E?Jp@VAB;O(90`wSrlj92E1E=FtIEQ#|$p9Fp?1W1_Yk9>Sp{Nx+hng2; z!Y9ZHmz^!-{t`amR|MMt8_?FQSF8^7W}M}%h8EL%YPDDw$z=4pE6r@Abzo;c8$W31 zANcG$jt$2R_+oO1Zvwu~o^PGzZwBY!MUF86IV%d-1vlXp3fHk#0w?GiAVvp=o`Jg{ zFL>WMW3^=>3w?t5tDFG|v1OjosFJsw)>-Zt#H{y>pW)!=13$o8IGxkVX8~7n0pTuB zP2DH>xGsv(0e#80E+e+ue#-QM7z%Hu_Tmfc7n{1mUy<=tNv z*{wdz*GIHIBRu04qh9#E%f|rT3Ekc?S$*N{f9vz-`v%xgV+^qChIDK5sP#MFhq13%l97 znWCk`Bv*84sM*y@^&ufzz8O0Vb>S`)&yjQ#iiw-lSKt-#2i)mgV2vjp=$-l)as*Rr z-RE57>dt<{BkecI&u~-TC+95UUwAdrMZktA|5uA1SuOY~Xbh&KHqn>xo#^=BL&anv zsTB#91t-DX;S+oUkEVA9!Yqe5D;jv!cieonOy9G{Odj)p1G0pR=|*4=)iU>RB344{ zxab7Y8Y0c>4gXKeVy|IN@`OMe!9_?!&q9jvCH{5J#)j3-D{yPX>*#1TJK8a$saW3; zTfnJj4+>o6ER>{jD(O#%nLC4P4Sg@zF8~lf$~k2-sejEx3ma5T8b# z8fDZ>@m@L(Y#JQsQ3hV)j4RiX?)=AprhKr$Rrl4z_3pIX4ovi)!q4*j@M3>Y@$ZQJ ztP4o3dZ2Emd`$RhO%G*eBP?_sI7@g!zMfX`#$bb;W5l}~I=haR;nlTvQ;=KlDUb2b z@xAdr53YxX5kuHnf+KVcl!H_t#heV;*WiDi9nebb1Gb!=N&j`F>OXr5*?UNkTIM=w z0a?w_Cmd^_rG69M8@?92Yo0>=ho8hp1#Vit`C38%dWU%|9Ix6B%ojx~pP?)8T?imn zizYTQj`qaO+&$aMRE)yIL3fH`IIVc6IVacwrZvlh ze&K3aS?>G7I0UpE^VE|n?oS#*q`(E?OldD-F`a^iP!#!$?$F@8-wZqly25YWh6V*F z)!M9{4_s;BySfnsD~82kpA(k(8U?~9{~>0P1p;Gq-Q(?nPxD`sY{8Bi200{wWUtph-1E`7TinHGsP1Dtg(hnDbB@!80)5EQ zLMql4wHvLMaN@Rxl=06-q{Od@tyOnr^4J%2`GTP9Cu?kA0`Qp}>lb=*+kd`UBiOV@n_(y~>%pPO9$h#&9U?Nz*-e!jS7&9sG)g!i`-a_FNW9_NI4`k^WN-*jM06V#T9P6g}ZR zbQ+LGua=d_7SZ=fR`4ipMGsITgN?*upwOAmY9jISzac?jrL#EjKzTB> z%4OK)24=xe-J$$}{l1QF0khQo$u=aIAwI(TMa*))^vnYzm_5NQ9+R^iC&VGzHSDiI zX#-kYiM?cptJ2}oz&W}t&&co24m6zmV)6mH40-JvYYQ+*!N>Tgz#`Wr_hv;dT;%JD ze&v;tU8P+Wx9vu3F83Pn4f%k}Oc)(N0@M>?G&|Jw$uieF8d^qO0;jr8A7KYr^8+vFBdkrtJ%aMpkbOkG zcyF*7&I>FLa0I>tw{Twct%g#)eZ6Zq25O3BOK>)K084{(bguBG@YJe#&>t*^Z4tLs z8BhiBFVQ@(oM%=Yp*lIIz?0b-SSRE(e`~Nc-HE*wYede(w|jpALVS^Rxf|ekf{_4= zI}MA*%RCdY@#1^TRsGw5k9rS^E5ky$_M2W7sp;vlTzJ z0ePnQEZ&CA7mm?(Rpqc}c%DGv$j?9&_R*Ka6wmYnY@~k)zQHl98Q|nvZd3(MszOyBa*qi}b+dwU(CfL4u7HQO(>_Yzx51eh`4*16f+#!r3g44?d=i_U8Cc|FDMXOa=84`^1vMHP|qgn499+LYzk4 zGZ&F1Y!!Pmpk;BnYSseq6{{dMPR=0k4LSLIz!JlCw;&uBq|;2CEU zne1x?oDYr-{0`b23tU>i-V^B=i_bEB@pU1()nk@>zE(sJ_WEFj|2b)7&lepB5=7@! z^TEf=0PrXGowB!J5W0=i2}$87fPdjc$iPNeN3iV#0>0yP27{Iz?(4+BU|qvs<(+#3 zG?8-%K7}uG{p(djDq8J*K-ZCt;F%5TUM^=aFpZll5V41oz0h*r6yURXqCgEDM5m$% zq7}u0i~Qq)k#tYH&Fa8AyB?Tl`~ItEc|lLAIT2I%`nf%xvq1(O#~H`|32Nm%L$4@C z3**G&RBz)Vb{^`tJ;6e3d1aCSJz#~O~2f^!*2GV zraO+F3@+l~Uwt-ONcBZ;Xj&t(Kq1x?Fmkp0wBS|j38E(q{{Fxqauy*5x4Z!vna0 z9WT`=|5Jf<4U?&vD-ObJ$l>uiyR*7B)Xr$XBDjb<487((?e%)wnEs(7*-s1)Dw<*} zj+`SzYlst&TU9Dv#-FL-h<*v4hbknK1ubLxse1DRqA9G^_F+51rsYkmV( z$>XMi0sjDcE4)QymB^v7?9ucjo{eWFM*0=3VS+u(4aX;39vr|u2qQ!U@h_D{I`A5z z2U^6sXzlNA&3(mR4uM1(2DxUl1js%2O(GomjakkA25$my>8b3s-1{JekLJgz@=y!x zX>bjNptNUdF8l)M;;y6-z8MH{(7R2W5hHd!@CA+*fV}UMY*DVC!iw4 z34aZQ(7#0+B-yZod51g`A7|GD3PD2p)OSzMFfn9XTXXMZ&wghHK=~W|i_jLqR?dCW z5m=8M;kH3$auUHA9J>fsUQ)N=?BT59GNKRAAG^}`gfo{8U{Syu-wsj~2>RODG3QqD zq2sc7wzu5z$zM;6gD3JwP*Hwe@HDGPoEUPEcatd)y_U5^&q{iV%iuJkr(le77qlKf z%tC=&mK$H^i1AGnHU@@U-r_ba-Y+1dJPzAhmza6SJoH-JV_o|oEs^6T&}90H`=hX2 zJ^+I(KS+qmuA>Hh)@>8l!k|IH=cA{vp;9_VVeKo3e61mLU$mIadY4$p6g#pwr)`;J8_o6NMLxdgBdGK5?S5P8b3+w&!yj`g}`UZ2_ z^Tgc&O5<;YvY5xg<>+nEb~$vwir@|~i$6-Drr~e;CXBizuwngD9WnJB! zjuJH3;O_43Fu1$BySu~SFu1$>;O-8=9RkGKO0T?nKUst(54yxms#D^zOV99_4?^FRk&YZH5#B)0G)%s{Fu}QCa=SaNcn{6 zflXjOUSTe@7ElPg+xftBs^QNOH@q1m@|gpF)i6Ir6mz-t^PmX-CKZlZ5LaD27##RJ zNy}z^*T$wbW+T{AEhW5-c6Y9(B6X(^!Yc}^L4U^zfucIi_@y6 zT{W}HzcZHbWYT|FGXtaa3!WFAYOHQj2Qox`*M}R{wro(PksApa`mw0TxW&s!4XzNqqo&F>Sg4Mz};XDPsPZ5 z>@CmCf58z-O{24XOk8HvrIXlx?Sy>_Ul!b?B`tyXi#epJXl=y)=&xX-m0h?QJ5~D= zEQU^-K5-zJtPYgE>D2>W=t1*Mc(pYV## zuY6~5#rWCT8^qmEODnk|cg2^4H%WK*VqcnkMp!4^cb-rR9<9r1Wl&#Xp1vuxEa?Xc zTN_eeh8NoBLebV#yVIYAUwg5?qu!BlXe-Q|VPotVIY)F}C+G1?e4&q2H^%=P8*L6Y z^2apsO6ZBVAu6Enl~;&oLn-ug?2-s#KKXGvJlIzNO5jjB_j}Xl$(N&#f?L`R92<2l z?gK6og04In6X8m8f#WKS*j8yS81F)=eApXQS1c{p)`b=s~j5 z4Q38~ow35B-u9=x;T2yYY+g2(gz8$zyI1}x+CojU8LBPSLvP%v zp5>12Tuxhojz)()m2g151|u_Ei-a)0kzH3kdC3ZYk@Uf4Mb|#P$Jc9tcS?4%SIR=m zYyA%I$9~u^R0S0ky}Y~jouBh&@(vgO3B-5{#S0NL#P{YqP&KYu##zRj&_ZJz-znD) zZum9OlB}52&;E^RA7L?i)Ow&@)8@D{d+v$4-Ogy|J|aI%|Din+n|P}8d`T^=vk}{U zoxyzC-qn{CbsumSgD;F}yj;dnJbT#7dJ0*j5irIm1l_c2xG!Hr_PYk~sfH)qom2pg z{TF!b-)Z*s<@aW?mxdSV6I^#9ZnDaFBf3dTcnT`b%!;&d#CcC&bDZ@S zPm@N8z;2-pwM1IiY-ssOs&>yh7S8%1IW$#D=R*QL{*+3qBTRB4|RjBTub$NSW4>fiJNrt%)aiKF{Rn03iFRy!yJP9)uW*TEmpGAF0} zoN1n+mkf<%xARJK)ETr{_#r(Y9;cN(yHO>+)8SJ`sQ2X^&ZJ!+dYCH{3Gu|JIi8_p zrl*%XiyrvEFyqo91pTtXAhHJ@Cb$t=Z3K#Jh;UVltUNf&A2(%TWNv>f1 zz?0BOE4P-P?xVZt6LcR?R4&w)))$t`O@fQVb2MO|jXW=KyOo?GU6U`kZrO*;UR>et zgh$9mj7*T4#$JtD;%K+Ckiz?sZK@@Gr49Z2wDoEStGPZNmeu0YCWM{_=UE@jZy}$a zA-XlZp^b?glEDkt>D|dDP{}=@Eq-?fNb5A7|rga4c-<+T<;U7;1r+`ajts9^wBht(mrvZuXyN#~t1|3dLES zX-lQ2cNbVFPLL0?cEVS6yx1FkCwa{YR{zkbv^9ZE=>xQ~dJkb1DWhFB#)LcZ?z*X4 zN@hBB;itP;vd0M-vOk$M6h^Vmp>zMA(a{5zDg0W>rr6$3a!jyNdWxPIS2VL2la1A2otgz_LmOR> zU=GdiFhMb7K;VYe11)u5l!}mj!bsB59IjR;_YBeVPOM-P`hoYBexVtr&C3ftNef5Y zXhSy%4+Bg8M8Hq>9VZJBVh#Ki0(mjv!PEuGw`o4k{n>tvGV2{*9G|;KLq>m1-v)OZcZWN^+KeEJtt7# z2$(133pk$i!{_*MVJf>Ue^5^w^WYr!QMlbo#$(JmMrEE$QP5KQA0J}nl#e1sY7_ZW zUdSfkcF|YWWd2&Z7yT?U8+vXgs#5$j&n=}l?nZaeLt-U+vNp*~ORZ;3N$-}b(0WQq zvrniM%Nkn9hRR+~iuj52kfvwy`Hu2=C|NkB91WCAZD!@O>xk8i1%cAGmw(f0WvTCT-W3%y=VlDbQujk3wt(^m$@Y8{R5 zDGyS8KL`A-o?gWs6*~3%F8xYk;al-wR6e0FS_j@p$TI<<rs20ly z3P=;!8qw{`hS%y_%r0a(FRpwGhC^Xi8rFhU7{FcF3p4@sPMfa%tDF%kLkrfmuJc5Y z-)IagdHc}$>4*6-?{?oFd;pYSN5G3vIV(}T75FcBM(6{k887TtU?N)V?r3nSzw*R= z%rjQ%AKN#==e^{rE9_xMSxr46s2CCcvt|=^^!KXdp{!{*I`k=={O2xs3~Lxm?1%J$ z@IzeWdMu{murDc7bM=6#dy?P^_volO(iQ(0F{}*2Pt9D`B{P^@FmyAJ)A$&;ADnOh zb}PQh>^onH2P*~1XzMjC$v#;-gj=|7$i+uH6#8p4&E5~Aj1I(d-}_ zZ#QJ|Y0>E^)Mx+2Gt$DLPc$Lh_z26tQiEa#}`(vTSxhK`XyzR|0oZdPlA7?rRdS%*!B6ytwMLySLQkX3JZ2qE z*%_`TALWs{px&D36CrTd;BV<(e3m>yHQ^=XF?N9>xC*%f zI-76Akdnb20|t@Jpt0|xl1?(fM-d0z-;KvON?iv3GMk{W;(g@_{r=}?u!2@3eWRmS z&b1Ecz05J7q8YG`%ju+F(gia~ibnNlF~O%QQVZ>~KG<4`eTpx=?eD(wzfw>07K$|H zn;StEZMapH3?#%H4OCQ|7Xj;}yq*NB9$gW?Fn$95<6mMbaUH#VtPAPm^`*pTehwE8 zm$i=u_4KDful^RcQi{8)(&k`UrY~9C-ki$u=tYhyel@g~eGuQ%U8YLw;A0lE@6&33 zc=C|c+ExylS*xEqh>iBm5xcS$!XEnx9_lE7cOpM}j;cO8N~#fY*e$tbp`7-OEf-(f zO>`+xFK~vC@Ey8C`6YZM=bgzdFU;rO&ufIonq%NNFoqGSoza`0SCWL0mQSrH4$!-h zS%IzL(cVVBV|EHpmAWW(*kW1}KNKWky?%^zms*O2VM|*J?l7yGbJOaDa|I8CBf?eu zX9K^5(bAsad(htZMed;#RI|v-d|zBIlt12%uA9bpcqjg$(|VI&NAjGaTU;0V5eP)~ z1$|S#!_HI-+793MAo$ukM$7+x?@urvVnizF(dI@;@wt^Q`jV6buwYDgb(((OP7;W7 zH)T?flP`J^Z&mzCoFdP(yGoZc`h+rp7AU8ZKyIZ@`1y?OK}V81r?z4Rr2HUN|6)BB zCgUDL8(Iear#6;Vc@!K#?|1~&XH>C2I$a+N)#EVQmhfsZo>!2Z88VaYP& z#!pcbT|gxwBb6L>R+ht)C&L)&ic1yS@~$=k<*gfO*LZE=4w1v1gL$}LeXPt2A1C#t z7kn30m`P6Q`S?O0@Z|Q#`-0+u^1IMjmUlQCnL_ z7Wlu=6`o1L7Lu9uC(()q-`l0}6J9#Jg_IPQ>Q~tvySF{uc#wS7T1U>2>GtB3vcX%p z8BL+5S$Z(qXsB-`l#Jqa+}mk|;AiwC3z9$TZQ*fm@A%H*V*9a_K^QFb5{{ZR(Irqt z?<6=}yPlmca8&QCfk)x}CXuGGutLQn&T~Bnoi0t#OBiG1siHtPTM^m->5MwUIPPSn z#|C1w(zvp4K0HMqWQ-DK;p@^d-)MJ9cEsF98jGu4%jJHGqW3|y1gGs#90n6m72=_P z>DAdwskZeynBXsNO=kzB->h%og*l4t5TnHt3v>$)W+~(V3xTf|F%BD8?(WKh#+VO` zjCLCOEnlV^Q3YXwWz!+Jf~ygTw2KBmsrkG|LviqmsDSbm1w&?bc1dZYHA#C5%4rWl zKcy5a8D4~Q+fT?o&mi|*{?^|`%R?4QtIhW5JM`}aJB-8xvf5Zd+S`6)W9M_kPb=}h zAACIM?;R{Ivmf(T@(spNZFpCx%C^z(%HOW`@=>c*FwLw%9!beO$QHr6zV)6dQAPZqt>&xK~#p3n&doiew4Id**dAqPH?U^%;jUyd6_N@hZjQqwf zUMRARry{%&D$4?%lhNbUiORajF}{t_pIyH}n%R^MQJUei{w#sy@%Dw0s z+CXm;jx(Q-MQjNDZ7J5$;AdLU%4RQNtIUtqS-H2f-xLvg%Wq;%IIQkRd!?(TT0|O7 zo@-5A71caaF20_8k`9tD_7@nVXC{e)A{MuPkSXRJRu;3AbYq@bM!yZ`u?A)`7!7FX z1<7yKgnQrsqo=;cj!};)H$mNC$MATmyu5%VfEmcrCX+E>9_bcdgAU7crMjR(D9Dzx z8*&HGkN3i9;ew{eo{6qFyMRn4m~E8jG#X}cxT^71A#H}u5%xB9XJ@mMRskR;f`#;= zxt)X%F%lc$6+iXue1v8_bG57Ip zGaCrSQ}vQEhi5XQB4EU6rI0M6tF&UoZ0WlB%b(BM&Tg}g<}H6QVI|F{J>!$5&$w7f z6%2Wnv%?**2S_XI5Y>b)3WLRPRrpESBg_PA^~7Krm`c{dBKRqdPfave35jT~yiMB? zSYwuig99N@&b2#gU(|DLnCn&4SXX8~!;Wyx79UDO!+AqT<-6W8G|!(UG&9c#8p38~ z*L0nEp(0dJg4P$&iYdwOg#Dl#zYiwHJTS$y-{w2|7>_nD5vDgw@1m6rRUwAy{pI&t z`ad9EJi}&(Gt)}$z2Yz{k1$;HJAT|~ZArv>PbYL7UUjWN5A?^{F!s&Yk;SIx^`G-- za)38ywv-G0NO{1=;2P*(J>Z(^xxu#ESuH15t{fE(8SPW1TD=vZJ^%%+1ti5gUJ_7G zu{@i~?~&Q=arQ@7O?jVjT52Y}Q!bNd;y0Lxj=~2Z9=C_JrQ+rjJVG3WCb9weWW;=P zJbfal$`5A)u0YO#Vv6aFRZ`R>&@7Z2w00em3)>_0ZbC#vEm5~7JKnd-cL{ln&t@6p z8{HGErKPg>azV$NmW4I)I4uzB?c5iMc!V2!%d3M(XFgy35WAVlJfr)dXNFozuI<^X zl=JR)zqiJRM8S3!1g3q)sG0WDx^FxRj1DXka@((i6O$%dGf_d>QL1YG4sLfCvX4&6 zG=uPiB`G}^7qF{n#f zb;29X=`s(s)(Z$ewq34|ciIKfvgrBV4N@<$s9Z=Hjjmet3@D`v?>u>^U?cY}_i!2N z>2w4v%8&79c(+(v7)qO_G}hY+3C{g}oSq5|2yaI=eX2E0EzJ7Li|i3W5!Uf6v6gG4 z9dfHV&Pf|s8|0NL=UJpr>Ja6moTk1OCh&R@^QGS?A9BMaa$LJcHX439jwA5pKeQ0v4!#n}VZY+1-I z*7bg5KiO!Ws!VW=A;(}Vdo~Z+eTysq?$WZT z0ZOItd+3*zhk9vop(~^quFhWA8F3xBJ9q))#XFrw#RKd=*Ldqwpa^*<&E;R5t?nhS z&41a6$l{NMQFsyR3{MINabDI+?n4h-b$P70AJl=*_1;=Hb5v+p_@bWc_Z?G01C54S zbLk&`!fXT@l03p$5Kvd4d$5V?y3|Xs!kU%EsEIn@7v>}SNgEh?lakxg6tCVjw9F_4 zKk$+KCOB%}gf-3AMk(CKRlxB|PEx_`Q$9!nZmJY>catlM(~P%Zg#MLQ^<)!kvs7!5 znuO*UXTuwLSNB~w)Nypy%1sgE`&m6U#}#khc0S+FwP)5lE7go}==vVQTOq}6Y-~oQ zUBysStBcr6tt>d$3Ok3&(nM*f)J=-Cp!P#<>Um{nwnO4|JPeJ}kFXrBg>nb81YM<6 zLU*k7S`;~hLv)}toqjQWWVIlH%Eo>&pWk3JVVtlUwk9v=EMu-#7;Xb%;G1rMsXP*G z#>Z$5D5D1Q2m6Tm#{E({PLH!%@>2Iv?-++4ZI7cpIoK~fRl2G?MGN_DK}40ncR15( z!kY1);HvS&Y+-#5thJ{EKBs+8A7S<;J#|5=3e#x3_0Zh{9Shq$kCf<*5@l;Ht{q!Z z7-HsN8xixipc9Q*LMa)6ZPajP2Y|3$0CKeVBKkY9Am@;g0)P+I96fe_KY zI;s4rqCadpJm3{|H5n*ThXi&q{mwIbIoiO&Ds#_vHpZ;*6)9_NWySagB}+tI*AMbR z&f-1Gi@-wsl*8eryYdo0>dT8+#n>BiDRr{BSiVGO*vaM`xK;jyd#QQJYe%70<#C?s zVx+687*f~BVKt{GSxQs~;w|hqY61V^hxG`tAb6kNFSNpZ1#jt#lg0&eFqiO?9JdP_ z1s!c{HZ5q6j(F&;D`ln^!E^7dm?=;SRB~O6+bSGkNn$a_%5oW&d)==@#Fk_CB@NeL~ z9G)t*bnn1@g$zb!woi?Mxk-Zb#?zh~v>SZsz9lvkw$S5J75LDoV%{SMt%biE+9SnQ z))^KyH<4Y$)<2OBY(02x54VSdV^Q0qSAhXm66oX2;AWJB$EKAgI&2@hr!8Q)jY7I7 zbyzTnF40nVAj^u^Yn9$enTy(oSZs7$rvhDo&IBa=qm{P#xA4Rfj8C zW6}q%6V9_ubT=36_NW|=Hy)dN+=)V+WWPNdx!`Hgmi|k&Iz;A75ahFktGJBLgWljN zYYJTK^eg`zDiO{kHN(-yy7c3r9%^+pqi_nBL8$N=zqn~&jd`PF*OYMMBlXn6=4L@3CwqyhK zZQ<+QX+D`v2n;vt332j~p!V%<=n9@CZ01&Iy?Gz^lqN~nv`TvM2+iYm)#rDF(!NPb zKpLbxjQZ?e?z$^XQX57#1}UtfSdiqiQczE2kVBDI;IqsDj`~TV%Krq?e$+zGB4_gK zv_JR<)RQCB98w9;Ux{`7fJ;yX{I9P?<}4l?bQd~#c1o@BKzz7I|dI19PRaAkJHP`XRM6X}!x25-dw_86~6d&MCAZckSmh+~AdAPDoI6wrn(0RfOn|IDgNL!@LU3D#6-0?#;9QggkN_DMhP z?~s;1ZLg!ol;yRoV0bcIq@;r}Qpgj56U0pFPi1smri_`{K&`E7M%33*0LS;_l>r}9$Hr@Mgg2j|e% z;pJdIZ>Vn!23>o^ijFq5CfFQi;E}0E!!yn3-#6Jr2^o#`OJWpVNhgR6KtESUsTQv) zuZ=zzfnh|1;=Uo|q~&QN;UC`KA#^X{Mxm%+Ha;E+Rw>%X`oCj%inQnT@NDaScv&E) zng=Zll(Dw+RQl1lWJIww!Y7B!S?Fw^8Bk?ZSGW-R>}b9To;YwoA4Wg;>SXNZs4&x` z*GHyB9ui-;qSOWg0MC_ZX$Xz8-^(`~|7mZ^d3X#OsUP*{09kiJP3c2-5%aL|4W`1o zs36K8inogin{gtXY&R3)%|6x#S79LzCc_$_kmGn1mUb!4`AOmxAHhM&0=2&F2L)a2 zoJNFNl1uF4ZGfIS&-B}Wzv)pU$?781qX)v@tt_w?Ps63$bzzO*X*rKFEAUFM z#1o|4j*A!pMuF+xX-XQN&O^9_5siO&pDOivGH52xQU=g#Y>m4Jx&c1py8e9Ox1qSe z7rBi-`Oh(9r#yO3n|ZIJ4-#_ zI6j@XMeFGuzL_SH2SyP>@HEtbPD456L3F2iMXIPSLYkInscm=652fD_ zkXJF?D$PstRC$lmj@G8bVN0P0S53c@0%)C*E7-}lg-5OnaDe#&C#cn}ScM6TK&mhMVnXbPO#6H8IHwrTW9k zNWhYvkHo=6dTDE{*o@j%d*cDf0j^kmX(xM)*40=F{3r|E8*XYeQs>Eo^}EjbJwn(a zRbY1_D|&kKI=GMfwW}H3Z8n6RmCm*&d{k$&4G5+e{nJSsY`)YQSr?5Gfyrr&w8Da; zMWuB$tMaxu4|CbEazU32x{yxxA*mIrh3ZRTIE_D+$}73-r|>V&s0hp6ls<#!2Oq58 z_C33xtAuFyyMu?%f{4VEY zbP_&pv68Q9oQqe~6X1QNs5cO)s5x90m3ZTO)!8w0+Sn+)f&p@8zdRFse{=f>H@Lg9|;KqxyL+(ogWI zJHnb|A5c5;KdG719<#q-NAxk}TVSzC?Q9`;sJuCxzIUw=+VcWD?8}znKkq^@Pv~FQ z+K54BR&d$#T5hJzH_MTtLVMOO<%Cw(oI#5)pOJ2DWOB%`Z{yC+lsLoLg)ZA!|2z<8 zsvfin#0NfxpUEYKfL4Idai_{x>@_T)RP?=;=c9-0spoLi8t3<}+oS1GcTCrm|}OhI}iT9IhzTWTyk)$qTWKb;c4=yj??iDM?_j+|;+qHCtWdt&Q(_ zS9xk1)zg#tQ`k%zNv5T4wpu%M@Mqf#V@Yo~Nh#0o!zj;VFkjE>?(1ny9yv5oEc3{{ z(C$zM$IIGa{wrsar_z?;nvo@9n@Z)V3p7`NE7h)`EpeT3$D%4Yil2lo`8VB)Q{`ob zZtrx|*nb>V;{p;{h43D@Lve*Jr_{6Fx~I9N&`k5C<6O^2Qgf@}Uuq|u#p-WQl21o}@D&92#I>HT?2s_YHCoLGJ{Y3;3#;~7+TMRDb(6Ks zEMiX9G9~MJ3|JR@>+cu1Z70HB`gT$e#pqMO-y(!{$p9x^-CE9VPjXbo?vhXGr&ZV1 zqg9}_QQDltmxIHOo7TcLEPB7MDX*!IgMKj%%;F=o#=7V}53i?BM{C$$xHkF~s!TSB z-RT{6Q2I%*^%ad46c`AoL%@O?E#<34JeXx#&XsWCgJ0t zpqW$KF913!{VeIC8UC-S$ zk5MLLT1qF-$vur`FgM|wpo>r~Dkv7^`w(VN?5XM^*HkT^lPbw#FL&PuFU`_ob(qgs z4GW+otui@hLqjaRTkVl$N{1164&sS&n%EA+cnq(kuCsbj3)c@q#F4Ogqb)xS) z?X8EY*&JTxyTeA;4|EAF5zlHKDb@aZH zbO~DOI>Oe0WB3QVOv*q}8em4zG^q=Gz(v;A@vR(qGPKZ~D+SS_FctHHzt}^ti2#`B zBpz!ybA5ANAbH>}?HmOVhzG^2_G0}R80?-cR@Vf79dK6)x^r?EtYAO2O4-xdZgXg0 zHff7WYdiIo{1p`#3z-RDK24#RIKzC_-p0-GO7R({kyEfpBOj6_j$FcCWI!hXU}d za*!gj$8mxI`CA((E+@oK?deVj-&Ji0ivg{{C~Ic;ER78sW;eJN)#2HM=W>EHM#&(x zm-pbCVt3d<+9JQ_EzDssm-~^^-|_eFT>2(u6v~0;0>mcb9?_-M{AfA4gZC)s#G!PA zfMpeg=v6w<44B`U2OSEH)1iJ`D@5JX-EAHE0c z!3A_Y2|E6CHE}e4$qB6s=7Ng!fD|EiAqjetm0A4Z%El&HZGZ#;envK?@5NPo8E}4a zqgzFV$e=CtM%55;~ViRw$mD9p0d4R zn3{%4ie59nDTy1UCQ44JyXzmvvCOU>P%6n&z&NWVYl3z7nsp)Lpvt!R3C-yOe5ieb zpO&w~{JbofDSVNhumbd}xHKXctVR}_Cyg^8>?o2qK_T%bPh|n1&6vFYT)X|D7 zh_zVbzE*QbPEylDjm&kCBO`xViS`C@i2MkDbi6W0 zPDe9zpFPhU?>P8>v{r1lli7G>-Z7cc5$zOLTeE{X?cog4`KCwjO$PAB&R6~`^b$7- zdC*)KLHnUC3Kb&gY}nW;L~=WN<|ba2OwhW99%yG^LA46_JA93Oj5wh*X6x~4+|xcr z+S99`tmqNvTlw@FX>Mbz^U2u}eq+UNI)^nXLhOl~9V+U;nLL<{fZbYbdy{o<;q{tueNDtdnD@B`0L| z`R3c3VUj~CHl+-e3!A~asUL$IpdZ?1gny1Ujtzqctw-TzW)dE+d{fHNr)-hh!u`NI z*U@#>d)`D%b=@J273aEeC&NR}*+&hNJOcI1Gr@PD2%K-l@cC#KpYObhkX-s|_DP7~wL_9w67Mz>9A~(@=K*&b)7W8fTzCjt z%a7Hc@)K7ru`(1;4N)b%v@zk_S_gWX+@sY<)9^2?3oXH2u2OK06;Im3!~7oX4oaXr ze1!ef`I_4HBHIL$P%NxyFGE)qO}+xghVQYBt}Hlc+geNWl{05#vks8cU=A4$;@w_% zH=&?>6{hpgVjmTP_T(!~X33IH$62eDJbX`bJyJ(3gd^lf?5VWWx#lBSTWPP*FVqt@ z5^mtB*0NA`yNoQr;l@_pSUl>eW}`q=G)o>th%r_AB$ngnlx)uIve`^hw&KUaW>;A` z1%${%6z~-Fyu?Go!$E#!yX+iVCJU8xXuu9=f_2$8t(#(3k(mGJ>-a@sfgDM51sxfKN(;WYaO{R`B#K1r`!t?(G2!iEmZ z`BKPAvZZwa2VAnyob0fhoLa_Cq+LCWl#JLEGr5Z4 zeFArFbq|#q*m<<)VU={1N~PcZzTDZri>5c%!dezRjC9!3zG+TC|5^&`j0)Nk`zgEJ z_xKL8H_R*igtHyR|1_HoVnA2X<~K+`dn9;=+MA7obwjK1Vlr3HYPKg^Y}sramF8Ya z3!t^~CAGXa20uZI+#g6j))El(pY+RKN!p`(^n7Y2klUTX(!*!LR(^sPb+6!Yb}QV9 zXECb7eF`*gg63i|e2W8zM4t!R3a42#&*x;71XpD+2Cl}VtnTbDWsh{p%*&hv9(m4bkleGOfg|`pKJN|JO z>lErBKr#>Yk$Qs?Rx+3+_Yhmqqs|N6OvmXtr9HEU3m=^Jh=0P}#3H_e{G+*AEG8^N zDSWzpo5*lBd%-*7Uk=6BN;u-K0Fee@Nns^Bk3)E-;|X14LmgFg9SfM(g5%BF##L># zKGwBgT4WS4dy(662VseLS~_QiSTX#sP(aCuo(C_ouAVI*zrKQn;8(37&BmIOUe-0- zNhu1m@)qEha7JDxoMfj}9_TqBd(MbgOXgZBRIgKQ98ToD! zyB^+14yA2pAEl;zBtg#(`;?M$6DdJ|N59PB@ z(+GQnxJR;p&u(wLw^p+jy+>#Z#3Bj6{|d ziMTQv7F2M$Tfo;W`#8>>NRX@}~xCTaB^I2Ay2BrgZ`#S>)gd1V3Gd8TS|4!3-I4dOhml=)0NqS#2>r=P>JUG&2#H)2l?=7# zO!??J3%*;|%xSEXXSdWTd^~)}$ut*muIN)MbMQm3FHd8q^+fwHEQE$|!D;)?prop= z#D>nPbpWQI&*DG02FowD@a_bAc`2ok_?Lg1u~pguk2u{XCR**fz?-Fa4=0d&pfQ@L zm(=%*@5BMZWu-A$%b!Oykad@=CXP4s{bQ4T|#*dUvyy)K9voPYT}F--{#E zNIuE@$_k@y_8D_F`6v-y*vh5!m0uExwsk!ap7T9)iCGThQR^vF#iMvLKPZew*R7$X zmtMt|rQYamXt@2}-BFtFlHnF(ywhK^-R)z|U<0(8?S`LVR(mpdL))eGO!r%wxP#0K zQ+(eXc8S;eejyesNr458=bRyf7%${L_6sPpg^S+1EYAhUV-H^+{+(v>~3U;#9TtnJRZ??$!7GhDLAfO<|wZ&_-3 zARXQXv*9tljlM}5433jM_7>j2PPFU56S#u79_#WPGzd-=Hp)IHi5DY0XCeMtAl_d1 zBR-FoJKcSYT#xWR)`%|wkz^v@1u6fcP0(jqxx$vQmldN`?AG>u{esqs=D;QRJ$^|k zAQg0a@C!?Om7DHM!dyNVOp$X*{ZJITDLmk^UE4Zq&ZAwyQNu8!jW4jMlXe(tb|pQn zJ-{Q@bKa#^kzW^k$g|`FVioa%+QQX_53(X1Dq=pUEOl^L`6A>HsYDirJ7{ys2eVuF zoZW-_KxeYY+@{A_DRu`?Q_03{>xx}Tcq=QSn;qbt#reDms~|2`RteQO;@`{?gz2IYp_ z4J4RvXiItqHG-G;A0enjIdfr7@gm&9C7}e0w;T^&45&j~tL#K85nSZeZ~}L_KEegr z3}G)i?hte_sJy$sFh1CdeN|4=0kj&LCYj(1_dEJ*CZVvhUvOr8VV2ZI$m}RoD&!9WmF8cudZ2s+k&SIpR=#%_J=nGQC{W!tw2tVPis60lXE2=Ej zM=S7XTu09zxXBmUoAr+NEFiI7nr-di*LgZz=k$)~QafcI2=I^Y4Bo~liWI@~+*Fy$ z53vdI7j+w-=Xijd$UL&yPGg7J_>kjpi=#rjlQ&!MStl*GzR>tbP-L$?PH&61x|{F@ zR zc%losx1uX{vZE+?*lD)L=o>zz_XTfZwa`p|oN<>1=pk!^{ZVpAM;IpGo&L3YYP5ZX zj10g_XPpVnFzX7tB;6Wp zynr9j9a2*FTcx-rEOb1B*>EA+!4L80_Aa7}mNXE1X;=B2B#^gu4f7z)E>A$R*~ifm zo3R8dM8l+*-JVo4kCRqp609a)7M)fzQbhVks(^iVTjrI&Ip4Pv@R<&sp!uSg@bocG`iaqvhf)-6DtEKPCi04>EwpafdR5TFNi(^R{%FrJS$PKX`65U(do>^*3m`wD`=ZD60f zE50M0hwb@l`6tNYP`5+*F<2Z=bo{4{W^Pv1VSVb*Hlal8hNIz}vf4{S`701Bl?P#v zA7Y}i0ZuCMCdtAQ>_>bbY(tXmEUX>~;0)4ac%3^KIDfrj`IpNSWX zu%h%|c%76-ccdwxA^MEJ(Us2mQ_vh>?{pY~D)he5Ny}`PwYKozViXX~`A);5W7nV< zlq0m7yH%CjU^yCZ)irMmPv99)4}M3vr8Y2=RTZ|z7Hv)XkSJam4Y8Y;1{jNPI`haC zFc7b!cdQ%INa>-F53Hblojlifn9lN}a#SQW@P2$j7>IIMGmZId1sa;PNGO%h$hQfl_wSJ(^EjsL|bfK=PB zcd%w!k-U_UpWm}@0)RT8`|vO`#lyTG|BkQoMMA824Cr{Sc+S|s%SuVe=iJ-t#aD0! z`tCUFtB_@W3pX_zvf}0|>xuP-?BZgulUW{3sMu|f)> zNVYff?2ZrF4V>g}?Wv*R#!(>+)X>jx4?aS6Q;lAh%F2siFUjRD?R2kS$N%Aga)>vg z*TqTTH@&Ghry2M;O*HzE@kZEs0M{^y@3X%cW62}@fQNYu>WS*0D{ztck8;v^UG#e7 zbA5ItNuQnG%DbSqY{J|0Bdl#~vnmTG^djNgw29?$zQ_n>L#=bHkhq;!w^r%vnNI;CG!K$v zLS0lI6ksQL8&sHf;uGaVXsq4Mi059AndPC*8&`NUl471S3)=bZyKFo^X>BuVkOjhB z=Ukj?)+WVJIT4D-P-eCpYz8S}fCnuXt<4*vtaO><7Q=g@sr zlx?LMy!BMc#`G4RCBH__^V-n_8-vNLyRZhtumskbc4Hgi9azLkGlkF(@r#fXl;tmQ zSM<%iV;u%%q~^j~n5w60#ht6^ye!9BL}rt3{2uPgGh5GjR_6pB@0={-K{~VTbbQOz z84rZp#4bXFxDK6W7+w}iA|I^S*2bIg9au#?jYpE^W*0jo z)PotoSu};z1Y2Pya*Rat`=~AI#JYmUus{8X7CJju4m8VdOA25`?u(N_S6o%D#Ysz<1f5=BvU2vI^ zq!|3g*Rs>`;d?iLeh zL;E?Ofk%nE;br3EN!B}3m*?QWK_769ULvDGThdD?Eo5*~T+vPwMM?1#oWQGqtY9bq zn``VC&H$c(W^4v23W~wExCNR4&alz!6KWx-C>tydx`Vbj9)4mO#f5mU#V9~~gg0tG zzLU%l;_)!p3!AVz{e?fk7|_o-Ki;8ce4SY*u+vxr*0CvebA7q<{(yrBlWmmJAb2j8 z!bLzK&>k)pE{REC73qX~iw98$`bEeECH_`ghh{hm%vxun)_Ea4X#FSF5^xup|;i*L{PFk=iD>z&-?xHUEd#HTvzfq&spw!?pb~__sksn#fgx39l{Omed%aI zazwlD;~hqa{K>|#yO5)CMkZ%>5J&sl59~RKB$sCJ1Io|+%xTWzEPYqH%Lx;XSLV#L z%aFTWl%64nX`4;v!SZiA+?KH4g)|7A;3wHel#Gr}#c7(~Q8&>fn*f?!q2q{TSM<8b zI@#ilv`KnXPx?LmBD%&)v{n28)Rw2&Ci14f;J$RgjWr2=Gx?YcnZhzj_i8b3i$4|J zocfz|?B^};)y^X83~{E?CT|z)?;UrcoYiP|5s>N6f_LE2SzYTF3!Z|d+U8%@JGvyB zX{|ZSP3&xcHkUIk0?w73Q?nFW+PAI*KAa9xqZud1U%TpT$bVJ={J>E&_ngSP`!h!>|eN(jO2ba zL9?9-Zan95`{cajd}Yu1h0RBSM0Y5)^a}Y0^@Z7^PdUV1(V|k(U(BPBJ@F&`G1z1i@V23Z%=6hNw2WUx-_~&7bJ|iTF2#M^=I&;<32(4viKi(KoWl?y#f%IT}E%XKFASx!HNNHMiq>_KJx$y=`}?gQ&$izbzL>j!XN%5T0o3 z;(IZ_n%vn_>(EncqVop2X_fXbanl@;RMJcE4|toLf=)lL zr+1iE`5E#)_69^YP_{XbPAOabk6pMSOQ*{`j~ot=DiS$jwa>Z)hB8|}591TUg8EJ|*2Rb-fk$};o? z-{`M0=t)CIbQwijbw;9g?S%N=N-x|`FnMU0-RNc7Kc&B)D8IS|or>8PywkkQ%;enW zRa$614UIGHG}%pcg^xRt)FS&hoiZzc6qjV3%Zkj}>A#zi;1_nfXc2FVt;+WTEu3ez zE6;R}nj=okOH{?Z%);Q1te?Se19ZAQ=4E-cm1Vx)${#2DOkOQ5^VoHh_-*O#Gz=^? zdx=eTKFHU(jan_JwRJ8x;|bYop07ep(6V5_yM=0zzr16%uFL_C$C~f?EcbIeht+j^ zJJSMb*oDdt6wyTOh5e?>emj{@xv4-fBdfQ6mumuBN7#2z&DGs08R+2_unX-Obn9Fd z7!}xSPMd6ZvQw1qn%lftDtTLjN1PC3xOWZSwn@RbtiL5qPueBY$3N)pM>Mjm3DK|Q zA3bc&IF(F{Q_fw4D8Xy)gTSkJ&&Osn+05Wt)F0K^88n@@@F@GcHw?SU)}SEa@YE(%qF6f*7AVdc)YpmU4W3;l}M8|o9bP4|Kwa{o}Le`=$ zP`{cjA;=54fOyDE$xGo>AN|251QuJB<3Lhm#yL5_{aa0bO+>AF=Rk}bX=|d&u7i^g zwefMFYiCdFWcgCR=VM%jp4t`uME|;uGhyaBzY#od>zGer`I^#1e#84BGhR1_^yEh1 zi^}Gj43I;C?IAmn{hn^u2V?1K=)3N(-yJ1*o)5BsAZ)mF#k}%UxkQ`1OGH9%#Bf6l`w?InB&?e}*ltLurbW z*OUU9K$khcvbLsl{mFgJacG^E)rIt_9 zW7Xpl-Xd?DT}zkIZ|SPdPuH*x`^i#o}igiL~mvdgB}f?l$%W|t$%{hs_m z`?$I+k{c!;C(AHIIbWkpc4#5r=VMNFKFKpo2iZ;6;ID+r5!oP_rifYSCwp-g)nNV+ zKS_?87;0nl$X3S<)Miq=HQOy_dOPi~8t*xYkeMJ>te8IL*<4UN`@Q@)Xyz_9O*&{{ zUFkguhRYhxt&O=h)s+4^7+MQMdTu`97} zDq2pP(>JusLCz9(V2*GFo8kXLVZdT_Z6Ar_+UV33V_H)Y^-MQvD3>+A|5%EcFip(9 zXXDUT0vQrOGb$P|k=l0yw zlE%|JxH83lCoz;@LV-1A(G_i}Rgr^q%1Jbp?MS~muY&)!#s22qkZs&iPg4O&wuiaA zQ_-e*54j7q(J6A(U!nD##=KEsGx=_ynOT4wq7i(}1Sy)X^IR$=qiMJ~Cab(t-j_CB zzM(>#+YYfM^>spQ0ejFbbq#b&6`evIXtqrWuJM;ZcQrDz(I;#VSEO(43I2-Xcnufz z&UmwQJ`mo1iSgd@ADH`uY;0hX5)_M7o=EZT=8zDR$KJO$M$oZ0!s9cX%+9CU_5cm{d~ z-qF1s~9P)9TWqJKh1yB)FSU1Sp#G<(f4O0$`Wr@w=p{&<~b_h}p2BIEGRuid5; zEJrEyz6g^Pa=5gX*AQ;OFL)WJaf(yk>0%}Vd&HV*PB|W=(xGxm zR_b|))G+-PK5#*qq3wBxadkXzf}Kp#_4?b0~=}@Ru4Z(f(SXsxBHT z9^#x+Y)4PIn2B~~1BEx{_D+a91)P!_xr~)~tSQ0P%*R|~fT@b`J=256+gGGGqQBdu zq>i_L!vDFBdZOJ@%vO=5n89Yye;fLkwJ>q$pjwinU*?qHNf)(0{DmnQj-?%ZgASObrZBbPuiP;vRd?tJy1`wwlwRU$6bpZ|n?0?sP==GpZ`;ulr@vEE z)7kt>>dRcZVe*)GLe07f=iasf?J=n|UjC7ReiHEFC|lWEjTsNsntF!f3Eg(646-nG znuShtX8_hUA1wy5TcvlY26h+1fjn2yEXdBkQSJ0Zr&A+`bhmt9H%N?~jt-a8bTzM` zF(N#Kc2WsWp{3G+b4wZNV8$S>UBg={qv#g@NFk7gWEmlQ^|;Q}wdP%uOm(!AF4sA9 zil@NZT!Zbs3Dh?n+N334mYbA|Zv(O3fQM4kE~WhE_mN!w1SzK( z)Q5kkudu`Wfg~YXVI|WZMI@p+_pqz&UERrT`F&kWhmbpeih2Nhe#tMuwFR-FZNcFS zAcDf$e2On2xr9p`PdeW(ijj2EzScWENM4?A>)4x8g9N*6+!Kcs9*p=YSPZ;Y6F zW#qHIXIi38qOOjU@_H5sDnhT=a@ahq58b_-hSDvnB>ia|{|x%B05)+`mPMZV}UqR?xdzMy5~#atT(^dYvUv z_FG8b9;(K}mV!oX?A69&?4v^c>o{i`t;w_c&7KO%oQoA7nGnB@Hu5+++c}#s8 zLPQmKh71Bdzn0Zf5&m&6IzT~;?h!Wxr?i*ryq%g;UK&C0t8m|swH&>w7i0nUEA!Ak zdJp@O#i$KspcY{_AJ-4{2aZN}!d!Ao_9KI+r<|waTGWm~KI92JbASn_CCsjf%GsFT(a4^f+iCI<2vM^8b`)dZYR^Qeoom%TI}+&9sR=GS8Aim*W= zbw1WO3bD13)DW@#e*R56P(IT_=+W3nlVlf0Fo{}ojOjyFp{pmDr%q0usa>@=y^p=m zFhs*Xf@eL^POu$q3iR#(*st-DWYejMJb^52AWI2$wynl_`Ad301L*|C>2oT~Cme^v zVSBGpr0EC$50wIt$gYx%7)6{;(puVC_QNyWg$T`e($iMc-Q3o6VoQ6e8>spdDfOeG zpxQ*_*QDzsSkP#@Tt}haCBojPAAx(LB@MQtCdLe$NBOBMHRtE1FAb-4K=+gRTe?hx zc`a~)r*G3+xL+OcL#Q+XF5W8xkfX6)#-L->ZVJ#Y?L}p{H!SmZ>WE`0s2}`P=2{P#qe(IysXeH**8WI<$>**P?_0G{;>=W$*?kmWxOc}=emvB}j6G!O)-Kg7P zk4tN5JKuf+u4*dF>|;bMFY^wXARBd=W+A7t9yDfAny1&Kj$VS5D4-K5T&_qB%7==I z66o?!SbM`8!X6~w!qYCDm`jDdZABv(Kw2k8UA&)_Hvni0>DB3NlGEEcdpjN;;Xx8Zu(Bh3@-IDk% zeoOAl6-doeL~7rLop~&CXq^e8KM*M>K{0fY^Uy1x*;IZ`jbPu7Lbm&9sy!f9=gSE6 zFFj1{=_BaU=7>lZr8JI!znB5*x`9f-Gw6fSd7%3{S_#@_A!2P2(3VYj65>3LcBgh+ zS$j!+a9lK3pw5u=2Jnz}BO*}_`gpi@gavFQe`+OE+aAyh_BUw&t%D zjTw-p!t(8aO!t7^9H>#?=jX7gsWgEO0o&9EULH$ZA^QXy6{FwiZD^|7x>$dsXwHj0 zW7M#58E*Pg3qt;{BJwl=^NXOTz>06`eQ-y*GIZK5is$@1o@)Vlp9lS_X>aiISlFn` zhP>#MYzM$>FPf^R2i7Ud!XPF)3b&=R`&jQ*lUkR?_R zenvXw)T_v{>p=zS2#v)57l1c&>GxU#V_gp&d;+U96l?S~_0VdKx3SOydv*8He~|ICZ2^7{OH z1T}(H?x9~wUEK;UX^ZC+*PMEgsv{?=4~>AI)JY%eM|vLDB;flKIupK9Z%RjR<6Bf( zFTkRF&acp4R0-94`Jincf@8L5N3Eu%wK=-lHO9Rbffh+XK?CS}AfDHejZpx6JL11` z_&Ib`EPShdknin48DX-Sig9U5h8&L+A8WYR{;m!h--EvY zTkk+&K)RJPX?G215Q$4{A{Vq_U8VCm3%S)ul+RYC}DaC$@q19Rsv> z036T*TD$jaaGsD`kaX- zLYMyziZ8_Y4W4=e$CDw2Ux1cvp}~gh0A!-QL#3%bXfOg}y$`#U4qb6i7wHRVj$WWp zCrBn^-yjWWq%-dQ9NyCg-9yEx2gW@HbGi@jI|6vA9hKAt`V+0fbrG1sQ>^(zP&5Pg zcnz!ZExMfe7+(u;$B*EJlF&09fg0kdJY)>DBlI0DgB|$?-#^4`dx7dV;60s$E>g;i zwYaNK!G*`6S%yOz{=|CjryN*=1{l>k&^?-(0H6B$4BDX}c;y+Wln?sb!OHHz7@kAI zj_L~V?HfQTL9AyDDo>%XVb!P^u6%(pw5PJrjA!tSD4Y+D0YzTLu}o-*efT~j@T6TY*MX{Ho)@qV^}*dW@h<>7pBps4iBHck!n~luL0r)gc=r}YdKEM;kJzgZ z?Rf=bL8p3*<#h_f*(HH%YJ(G=K^8n*cZ>=HhZD5Taqtt`ZIXe07ij#lkRZbR%7G(a zKuf>Cr=psT)jA9>JOmUhhU=c|S)5fETwGY6;Oso0`bB(O3fHKn;i@P|UNwv+9kyAp zu94uYYRgim literal 0 HcmV?d00001 diff --git a/rawwaves/drumwavs/hat.raw b/rawwaves/drumwavs/hat.raw new file mode 100644 index 0000000000000000000000000000000000000000..f61389ec8eb6b5e14b9b3967b03bee47c680d7bd GIT binary patch literal 4976 zcmWNVXH-FuzVqRHIcuG>*4g{){p{ZZfPz2=unhDCotOY69)E@R zF?X3z{1bMg^O=dtd^Q1WQL@Qn7>G}xZ)FKB!c*`DQluo4!!(=e#*AlDIi3?(59Vud z5+t%UYye$M^IUs7nGpUUR|1T50QI9;_$BG7oL3M{ReV4x?v3uC3Yd+{U?faO{-}Uh zC}tn37VvHSHqC3HJ97+trKEuz+)Vc>Ix-5*g(+w;d50PDALqt2fB}kw)`M7FL>h4n zFoPkAhoa{Mu!PQ6zGr@ABAI!h6StiorSxN3_>RhT^bm^ZA7{FlEWXAN7As>E8#|sW z0%~p$lg0Rwi};kna;vzRs@1|9x`{bN>Set=6@NfF2Ed4*Z9Ph_Hl@ojpYvV40$6yo} z1$^04{6esY{TXzFEz%EYrxLCN;Z~3da+r-Y3`V1!xFZ~Z%^;FJ!#@Dg&L17@j6%7NYJ3`aV~ z!crzw=}w!Z*9})%hS*y1dUzjgQ}lAZbqaIU=Yehy_Ax%ujWGVCEwVIgqm*#AjNQT9 zS3fsAb^lCnR6T2X(l%DPZ9A>%XML)=Vf#xAZ*6KT6KBF~Qxel)cQ{dF2j@7&q5dMk z*T1A|Yo|k|SG1owLzpIKa$k1#YhNVwGsXK9NDn@>FY8jivhJSSdGL+!zI9ZW4R23* zUqXDVMWa1zFEDBrNog#ol6sTS@Yh;HysPQt2@NZ*CpW}G#l!Ad7p4!Q+=f_uleRX z;=6gYDe$6Zt}#NJ)M*sB?-|^_v%Y4~qKapYS6}>oZD-@J0f%h0%+wFxYdw`+&xhI5 zymmSFclX3y>TeePUYq^8+Ss#jLt$;tDfZfKw?I>`t(KcXR$D>hNbMYRe8H*0dv&`T zyL0O-$?ZFKU!vkl^dWy;xbGelvQl2`C}cH;V6-S^d*?LogXg#8S!x^wSC!dE|9a27 zT$*p&9%SG2>PkX4I{59OUW!d<6pfP-v4vbQn8~~ ziLK?Uu*kNU9nNgal7#=b!!3IT9PXp`{=;y|5?3r;d@Woao#t^UC^B5r*;;T_o>!rd z{JwVXhx^F>ao@=&74>qLijy_j;u$}|FWElw!$X=&FTW^$zcpG-&c3Sk`jzGNE#uG?bgjCdCjy6gE__Dr6C$8Sxa*Zw*x%6+>vj`@sV;pnRL*6;4kw*8M?Z}tjnDM@JvD`Vm@*!J$quDovt!CjVZYM;cX?Ca04hy~ zk?3tM>UpljEBf&zFU9+!vDRDhBVE*W5!~MJg%K+JuG2^~j_V<32yd*`K+OuZxhNbZVt!w zA7Pbya^*mXq_Ny|e~ax=N4I8LJkC*9eXqq?y3SJIVXK+pv8iN4jm@J6s0Wfc4vn`* z>fOcZ+6=Wpuv#{h5An>^rwS?cJ54L-6+@w%!OnIDbLad%8N1XC*9=sRGv_%M`_6-P zr5lSkyX6#x8P@R^+r9)-8`U-Ol@A%U$0Xra*TAYfc0X5dexQn{d2c!d_Yv1rFHpbt znWR6~a>Fn~;%t7n-G8-i8|=3fqa0iN79D=ut1-Y*$^K#$yo`PqN(DNRa~kh?lyI*@ z!z_OX=o>~c&$i6;Jof3PRBMS+ zt@P1~N5hVRH(;4L{Yi>3g^R-vn3Ojk8^YjOaZu&M>Y}>sAEK-H-l-mhIXYW0_;HwB0SV-PX?CL2RH7_3?_+yo3Wh9gd~J33QmJto++t(r})M zul`3j>HU&-({2bhTjiQ-=>bk6SZ;hPby->PUb2@O{e`#b74poY^8=B)BXK{~DHS$E|D$J@CpZ2LQ zu^Ak9>tuU;Q+RVJPU;%3pX#?y6^&C28W^wHr#>eKGM~IQYAe-+j(DGiZb$9Wwoo3M zHp(;2+pri&BtkUD<(a05461DP-C<$O8J+pwch6}XdM~gaH(^XMIPsj z_KlH^-s{)|^8rh>Swl0uqmz7x6~H$BTZISfODvNzn*1hcm<)KnmemoL6bb$xD&k4 z_OE@TnvCw~Vp}I*f8>uPXR)|}nPcoCCXi|swK?JH)~k3dSmN9W^~U~$L%%A`_Fsgs z4h3ElxTE$Z@^R~4KBpr9ejx#FJH5l5y@0LujsAm>i1&P2(Db{r%(|4uHs3?;&CeSL zYy5>@H3=;v#FS5pb(^N+ry6HF(?pHG(x8$&9yni0Um5?>LQ7K67@wn>o9>IaW;Bp# zv2ccLng!#nsg+aeN7P@iIIHdQ7~MN^()z7gW4|N{ZuOPRd9E`2(@oVC4^!)IdcKA7 zF&f8Z5!EOE^8T~-9l#KC58~AWREvoK&QkC>lF5qILx-w z(xhAFn5+0`=NT_pH~P#WIp!aUkw4BpZ>*CSxIF?Z^}{VI^Cp!LQJS?l!V;$p+Gh6pEpWrT)Ra0U(XLZPRj{6`R_)?Zp z;}kYT;|UAtUUsNux@9HX40+ET%q{hHdY*f$&etR>Ynfc3>c*y#2z%-bv0Ul)p7L~j^+GqbG|l`AIta|PMFVDHG%=MqvZ&F zW4KfO1D)y&^oj>_^vlIN_R02aW22JnNLS5N4HKdr3);e^!?tquE*XN;z((Ccq4AFT z6xv3vsP3y`O~0sLvbR~5MJkE=QCY48nzHZ}ohSD3I%8We#QVeu=f%+=lkKm0s%iwW z)^N>2tp((&D}g6SY>8DqfopP-+hIo5Owq02rzn@SON8OvT+U5D*$|Ey(@DHSn4uti zLioTo<39wO+W@L&#~a#ESM6HWHU0@mg>RhGxIyF)KS$`L?oSE{9BF>)ckVx@!h;`*bVW(TL}K z95!h(N*1m*70_jxQ?!Y7aBod&-M`>~Fv`^fPJ$)6cg#vsAmlU0q|?F+cDyOp@JZMq zmohgD(fkz61I>3HjD9e(%b)Xm+IsPS=|9t_a~rr|&js3(^qOHTn9S`o4D#%*3k45A z7Q0Xx-*$u?LVLMZ{+#{`T|CHTLtHs)(9d-d4AQSsA7obQeDxE!WNwgZq-u+_)?{Me z^hGIg6V3I3jXiH4q+z_t4ZiG7A z{jGi%9Az58ga|-up-JkW`DJ!1>doaync9CCkrV+F8_4YDL&bgkL9JB?fkp!Ye%c{I zt}0VV0h#($=51~#*>)t19470vJ$P@=Al))vP28lvNH^EnEa?XC1~tkVMZ_n73I;28 z$qi#Be-0-xUkg@EtMY>Sf$#ZEG*>@VC}rP}Z`6cTGVc0ay1TsAoj1m+?=f}ir=kW- z7Y=YsG!=Y>SbAZpsfKlS%&`9(~$ zY$FU@Ek!BB_J1b2+Rt zw@9ig6$Da|>8;EqV`wIG1IOVq%Cdqg46nhl*h2d@=m9vX69Tx4GCdk5}W{K*i1#kEm9YS)>TwMS1c(=>ZmK7M&~|COyCvS(LYeH*mI; zNgmO1c$)MjQA#4C7cPNGU?Q%>jno&cXXY>&F7o~gzf<0#(b9U#Q4`hTHRv9mjt0X8 zQW5~@J#$~aCe6oh4mQJM@V=CZzL39`){0%_7Ca25!2xi%l#3tWpCvuIX!Dn*!&H6W|On#5MPS5IZ^khTn?&ouA~>HYgpI zGDsKH74;&a(iS-pj)M~D+(9M6}(wG zCs~yYG8QB;!L+;bO1T7A%O+_i%(B0dv1?`sLBaMVP>bSV7P*Thl8O7!AE_@>teiq~ zU2aZ1jmAguPBaM3dPPrG-Zn>OZ=_tC5`e#ai5$nb0`QN zLd~Q=jKZF%8oq$Juv|&RPtiIwkaQ#)T0ZKle4xdYh@qTigrqU$zoQ|TK z=o7pG-;u^jMZ}wSM?b-6d9u`odrCR@CZ0|PpbIz-+C+t@KBea4Q{2 z{D>Wv;!OMq#o;KI1C>EK;1jqH+E4Cb3)&9PJ6{r`l193??%50b;v>p@S}q5{jWCgR zKriu2x`Y0LQc$|f7h6SB!D@<`_b%55l2NYu8m<)MLqZ^6`iekB0WZJz*|Yd RCA5kzAbJ;3A15aP_U~gFCVH@Rsna|ayUPV9dIg%t%-0@lajNRa=9OyJ+x2YjzGh)RiZ$qfKg~KY2Jkq{3{@|Sdq?CJZOH;Q2DN1tdn!h6AfBX}Y@bo&hyCM&s9!%rC)Vxtaiv}}p$mBStL^X1*xESU93cJ#2f z%U!2J5c%=!GA&X)L#+4qIk+b5iJ9$ttGZ)7p|_n+jMv|nROu2oIFku)8Y4eq|dAwL<=LeOArs+v~n(n!GA2{80qz^Pbt{ zOJ!y{M<>6}Z;_Fp54CpB+Q~2fUGhyzoh^AuKQ<{}ij_6HllNL$iHF6JCDtgHy%p`x zJ(>aeVT%Iyfdklyy)Jxyz+bIF(cgRr>ymSbMt zdM&MtD_2_?bsv8C-5}Ht?gotC2f$3eH!13LrO$RXbnMTZU^(FL68zli*Gp|ilpcKy zHFXzDzgcWIwHxOh-INljbLcN~yi_)Qa_Jgjf4cXZb`(ScDKyWLnOcQ?8#~{51z8KH z;ZqG}>s=q-v01B}NY#J62;EwGLg?CKlDx2D26IWBk~i;Hcltw5_}RjI+jQ*7{|fo? zui(v3^Yx3R!b^YrmUPC5z1e<$!osIT3Ky4iCZ1Gw$Sak`iG8gl{cm6s{ak#Nh%d?8 zn8{^sq>pFcIv~fy@6N6en8}ZmHrakEg&|+%KYn);dnEMI$G%+*^W$2E41b;c>WS}Q zkENnz_t5OFMaM=K;X8e;!>%xgVHfjCMz(a@JZ4YfGWZJ=XdCR`9n);rf3E?FrmCix z@VdDhvaUq615ECaxWZDE^K1HR38TVj{B!;E2cg{N1mMl{G5Mb=$CRx1Y$ZR=I!-;$ z{>VGU-II%?e^(m@YB66jpBRVOsRh;YC5uWXeY-DK4Vj;rl6u8l$G+B@8x4{h+AEv3 zfV#*WTc|hE`pa*^j>JyOTosa0Y=@8PpYtX}{;&RhdEZ-?=|bq&u-2a%GIdIpMA2F$ z7wf5JRujjn!dnY{Y24%%F$;VXJ#EN|uUBnpT&FCRTKGRqfBU9>Z^jLYYmWE)s%|Salgu3sZc@wopCQ*GEwP*{uC}%R)pdNr&3M(kh?h0r|g_qkX_dQ zSKwvw$?_+ztur&D2e&Hmw!ejMf8e?8r^E59Og3-SM(<2>z_dUGZ@6zq`p~d#p>N;L z&9a7!hzwH>XEt=5iX0x3nXwR73pu1O*D5Adw?yRHb1H?8EcRVr;Y(u%6yL#KNlCGF zwyoB$v)i?4VcE9dA5Pf#62thed3*D!=#NVLRkrc_g}Hler_u5_2_jSLWa^OsOrU7Nj1_854G` zB%j+fEjl_UJ{EoaWw!hs*)FgfY^68C$Ei);os3>z??T~CytdFK`ina=hW@^5O^C0` z&GOTI^@~3W zM0$EkN3;o?-*k)J&sJ5=kZW`(8BnsC?99q@j5gnL_fY;-v=GM-;iR6IvRt#)6!SuptCR7?lfwFDK1}-=UW$FI)MD#}^`Ij^ zKA`_AF|$a6?D@&X<2%&O&EEHZPU4WNU%bb&nwZY>0rdsDB4W1fPENm9_acthtmod4 zn&3~xDRJ8~dU{I4lvkt430p}zBuDWSvD^)_z}WYHr1~o^vlUAnfJT!gFdudxgFsQ^ zt=X+t#qUhVv&*8Sh_R?f^mjBVzrRFcddJM-N~DL-Nb7qz&b*0l?@E^cb4(-ud8WDt zF#W@}S!?CEUv4%hmZ}cuWJj#oZZA@(G9q2e z?OI|}c)F{LpNTR@eoZcTQ7mFu*}r@-Pg6kixD$Th@_JL8mau)fU-JirpG!=KReZy_ zvBrHZ(Q-8GgXyP#2)>~=wEXMqD~IYE`TsZzZId-0CpaECe-vE!H79IP{5EnZf1qVd zF~##LBRRTO$P;u;Nd{wztOte33j^CD7stfqPEQ*xEGs;OU-)d?FKZip8xzaQ zzQ(w-y;Y#5ejFT)GCTK^n_7bJg7KqhAB&o6vv=kO+NJ697Oz=e&wEDvO_{+-l^gr#B!g`|Ho zZ4A3*iltI|`^*Y)Ln3}Fcf3XIMR9}t-S$H^2d<``!BN6{F*bW8+e7Oexd1m#Zljj7 zcZyvC*5}-iGPv9Jy_Q<}FSw=Fx$19obs>`6gXM&(5r4uN1r^~X-f!p8_g^my%fw99 z9l0(VZvNtZq!sl|GGAcZ=TFwUM%0qerr#6>AdMf5bNmI|XA%R-IApX1ZcMwQ0Y$0_7S@ zEzUUo~~IHEw+dW`95E>(4nC>epYv_x7I3h%v&qX~&*P)~r&= zfgL%5H?7P$OXG(jQj1a}Z0G%D@u9S{18!pP>N@rtTng8Omi7+u z4GlSDJ5O$c4mQnu)6-I#XsQ{jxu@nHfwj?G`%h^~)+76Q@q%*0F!=}Bwh6!4k6=$h zXJMzkAzbIY!c|e?)lj}1Hy$tXmE+T*0=Rg3RWj7!5J&pkOG`}CNL$xjQa!e$XOOE* zV3|t7Yb$T$h|v4orxY_O!B)1E%nQSV;wGy#(_-<_uubvze5Esz#2c|DCPO-6QH3(u z#g%g57oxBFoN|18jJ2k>efCA5#m!>bzqCcR*G2o_&nfS$_ifS8Do2CYk-Pnm zv(D;mO}C^e`WMDhu54lDM@JlG%cW_D{R5<{>}nh9eGejIC$VxCkMkm5b7y=HO+&(O zaCLwFn}0aAwmBy7KMe>=gkHbu1|~->0<8@t{hOX)cFP9?bF3#wk`#*<8vj^(!HUdi z(`{&$26`HpzuSA8ii>N#Wdq&$vSA6r68|iACbtldQ48dmVpM2`RNq?^4O92>yTwRp zQpn9Ln%6OWh4sJ8-^KrE<$|q_9Nzc}q-V}W zQS1HTSz)db=IQnsfnxF+zA-Q>X96c-HLya9wY+wQzzAtpnKt1ztKFBY>c)s<=!c5rktY47Vv=6BW!!N|hEcynhWy1Lk_#`J_cQ@`UKju5oL zCrfXOmKQgqzVR-%UNBXn4U8PVt=2m2yc!+((RnZXtvedE4gbVURUfbw9eL;#y{3(Z zaT*_9Ec~uJF+VA=-cdVrzI<5C)w)5J)Y4^sNPZ$a%GygGZ9w;FM|kXOrDS0rRFqhp zUL%byXD%fj^fY1jTR$?VlrLz3+8HO)m;QQkI!y;7qw`~O%LY79= z(fYgYh7S_Byzl->j@QwRJTC8}_)(T_uJvhNi@9|3fbnUMe|ZF@$CYKumnf@0^;dnq zT+yG_lLbj+TMUHd)34|sBHAZfNWJt}7F${oJ4sF<#yh_#uLs6AIMDh*HYhK?0I`d+hKP%WuE1Mkigf{7%+iv1EF;hye?N_l1NqF$?^pQ z3kM5pt@W8N>KNZ!Z33JH4;v?hsk9~j!L(%#l5Nn64hwciThA)rD$^>5SDczh3jW|z z1h>>k&xl#6?f;CK)W`<5+1?{LzGpPkb)m;&WiDR4b^L=~J z2V=Ed0MBb#Y!Uj|zr>62Q~0Mng6~dLUr6By_`&)htV`jvJQcLEJ+PNlR|CO0g0?iO zXvd6oruuwob3~x8`<{OY=Z`Fgte!kiGP_S$21k%VXf?SFTfnD!Mf}`!+wlsAc>hvo z8Q19lEQ!{St_6kt)dD6bw4JZ3zo=b?x<5vJD)fkD)uM73!=nwxhQQkB?;(Rc^)ggG zw#YeVYym@uM|^Vc%(jq*@pH6Y$$nfjyto)h?&sCY_Kpepu_}FY=&{I+sC0f7EMwUV z;saY8olILuTHy+2Z1}%^d&XPnOzgqk{`Ft5^B#{)_EpHe#NP~Sh(}~+;Gy9)1d#Km zv4LOem?4b|bd0+K&*xwAMTuss>^E}u+Ms#0A9$keb3@BY!(5CwD*Tz!*_#p)?=0&c zp1;_VV^vILlwV*ZQ_jEB*e4W$ul>1&BTe>DqhPydsJWJ7D7lgIlVpTtsNLuf+X?Nn zFV>Ubs23Hc=XReodcG@}=*rPMSQ$%2_)ZVyj& zRlDWgHfKdP;&>eDe(o(EwF~yqSEGc&eE9_UZe_Ru*~eUGqG#J$rA^Ilm-wngvRC~! zT^s7K|&brnazR(^mI7SX=mj|8fI=RCu%E<$cS4 z7U7SCXQTcBR(b5qq;B^t#BeU*fOik}*hc96b5jtGs1(j-Zc9F9%@6;mER#5UO>=9h zvbQ2LH?#t}=$>W%XginvpRbDpM9m}*Gt=}_;djCBKuPhQ>5ZS{u9eKzE~pjkj#n7N z@haaa<7h~VP*>?guIRVao2W9+Sxe|`y<@pO;r9%a+R?cdtW&=!NGryAfFMMPBb8I$ zY&qI_BC>qp6aPY9Ay5B-nfDefQsE2%}A8H{J6f2F<9{8A2;{-g~A zkqMFKkR~B*O}o^3zP99j_}jpETFUl?+#{U=J*_W`u8}^Z6tF|1XBe?*N#IdPC(<~3 zoPWA=Ej7F2xP4(Y)IRAIwWy-c_yO7b{71reI<`wk$ojBO@Je7YkgQ|4LwV`iy4Y{F zHJ`s^wTd{9kgL^8&oOAQF6ISRaTU=p_c?WYSd<|9+PXW1{hP2#p7*-|e~zeLG~mt1 z-38u(F>DY0r)`9}r_1jh!0onnfFE)ulH@QyES6K&H^#|F?9)cN_JBA1;J`ie^{7kC zo(whfwzX%`6g1&;II$KRhVoJ)JgL?<5s`A=LKg9XY2dDHW~gXv&j~m3BddoGg1|pr zyeqbppDFL@SN?D29C~5AbHCLyf|#!#+~vC{^_7s`);!PL!nf76SuO8~a$J#?!?wE~Vx#m`G8J}kbLk#>TXf>%@SAg}a1Qn^92_Vw4z~{s+`!#fKznFw z&;;mEU*kz&p3MOm$&AvOE#N-8U$uH4shuOCt&w`ub;$ifjJ0`uCDcSyCDag~k{>Z^ zm0sYJWwle3m*v(+drK^J)cO4`^OO1Sgz4a&%G(rkPv09aFJ_xws{eXpg|M&+*|pQs zm>w~H-juybts{OBkHG?BaP9T&`9+L`kcLr_-hG})_Ib|n{@gT)-b`3x-Rpgl#prTK z1*qeP{0LG?>aHoy;m&=&j`@{P?XZh_=iFC($9OGdUv`&*7p8RcbTya1ZR!%Jkl9A- z5PmLXbk>D}JI*cUf3-j4vZ81`MpHC_mNI7Y7Slr0SXkY)QLVz1u;wE{UP#wthi^Y` zW$P(h11X?C`l%N)2E$8SCw8Ygf@(}7tq)tuNyS+2C;tNT!l-}QD!$8nJyWV~k;>xE zXd8I1zBHnxt3-omgTG@}_G*<-6>%7QTzyL4qd%!jNmKXOhdJZvcy*-byii=2p{C=O z*n&IJHHwLjvJBOiYR$>NyvImWK8il`56Lvh%oYzR&HQD>jBN_3eQOi`mwbtRR@b%qHNv21Js5 zywSs5May@bF}Euy?dxi*kDklZa5qji^@Ts(YmI@XnK;VB*sh0mmCE|c8AC$vi8l8n zql6u+b0rUR#J-2f*~>K%4`3=sw?5V&MJdOK6!r2hZWAt1* zgO8(u>{L437)ZwmK7Eoq!#K)awsbJ{g7pJ;!pw|U-7(Dc5Xy}-J93OG(F_LzleJScOzsE zcO}1<)HtMueY|=Xb`VGDbKS#@b7Caw7U&BGl_vflfj`HXna^+&-xzN!W4naXZhpA1&U;3dLoajcr_ zI~0ukX|Xlx#B~s!>7|hk{=%=(4CX4^m}Gj6sHfNvt{(jX4(XjGf-CThxr#Qh@Dd(m zdB>iTV@L%@8vmb`8wl`Os1w%slfn{tq5C1OY;DI4@D&&uoNVr<_4C=-=8To@&^K$_ zO}Qvttt5;wZ-?IlBaP)kLg+Hk(Hmo=@_z-@f#<-%RMGn=0+TAVmg*MvVZ4q+JR-|& zOpB{v&&g}#E^7HB^aq(?)U;0%άsPNm-(DyaSbE?~RdQf2xOG(>;fG_8(zQWpz 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 literal 0 HcmV?d00001 diff --git a/rawwaves/drumwavs/snar.raw b/rawwaves/drumwavs/snar.raw new file mode 100644 index 0000000000000000000000000000000000000000..93005ad04e1adee215a3a7cbcdd949311f2513bf GIT binary patch literal 16660 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 literal 0 HcmV?d00001 diff --git a/rawwaves/drumwavs/tomhi.raw b/rawwaves/drumwavs/tomhi.raw new file mode 100644 index 0000000000000000000000000000000000000000..0cf482b93778deb85fe70762346d3c4133a6a0e7 GIT binary patch literal 27642 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 B9JBxc literal 0 HcmV?d00001 diff --git a/rawwaves/drumwavs/tomlow.raw b/rawwaves/drumwavs/tomlow.raw new file mode 100644 index 0000000000000000000000000000000000000000..9813513dd9c05dc3b2aad5eef14ad08cc5e839c9 GIT binary patch literal 39200 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 N^G5$K9{%6E{XcWfP;dYM literal 0 HcmV?d00001 diff --git a/rawwaves/drumwavs/tommid.raw b/rawwaves/drumwavs/tommid.raw new file mode 100644 index 0000000000000000000000000000000000000000..4d042575a03819ac4ee527ee89b2d50f9f63c464 GIT binary patch literal 28292 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 literal 0 HcmV?d00001 diff --git a/rawwaves/eee.raw b/rawwaves/eee.raw new file mode 100644 index 0000000000000000000000000000000000000000..d3888db6c9d3132db52d50a4398b5d105ac404e9 GIT binary patch literal 184 zcmV;p07w7+F#_rVDF+A;Ko2GkJrq$A!4V@DJr*4il@U!3y$z-fJ_*AGB?HR;aQeym zGxwtO`Secl!|sCaB<{}bL+V}W7wk*x!{#CDA@qOl!|D$A_Wg_W1N*)UK?B(SzY#_k z01B!QeH}~{(Gg=D-5nhiP!-J>T@!{7o({GOtq95kY5e&7>-aM2*5+;N1LbnuwBZ`z mqtzDGcH%bPqtw^j+T(uSqvPl7vFmf|!}HbqFa3l5cm6R;F<-p^ literal 0 HcmV?d00001 diff --git a/rawwaves/fwavblnk.raw b/rawwaves/fwavblnk.raw new file mode 100644 index 0000000000000000000000000000000000000000..14da0748110b02d3f8acff38c37b3948cdc42d55 GIT binary patch literal 512 zcmZQzU~}i`7CJ8RLtauFB zGKY%hs+t;D6BV%?nD&Kk|Cnu_K!hvKaT4|7ju<)ocU`WSaDsxkCS ops|m=yNu&mn=rGT2EVoCRMq7rC4LAU=jmp1XBcq%8Adb!00;GMEdT%j literal 0 HcmV?d00001 diff --git a/rawwaves/halfwave.raw b/rawwaves/halfwave.raw new file mode 100644 index 0000000000000000000000000000000000000000..b34639b0be745e0779f14f7afd5a93398ba73310 GIT binary patch literal 512 zcmZQzU{+ys=gi{i=3gyzT=b#D4;gNGNhM`fbqzIbIXwY`-^TaMc3Sq>gxQNZo^`2m zm+{=}WAC>=&^UNj=$8nmsK%Jhan}-FCw)wLo^~!{X;w~-a_-6exPpg8A;nuunado? zvn!e_JF9A{V`?;O9@Tc%$<)oM=crGtUsiv;{%iezAifS{C)RV+&8d^A?W}oJqgfqO zRa4nn(OjNg=1|I9ytOE#;9-7T?#UeGtelLcY3EX&Cw)wK9d|8eb5vu5Q|OoAS%JoW z`+e*^H@nNYR5_lt7qbbo>@nMEe9z#wo`ANThMKCnlCr#{47bD&(T76E`B(FFb7rx* KGpjI+Z~y@L*J#TC literal 0 HcmV?d00001 diff --git a/rawwaves/impuls10.raw b/rawwaves/impuls10.raw new file mode 100644 index 0000000000000000000000000000000000000000..e18689dd611b25506a05ed5f9e4d55b3a5b92ccb GIT binary patch literal 512 zcmWNOJ4+)`07ma*(2Q9Nn`k4WI6<2rLIk5At4XVpLNE|SbSlASRDv<+HnJiXgX!`M zVv|2$p%Apt_^4Kp#6jZ&VG@!%_s;uqcluL&=R1GA!=rs}C%Cz{`kXpTL}TL-E?fv| z_9aaG+%yDfxxP`)No()bZ(hEIMO|JG`rBtOa*~h?E$x=_~plJs0Q$882ze=7BzpT{H>bV1Gw~(+Z37>XaTc z7wvU-$-^K{F;tow1zED<)*RNFHPV`>0#s3C<*!miBRH(`8aB$7;Baoq`ykg~2F#Ne z!nm)_mi1^3={eQH7w7>cQ3P${F*U9g4A!jJyz}KvkSM7FK&m9_O*mgRZ&nOeE2wci zhPHh^i5~EUYUw$1$a-|P+*iVo7cdWI$hG(3mK@F!jIxGR9*5D0QuH^;sGJ-W=ES&b8`{5g!#I8PU9@w&%1erh|J?DRP6|gCh zi0**3pl9$dylbDf8qH4gsddsGgjt-|J^P-V)2Z&`p59Q|?@(fDU7wWX7`gz9^6fYO oUX|ABx%!5*+z@_lV8Xr(YT-hJi;X9usk7DR&ApxAK6iNZAI$?c$p8QV literal 0 HcmV?d00001 diff --git a/rawwaves/impuls20.raw b/rawwaves/impuls20.raw new file mode 100644 index 0000000000000000000000000000000000000000..9d89aec1040720ac5d9cb26d74fce5cf04c7cbb6 GIT binary patch literal 512 zcmWNOJxC)_6ouc*7>O{kkQ9Phf2u5+N`}~p7@JiQM6{GeK|~CKg@Vl@SSVtlSS66y zSt>@>Mr6Q3(ghI_Z5Cpum>H9odH24*o&Lag&UgOko&7a7cQWGkEJpginziG9*_!w) z1-rD~aUI{bYq3(K6TK$$m%ZmkIw;6GeTt^re?{Z;L%EP|ZLxNC5Il%pU8d*Olr>3j zOq+OzWU$a;+`?h$nIpOyNzhGGR@3;xeIDbpa49M}K?v=pNz$dqWj{Kc@e5c-lnwn# zGUP8A)xH`K6HtX8Fpn$JR&QpBjFGI#sc-4v8RX$N7%?NcJ~g-Gr*U;r*&>H2ID|XA zl7p&ZQpPjB8B$f5!FzawB06G25xr*$gqVWfQ$%c_14Vemdzn#HGZf}MlTsBqh*xk2 zhnNyMW$U7GL&mK>m0Zk#3E6o(laBf}Ig%w~W=XwC8&_aH>{}HRYC!vBG~AKVud;y% z>->TH*NIBnzW|q zxh{*|;DH^m_SP2Ul}kUO@$io{eUkN{&`5jF{&JI{7wL?Z>{@)g&|;Vyt}hF&vSm~dGb7U+z*k=$55qH??q$rVx&dazBhGMRU0-O z7d<`jH_NWmzSga%q1Yx7U-DkY1YvkdK3y=XF?t z0+(>X)aU{_R9v?3(`M(%jv9qUDw;|2!Y3-H=J?R8*57DNB|

    qiqiiGvTzlMn7n+ qhos$!I!)~U&FTU49JgUZRdv;NT8p&Ai_w_gt8{)0MKb*`b^H&@0XE41 literal 0 HcmV?d00001 diff --git a/rawwaves/mandpluk.raw b/rawwaves/mandpluk.raw new file mode 100644 index 0000000000000000000000000000000000000000..162a0da9e1d448ee915c7b4ba441c8da46b6298a GIT binary patch literal 8900 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 PsADLOD`3`rMg6CLjECH- literal 0 HcmV?d00001 diff --git a/rawwaves/ooo.raw b/rawwaves/ooo.raw new file mode 100644 index 0000000000000000000000000000000000000000..1b8331e3d9a9ce5522961877759e898b3dc23fdb GIT binary patch literal 184 zcmV;p07w7-VFBF#F8pNu8~wBVo%_uDJNmWz%Kbb1Tlxt3FZ%!dTlx3))%R5P)9vWt zN!?52qv}HCJmo?9s}e*K3kz}?-7GgJO&IAHJstNU0T|y4{S3_)aS`VHi}Murm+pGo zqtVpSZ_{zrqt%7jF5<`SL+~E)f%aJO mEe0C@h4^&&ukdvB zXAXG~bv@x}I$N%JadGAL`hS(%i;Hv3)7cW9MqLki;Lq&o>b%0v(BhHte!bILT&lH- z8nV2S2BMRMO!;MbJUREVSF<)TUu7y~Ok$V|w434o&Hu^&=Kbydqy4MyN9#AI&)Yvd zetY^=-m?pjKHs}>tNH4;i>7BBkINlAzb9hb?hSueD=gKVFFoVeq?0|pZJrHGZJs^7 zlTOa~HD7wE=4yovf4A-46LIkTak(>&7fr8zyVZQ}#-q>AF1*Tnd-}uU&)dH_{b>DF T_ecA0_rH1nlmFjj7~uc_6d!%U literal 0 HcmV?d00001 diff --git a/rawwaves/ppksblnk.raw b/rawwaves/ppksblnk.raw new file mode 100644 index 0000000000000000000000000000000000000000..95a44464af8f4edbe304e7ed4a7fc70fd6d4b8d3 GIT binary patch literal 512 zcmZQzU{Gh6%b3Je%6yfziM^V0ACD)$tdObbBuN8VUPTSnS}iWU)5iNP9@!Z>ukdvB zXAXG~bv@x}I$N%JadGAL`hS(%i;Hv3)7cW9MqLki;Lq&o>b%0v(BhHte!bILT&lH- p8nV2S2BMRMO!;MbJUREVSF<)TUu7y~Ok$V|w0q#~2RdQo0sv6FP*(r| literal 0 HcmV?d00001 diff --git a/rawwaves/silence.aiff b/rawwaves/silence.aiff new file mode 100644 index 0000000000000000000000000000000000000000..4135f823960fb2d573cdb326ec28fb42df825358 GIT binary patch literal 518 zcmZ?s5AtPTVEpIk>E@=9tf|1jz`!BEVzlS~|NpYi{=Pst1|bGUAo+knz=8W0kO2b0 R!G114T_+&CQF5q<002d84YvRQ literal 0 HcmV?d00001 diff --git a/rawwaves/silence.raw b/rawwaves/silence.raw new file mode 100644 index 0000000000000000000000000000000000000000..4b8a1b3e49c7b867bb4cb3d412403b88b765c9de GIT binary patch literal 448 NcmZQz7zIN)1ONfR00961 literal 0 HcmV?d00001 diff --git a/rawwaves/sineblnk.raw b/rawwaves/sineblnk.raw new file mode 100644 index 0000000000000000000000000000000000000000..78e0a11b587ca094e2464d64921c0b13be7b7382 GIT binary patch literal 512 zcmZQzU~}i`7CJ8RLtauFB zGKY%hs+t;D6BV%?nD&Kk|Cnu_K!hvKaT4|7ju<)ocU`WSaDsxkCS zps|m=yNu&mn=rGT2EVoCRMq7rC4LAU=jmp1XJGib^K;Yme#N0S$B5x!5vTb86RGC()~Q^l}ER3K6w6| P9xf0t`!n7)xjBqHRzDU& z%|v=f97(fGKTf|58hOO33LACRJwHXE5N6aG61<~--;@8^R+1=gX=i~L~2XNX{!%kYgciSZFrDYFdoRhC7pO>Cv?)f|&K_i_E^@#I~_FDtM>$W-{Y z=p^w-NdswdSzdWzMGa+d)mrsET3k9QdZ!KTjrW^*TRgIEu`_gd;k?4F$kWwF!Jj$s zUC4v*8&TI|ZznuW{+!O1C7Wwr5L{ebHl=cV&8_->HMc6amrW@yE(p#w&yr1NOa7ej zH1>AX_3#@Z4+7u$Gy5oby1ErPuW)!_XK3AG@yN{Ec)y{&-f5i_EiUyvs65 zvb@sbk_O_DqLYMg3z-Tm;FslH#pB8Kn{yw>WcF&dQr0GxMa);3Wtd7CA2B8|d;|J7 L0_bl}h7k?`T})ND literal 0 HcmV?d00001 diff --git a/rawwaves/twopeaks.raw b/rawwaves/twopeaks.raw new file mode 100644 index 0000000000000000000000000000000000000000..d383a24bda8d6364f31a4d99f0eba84db414bd05 GIT binary patch literal 512 zcmV+b0{{I0000R9CjeLgodEU$Vgcd;bpsp&)dZpif(CU5dkB*Wz6$#cNe!wG9T1=r zH51zvk{4MSFdG*g4IdLBC?iWHeJ8vs3M^zU%P~JQzcx!a;yZ*sF+k`;s77*0MNA-1 z15xf&;8)mM*InCS zCjbcm0RQ*@+5f2jWB&^Np8g*Fi~QvLEBjvhe))^|h4*dtLiGjnxAIo-jdX&%YSFSh=*x>Er^W^E~ z(CDY?ZtNxP%kNh53v6e*0ehEBxgBi~b(|p8pE}WB;iC+5h(j C?EQiO literal 0 HcmV?d00001 diff --git a/scores/Instructions b/scores/Instructions new file mode 100644 index 0000000..7752a16 --- /dev/null +++ b/scores/Instructions @@ -0,0 +1,5 @@ +useage: testMono Instr file.mtx + where Instr = Marimba Vibraphn AgogoBel Plucked + Mandolin Clarinet Flute Brass Bowed + Rhodey Wurley TubeBell HeavyMtl + PercFlut BeeThree Moog1 diff --git a/scores/bookert.ski b/scores/bookert.ski new file mode 100644 index 0000000..aed07da --- /dev/null +++ b/scores/bookert.ski @@ -0,0 +1,90 @@ +/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ +NoteOn 0.000000 1 60 114.299997 +NoteOff 0.380000 1 60 63.500000 +NoteOn 0.020000 1 60 101.600002 +NoteOff 0.100000 1 60 63.500000 +NoteOn 0.100000 1 48 63.500000 +NoteOff 0.200000 1 48 63.500000 +NoteOn 0.200000 1 48 88.899998 +NoteOff 0.190023 1 48 63.500000 +NoteOn 0.010023 1 51 101.600002 +NoteOff 0.570023 1 51 63.500000 +NoteOn 0.030023 1 53 88.899998 +NoteOff 0.570023 1 53 63.500000 +NoteOn 0.030023 1 48 38.100002 +NoteOff 0.300000 1 48 63.500000 +NoteOn 0.300000 1 67 101.600002 +NoteOff 0.570023 1 67 63.500000 +NoteOn 0.030023 1 66 76.200003 +NoteOff 0.190023 1 66 63.500000 +NoteOn 0.010023 1 65 63.500000 +NoteOff 0.190023 1 65 63.500000 +NoteOn 0.010023 1 63 50.800001 +NoteOff 0.190023 1 63 63.500000 +NoteOn 0.010023 1 60 76.200003 +NoteOff 0.380000 1 60 63.500000 +NoteOn 0.020000 1 58 50.800001 +NoteOff 0.190023 1 58 63.500000 +NoteOn 0.010023 1 48 114.299997 +NoteOff 0.380000 1 48 63.500000 +NoteOn 0.020000 1 48 101.600002 +NoteOff 0.100000 1 48 63.500000 +NoteOn 0.100000 1 36 63.500000 +NoteOff 0.200000 1 36 63.500000 +NoteOn 0.200000 1 36 88.899998 +NoteOff 0.190023 1 36 63.500000 +NoteOn 0.010023 1 39 101.600002 +NoteOff 0.570023 1 39 63.500000 +NoteOn 0.030023 1 41 88.899998 +NoteOff 0.570023 1 41 63.500000 +NoteOn 0.030023 1 84 127.000000 +NoteOff 0.475011 1 84 63.500000 +NoteOn 0.025034 1 83 120.649998 +NoteOff 0.066531 1 83 63.500000 +NoteOn 0.003537 1 82 114.299997 +NoteOff 0.057007 1 82 63.500000 +NoteOn 0.003039 1 81 107.950003 +NoteOff 0.047528 1 81 63.500000 +NoteOn 0.002540 1 80 101.600002 +NoteOff 0.047528 1 80 63.500000 +NoteOn 0.002540 1 78 95.250000 +NoteOff 0.038005 1 78 63.500000 +NoteOn 0.002041 1 78 88.899998 +NoteOff 0.028526 1 78 63.500000 +NoteOn 0.001542 1 77 82.549997 +NoteOff 0.019002 1 77 63.500000 +NoteOn 0.001043 1 76 76.200003 +NoteOff 0.019002 1 76 63.500000 +NoteOn 0.001043 1 75 69.850002 +NoteOff 0.019002 1 75 63.500000 +NoteOn 0.001043 1 74 63.500000 +NoteOff 0.019002 1 74 63.500000 +NoteOn 0.001043 1 73 63.500000 +NoteOff 0.028526 1 73 63.500000 +NoteOn 0.001542 1 72 63.500000 +NoteOff 0.019002 1 72 63.500000 +NoteOn 0.001043 1 71 57.149998 +NoteOff 0.028526 1 71 63.500000 +NoteOn 0.001542 1 70 50.800001 +NoteOff 0.038005 1 70 63.500000 +NoteOn 0.002041 1 69 44.449999 +NoteOff 0.047528 1 69 63.500000 +NoteOn 0.002540 1 68 38.100002 +NoteOff 0.057007 1 68 63.500000 +NoteOn 0.003039 1 67 31.750000 +NoteOff 0.057007 1 67 63.500000 +NoteOn 0.003039 1 66 25.400000 +NoteOff 0.057007 1 66 63.500000 +NoteOn 0.003039 1 65 31.750000 +NoteOff 0.066531 1 65 63.500000 +NoteOn 0.003537 1 64 25.400000 +NoteOff 0.076009 1 64 63.500000 +NoteOn 0.004036 1 63 19.050001 +NoteOff 0.085533 1 63 63.500000 +NoteOn 0.004535 1 62 31.750000 +NoteOff 0.095011 1 62 63.500000 +NoteOn 0.005034 1 61 44.449999 +NoteOff 0.104535 1 61 63.500000 +ControlChange 0.005533 1 1 127.000000 +NoteOn 0.000000 1 60 63.500000 +NoteOff 1.500000 1 60 63.500000 diff --git a/scores/doogie.ski b/scores/doogie.ski new file mode 100644 index 0000000..64ffc00 --- /dev/null +++ b/scores/doogie.ski @@ -0,0 +1,32 @@ +/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ +NoteOn 0.000000 1 72 88.899998 +NoteOff 0.400000 1 72 63.500000 +NoteOn 0.000000 1 71 101.600002 +NoteOff 0.400000 1 71 63.500000 +NoteOn 0.000000 1 69 63.500000 +NoteOff 0.320000 1 69 63.500000 +NoteOn 0.080000 1 71 101.600002 +NoteOff 1.200000 1 71 63.500000 +NoteOn 0.000000 1 67 76.200003 +NoteOff 0.320000 1 67 63.500000 +NoteOn 0.080000 1 64 38.100002 +NoteOff 0.320000 1 64 63.500000 +NoteOn 0.080000 1 67 101.600002 +NoteOff 0.800000 1 67 63.500000 +NoteOn 0.000000 1 69 127.000000 +NoteOff 0.320000 1 69 63.500000 +NoteOn 0.080000 1 69 76.200003 +NoteOff 2.000000 1 69 63.500000 +NoteOn 0.000000 1 60 114.299997 +NoteOff 0.400000 1 60 63.500000 +NoteOn 0.000000 1 62 63.500000 +NoteOff 0.400000 1 62 63.500000 +NoteOn 0.000000 1 64 63.500000 +NoteOff 0.400000 1 64 63.500000 +NoteOn 0.000000 1 62 88.899998 +NoteOff 1.200000 1 62 63.500000 +NoteOn 0.000000 1 60 38.100002 +NoteOff 0.480000 1 60 63.500000 +NoteOn 0.120000 1 60 127.000000 +ControlChange 0.000000 1 1 127.000000 +NoteOff 2.000000 1 60 63.500000 diff --git a/scores/duelingb.ski b/scores/duelingb.ski new file mode 100644 index 0000000..d929dd6 --- /dev/null +++ b/scores/duelingb.ski @@ -0,0 +1,24 @@ +/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ +NoteOn 0.000000 1 57 50.800001 +NoteOn 0.100000 1 57 50.800001 +NoteOn 0.100000 1 57 127.000000 +NoteOn 0.200000 1 59 63.500000 +NoteOff 0.100000 1 59 63.500000 +NoteOn 0.100000 1 61 127.000000 +NoteOff 0.100000 1 61 63.500000 +NoteOn 0.100000 1 62 127.000000 +NoteOff 0.100000 1 62 63.500000 +NoteOn 0.100000 1 64 114.299997 +NoteOn 0.200000 1 62 63.500000 +NoteOff 0.100000 1 62 63.500000 +NoteOn 0.100000 1 61 127.000000 +NoteOn 0.400000 1 69 127.000000 +NoteOn 0.200000 1 69 12.700000 +NoteOff 0.049977 1 69 63.500000 +NoteOn 0.049977 1 73 63.500000 +NoteOff 0.049977 1 73 63.500000 +NoteOn 0.049977 1 71 63.500000 +NoteOff 0.100000 1 71 63.500000 +NoteOn 0.100000 1 85 127.000000 +NoteOn 0.200000 1 45 50.800001 +NoteOff 0.400000 1 45 63.500000 diff --git a/scores/fiddle.ski b/scores/fiddle.ski new file mode 100644 index 0000000..d749586 --- /dev/null +++ b/scores/fiddle.ski @@ -0,0 +1,111 @@ +/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ +NoteOn 0.000000 1 60 127.000000 +NoteOff 0.118776 1 60 63.500000 +NoteOn 0.006259 1 59 127.000000 +NoteOff 0.118776 1 59 63.500000 +NoteOn 0.006259 1 60 127.000000 +NoteOff 0.118776 1 60 63.500000 +NoteOn 0.006259 1 62 127.000000 +NoteOff 0.118776 1 62 63.500000 +NoteOn 0.006259 1 63 127.000000 +NoteOff 0.237506 1 63 63.500000 +NoteOn 0.012517 1 63 127.000000 +NoteOff 0.062494 1 63 63.500000 +NoteOn 0.062494 1 65 127.000000 +NoteOff 0.062494 1 65 63.500000 +NoteOn 0.062494 1 67 127.000000 +NoteOff 0.237506 1 67 63.500000 +NoteOn 0.012517 1 67 127.000000 +NoteOff 0.118776 1 67 63.500000 +NoteOn 0.006259 1 68 127.000000 +NoteOff 0.118776 1 68 63.500000 +NoteOn 0.006259 1 67 127.000000 +NoteOff 0.062494 1 67 63.500000 +NoteOn 0.062494 1 63 127.000000 +NoteOff 0.062494 1 63 63.500000 +NoteOn 0.062494 1 60 127.000000 +NoteOff 0.237506 1 60 63.500000 +NoteOn 0.012517 1 70 127.000000 +NoteOff 0.118776 1 70 63.500000 +NoteOn 0.006259 1 69 127.000000 +NoteOff 0.118776 1 69 63.500000 +NoteOn 0.006259 1 70 127.000000 +NoteOff 0.118776 1 70 63.500000 +NoteOn 0.006259 1 72 127.000000 +NoteOff 0.118776 1 72 63.500000 +NoteOn 0.006259 1 74 127.000000 +NoteOff 0.118776 1 74 63.500000 +NoteOn 0.006259 1 72 127.000000 +NoteOff 0.062494 1 72 63.500000 +NoteOn 0.062494 1 74 127.000000 +NoteOff 0.062494 1 74 63.500000 +NoteOn 0.062494 1 75 127.000000 +NoteOff 0.062494 1 75 63.500000 +NoteOn 0.062494 1 77 127.000000 +NoteOff 0.118776 1 77 63.500000 +NoteOn 0.006259 1 79 127.000000 +NoteOff 0.118776 1 79 63.500000 +NoteOn 0.006259 1 77 127.000000 +NoteOff 0.118776 1 77 63.500000 +NoteOn 0.006259 1 74 127.000000 +NoteOff 0.062494 1 74 63.500000 +NoteOn 0.062494 1 70 127.000000 +NoteOff 0.475011 1 70 63.500000 +NoteOn 0.025034 1 72 127.000000 +NoteOff 0.118776 1 72 63.500000 +NoteOn 0.006259 1 75 127.000000 +NoteOff 0.118776 1 75 63.500000 +NoteOn 0.006259 1 79 127.000000 +NoteOff 0.062494 1 79 63.500000 +NoteOn 0.062494 1 72 127.000000 +NoteOff 0.062494 1 72 63.500000 +NoteOn 0.062494 1 70 127.000000 +NoteOff 0.118776 1 70 63.500000 +NoteOn 0.006259 1 74 127.000000 +NoteOff 0.062494 1 74 63.500000 +NoteOn 0.062494 1 77 127.000000 +NoteOff 0.062494 1 77 63.500000 +NoteOn 0.062494 1 70 127.000000 +NoteOff 0.062494 1 70 63.500000 +NoteOn 0.062494 1 68 127.000000 +NoteOff 0.118776 1 68 63.500000 +NoteOn 0.006259 1 72 127.000000 +NoteOff 0.118776 1 72 63.500000 +NoteOn 0.006259 1 75 127.000000 +NoteOff 0.062494 1 75 63.500000 +NoteOn 0.062494 1 68 127.000000 +NoteOff 0.062494 1 68 63.500000 +NoteOn 0.062494 1 67 127.000000 +NoteOff 0.118776 1 67 63.500000 +NoteOn 0.006259 1 70 127.000000 +NoteOff 0.062494 1 70 63.500000 +NoteOn 0.062494 1 74 127.000000 +NoteOff 0.062494 1 74 63.500000 +NoteOn 0.062494 1 67 127.000000 +NoteOff 0.062494 1 67 63.500000 +NoteOn 0.062494 1 65 127.000000 +NoteOff 0.118776 1 65 63.500000 +NoteOn 0.006259 1 68 127.000000 +NoteOff 0.118776 1 68 63.500000 +NoteOn 0.006259 1 72 127.000000 +NoteOff 0.062494 1 72 63.500000 +NoteOn 0.062494 1 65 127.000000 +NoteOff 0.062494 1 65 63.500000 +NoteOn 0.062494 1 63 127.000000 +NoteOff 0.118776 1 63 63.500000 +NoteOn 0.006259 1 67 127.000000 +NoteOff 0.062494 1 67 63.500000 +NoteOn 0.062494 1 70 127.000000 +NoteOff 0.062494 1 70 63.500000 +NoteOn 0.062494 1 62 127.000000 +NoteOff 0.062494 1 62 63.500000 +NoteOn 0.062494 1 60 127.000000 +NoteOff 0.124989 1 60 63.500000 +NoteOn 0.124989 1 79 127.000000 +NoteOff 0.187483 1 79 63.500000 +NoteOn 0.187483 1 82 127.000000 +NoteOff 0.356236 1 82 63.500000 +NoteOn 0.018776 1 84 127.000000 +ControlChange 0.000000 1 1 20.000000 +NoteOff 0.950023 1 84 63.500000 +NoteOff 0.050023 1 84 63.500000 diff --git a/scores/funicula.ski b/scores/funicula.ski new file mode 100644 index 0000000..db3cd90 --- /dev/null +++ b/scores/funicula.ski @@ -0,0 +1,125 @@ +/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ +NoteOn 0.000082 2 67 82 +NoteOff 0.140886 2 67 0 +NoteOn 0.305337 2 72 79 +NoteOff 0.080216 2 72 0 +NoteOn 0.048436 2 72 79 +NoteOff 0.115150 2 72 0 +NoteOn 0.087273 2 72 61 +NoteOff 0.095581 2 72 0 +NoteOn 0.062224 2 72 64 +NoteOff 0.071268 2 72 0 +NoteOn 0.011048 2 72 71 +NoteOff 0.054365 2 72 0 +NoteOn 0.036463 2 72 67 +NoteOff 0.072383 2 72 0 +NoteOn 0.016123 2 72 87 +NoteOff 0.052007 2 72 0 +NoteOn 0.048044 2 72 73 +NoteOff 0.105738 2 72 0 +NoteOn 0.019929 2 72 82 +NoteOff 0.058088 2 72 0 +NoteOn 0.194576 2 72 73 +NoteOff 0.117156 2 72 0 +NoteOn 0.036714 2 71 82 +NoteOff 0.148275 2 71 0 +NoteOn 0.118834 2 71 73 +NoteOff 0.104514 2 71 0 +NoteOn 0.027705 2 67 73 +NoteOff 0.167850 2 67 0 +NoteOn 0.112339 2 67 76 +NoteOff 0.113962 2 67 0 +NoteOn 0.049442 2 69 69 +NoteOff 0.145742 2 69 0 +NoteOn 0.106986 2 69 64 +NoteOff 0.104200 2 69 0 +NoteOn 0.036729 2 64 71 +NoteOff 0.291474 2 64 0 +NoteOn 0.146391 2 64 64 +NoteOff 0.621362 2 64 0 +NoteOn 0.133873 2 64 64 +NoteOff 0.114315 2 64 0 +NoteOn 0.034539 2 62 69 +NoteOff 0.206432 2 62 0 +NoteOn 0.073508 2 60 76 +NoteOff 0.078316 2 60 0 +NoteOn 0.072519 2 60 76 +NoteOff 1.052123 2 60 0 +NoteOn 0.131235 2 64 73 +NoteOff 0.130818 2 64 0 +NoteOn 0.015857 2 62 71 +NoteOff 0.161832 2 62 0 +NoteOn 0.112407 2 60 69 +NoteOff 0.086130 2 60 0 +NoteOn 0.069561 2 60 71 +NoteOff 0.930785 2 60 0 +NoteOn 0.420947 2 79 73 +NoteOff 0.122952 2 79 0 +NoteOn 0.302022 2 84 76 +NoteOff 0.058912 2 84 0 +NoteOn 0.047375 2 84 56 +NoteOff 0.050983 2 84 0 +NoteOn 0.024451 2 84 47 +NoteOff 0.040568 2 84 0 +NoteOn 0.074005 2 84 62 +NoteOff 0.038271 2 84 0 +NoteOn 0.017685 2 84 82 +NoteOff 0.050108 2 84 0 +NoteOn 0.045103 2 84 64 +NoteOff 0.052211 2 84 0 +NoteOn 0.027262 2 84 87 +NoteOff 0.057449 2 84 0 +NoteOn 0.020874 2 84 69 +NoteOff 0.064807 2 84 0 +NoteOn 0.023156 2 84 87 +NoteOff 0.065025 2 84 0 +NoteOn 0.020085 2 84 95 +NoteOff 0.083250 2 84 0 +NoteOn 0.262523 2 84 69 +NoteOn 0.009998 2 86 67 +NoteOff 0.033427 2 86 0 +NoteOff 0.049865 2 84 0 +NoteOn 0.053153 2 83 95 +NoteOff 0.158687 2 83 0 +NoteOn 0.110118 2 83 63 +NoteOff 0.096582 2 83 0 +NoteOn 0.025733 2 79 69 +NoteOff 0.189179 2 79 0 +NoteOn 0.090774 2 79 61 +NoteOff 0.104030 2 79 0 +NoteOn 0.055448 2 81 82 +NoteOff 0.175048 2 81 0 +NoteOn 0.090141 2 81 61 +NoteOff 0.109698 2 81 0 +NoteOn 0.028956 2 76 82 +NoteOff 0.314368 2 76 0 +NoteOn 0.108070 2 76 82 +NoteOff 0.575279 2 76 0 +NoteOn 0.097466 2 76 67 +NoteOff 0.119284 2 76 0 +NoteOn 0.037984 2 74 82 +NoteOff 0.133603 2 74 0 +NoteOn 0.132143 2 72 67 +NoteOff 0.058172 2 72 0 +NoteOn 0.090606 2 72 73 +NoteOff 0.068605 2 72 0 +NoteOn 0.056346 2 72 67 +NoteOff 0.124718 2 72 0 +NoteOn 0.056027 2 72 62 +NoteOff 0.059034 2 72 0 +NoteOn 0.005466 2 72 67 +NoteOff 0.051338 2 72 0 +NoteOn 0.048824 2 72 69 +NoteOff 0.118099 2 72 0 +NoteOn 0.047326 2 72 69 +NoteOff 0.066170 2 72 0 +NoteOn 0.006492 2 72 76 +NoteOff 0.179860 2 72 0 +NoteOn 0.189600 2 76 87 +NoteOff 0.090606 2 76 0 +NoteOn 0.063909 2 74 82 +NoteOff 0.188171 2 74 0 +NoteOn 0.085969 2 72 71 +NoteOff 0.063885 2 72 0 +NoteOn 0.073370 2 72 79 +NoteOff 1.011060 2 72 0 diff --git a/scores/instructions b/scores/instructions new file mode 100644 index 0000000..8a64d96 --- /dev/null +++ b/scores/instructions @@ -0,0 +1,29 @@ +useage: testMono Instr file.ski + where Instr = Marimba Vibraphn AgogoBel Plucked + Mandolin Clarinet Flute Brass Bowed + Rhodey Wurley TubeBell HeavyMtl + PercFlut BeeThree Moog1 + + +Suggested Score Pairings: + +BeeThree bookert.ski + or organs.ski +Rhodey doogie.ski +Mandolin duelingb.ski +Bowed fiddle.ski +PercFlut misacrio.ski +AgogoBel morazbel.ski +Brass pictures.ski +Wurley riderson.ski +Flute simplgft.ski +Clarinet simplgft.ski +Marimba spain.ski +Vibraphn spain.ski +HeavyMtl streetsf.ski +Moog1 thecars.ski +TubeBell tubebell.ski + +FMVoices or +VoicForm lacrymos.ski + or vocaliz.ski diff --git a/scores/lacrymos.ski b/scores/lacrymos.ski new file mode 100644 index 0000000..d3beef7 --- /dev/null +++ b/scores/lacrymos.ski @@ -0,0 +1,34 @@ +/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ +ControlChange 0.000000 1 1 20.000000 +ControlChange 0.000000 1 4 22.000000 +NoteOn 0.000000 1 46 64.000000 +ControlChange 0.200000 1 4 8.000000 +NoteOff 0.800000 1 46 64.500000 +NoteOn 0.000000 1 51 74.000000 +NoteOff 0.750000 1 51 74.500000 +NoteOn 0.000000 1 53 84.000000 +ControlChange 0.000000 1 4 0.000000 +NoteOff 0.250000 1 53 84.500000 +NoteOn 0.000000 1 54 84.000000 +ControlChange 0.000000 1 4 10.000000 +NoteOff 1.500000 1 54 84.500000 +NoteOn 0.000000 1 54 84.000000 +ControlChange 0.000000 1 4 8.000000 +NoteOff 0.500000 1 54 84.500000 +NoteOn 0.000000 1 53 84.000000 +ControlChange 0.000000 1 4 0.000000 +NoteOff 0.500000 1 53 84.500000 +NoteOn 0.000000 1 51 84.000000 +NoteOff 0.500000 1 51 84.500000 +NoteOn 0.000000 1 53 84.000000 +ControlChange 0.000000 1 4 4.000000 +NoteOff 0.500000 1 53 84.500000 +NoteOn 0.000000 1 54 94.000000 +NoteOff 0.500000 1 54 94.500000 +NoteOn 0.000000 1 51 74.000000 +ControlChange 0.000000 1 4 0.000000 +NoteOff 1.000000 1 51 74.500000 +NoteOn 0.000000 1 46 32.000000 +ControlChange 0.000000 1 4 8.000000 +ControlChange 0.000000 1 1 40.000000 +NoteOff 1.950023 1 46 64.500000 diff --git a/scores/mandtune.ski b/scores/mandtune.ski new file mode 100644 index 0000000..fffad5c --- /dev/null +++ b/scores/mandtune.ski @@ -0,0 +1,45 @@ +/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ +NoteOn 0.000082 2 55 82 +NoteOff 1.000000 2 55 0 +NoteOn 0.000082 2 55 82 +NoteOff 0.700000 2 55 0 +NoteOn 0.000082 2 62 82 +NoteOff 0.600000 2 62 0 +NoteOn 0.000082 2 62 82 +NoteOff 1.000000 2 62 0 +NoteOn 0.000082 2 69 82 +NoteOff 0.500000 2 69 0 +ControlChange 0.100000 1 1 10 +ControlChange 0.100000 1 1 20 +ControlChange 0.100000 1 1 30 +ControlChange 0.100000 1 1 40 +ControlChange 0.100000 1 1 50 +NoteOn 0.000000 2 69 82 +ControlChange 0.100000 1 1 40 +ControlChange 0.100000 1 1 30 +ControlChange 0.100000 1 1 22 +ControlChange 0.100000 1 1 12 +NoteOn 0.000000 2 69 82 +ControlChange 0.100000 1 1 10 +ControlChange 0.100000 1 1 20 +ControlChange 0.100000 1 1 30 +ControlChange 0.100000 1 1 40 +ControlChange 0.100000 1 1 50 +ControlChange 0.100000 1 1 60 +ControlChange 0.100000 1 1 50 +ControlChange 0.100000 1 1 40 +ControlChange 0.100000 1 1 30 +ControlChange 0.100000 1 1 20 +ControlChange 0.100000 1 1 10 +ControlChange 0.100000 1 1 6 +NoteOn 0.000082 2 69 82 +NoteOff 1.000000 2 69 0 +NoteOn 0.000082 2 76 82 +NoteOff 0.800000 2 76 0 +NoteOn 0.000082 2 76 82 +NoteOff 0.800000 2 76 0 +NoteOn 0.000082 2 55 82 +NoteOn 0.200000 2 62 82 +NoteOn 0.100000 2 71 82 +NoteOn 0.200000 2 79 82 +NoteOff 1.000000 2 79 82 diff --git a/scores/misacrio.ski b/scores/misacrio.ski new file mode 100644 index 0000000..8a206b7 --- /dev/null +++ b/scores/misacrio.ski @@ -0,0 +1,58 @@ +/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ +NoteOn 0.000000 1 67 127.000000 +NoteOff 0.142494 1 67 63.500000 +NoteOn 0.007528 1 67 127.000000 +NoteOff 0.149977 1 67 63.500000 +NoteOn 0.149977 1 67 127.000000 +NoteOff 0.285034 1 67 63.500000 +NoteOn 0.015011 1 69 127.000000 +NoteOff 0.142494 1 69 63.500000 +NoteOn 0.007528 1 67 127.000000 +NoteOff 0.285034 1 67 63.500000 +NoteOn 0.015011 1 64 127.000000 +NoteOff 1.140000 1 64 63.500000 +NoteOn 0.060000 1 64 127.000000 +NoteOff 0.074966 1 64 63.500000 +NoteOn 0.074966 1 64 127.000000 +NoteOff 0.149977 1 64 63.500000 +NoteOn 0.149977 1 64 127.000000 +NoteOff 0.285034 1 64 63.500000 +NoteOn 0.015011 1 62 127.000000 +NoteOff 0.074966 1 62 63.500000 +NoteOn 0.074966 1 60 127.000000 +NoteOff 0.149977 1 60 63.500000 +NoteOn 0.149977 1 57 127.000000 +NoteOff 1.140000 1 57 63.500000 +NoteOn 0.060000 1 79 127.000000 +NoteOff 0.142494 1 79 63.500000 +NoteOn 0.007528 1 79 127.000000 +NoteOff 0.149977 1 79 63.500000 +NoteOn 0.149977 1 79 127.000000 +NoteOff 0.285034 1 79 63.500000 +NoteOn 0.015011 1 81 127.000000 +NoteOff 0.142494 1 81 63.500000 +NoteOn 0.007528 1 79 127.000000 +NoteOff 0.285034 1 79 63.500000 +NoteOn 0.015011 1 76 127.000000 +NoteOff 1.140000 1 76 63.500000 +NoteOn 0.060000 1 76 127.000000 +NoteOff 0.074966 1 76 63.500000 +NoteOn 0.074966 1 76 127.000000 +NoteOff 0.149977 1 76 63.500000 +NoteOn 0.149977 1 76 127.000000 +NoteOff 0.285034 1 76 63.500000 +NoteOn 0.015011 1 74 127.000000 +NoteOff 0.074966 1 74 63.500000 +NoteOn 0.074966 1 72 127.000000 +NoteOff 0.149977 1 72 63.500000 +NoteOn 0.149977 1 69 127.000000 +NoteOff 0.449977 1 69 63.500000 +NoteOn 0.449977 1 79 127.000000 +NoteOff 0.149977 1 79 63.500000 +NoteOn 0.149977 1 81 127.000000 +NoteOff 0.855011 1 81 63.500000 +NoteOn 0.045034 1 91 127.000000 +NoteOff 0.149977 1 91 63.500000 +NoteOn 0.149977 1 93 127.000000 +NoteOff 0.950023 1 93 63.500000 +NoteOff 0.050023 1 93 63.500000 diff --git a/scores/morazbel.ski b/scores/morazbel.ski new file mode 100644 index 0000000..c7d9fb3 --- /dev/null +++ b/scores/morazbel.ski @@ -0,0 +1,43 @@ +/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ +NoteOn 0.000000 1 67 63.500000 +NoteOn 0.200000 1 64 101.600002 +NoteOn 0.200000 1 64 101.600002 +NoteOn 0.200000 1 67 101.600002 +NoteOn 0.200000 1 67 76.200003 +NoteOn 0.200000 1 64 38.100002 +NoteOn 0.300000 1 67 101.600002 +NoteOn 0.300000 1 67 127.000000 +NoteOn 0.200000 1 64 76.200003 +NoteOn 0.200000 1 67 114.299997 +NoteOn 0.200000 1 69 127.000000 +NoteOn 0.100000 1 67 50.800001 +NoteOn 0.100000 1 64 88.899998 +NoteOn 0.100000 1 62 63.500000 +NoteOn 0.100000 1 64 76.200003 +NoteOn 0.600000 1 79 127.000000 +NoteOn 0.200000 1 76 127.000000 +NoteOn 0.200000 1 76 127.000000 +NoteOn 0.200000 1 79 127.000000 +NoteOn 0.200000 1 79 127.000000 +NoteOn 0.100000 1 81 127.000000 +NoteOn 0.200000 1 79 127.000000 +NoteOn 0.100000 1 76 127.000000 +NoteOn 0.100000 1 74 127.000000 +NoteOn 0.100000 1 76 127.000000 +NoteOn 0.100000 1 45 127.000000 +NoteOn 0.100000 1 48 127.000000 +NoteOn 0.100000 1 50 127.000000 +NoteOn 0.100000 1 52 127.000000 +NoteOn 0.200000 1 50 127.000000 +NoteOn 0.100000 1 48 127.000000 +NoteOn 0.100000 1 50 127.000000 +NoteOn 0.100000 1 45 127.000000 +NoteOn 0.100000 1 48 127.000000 +NoteOn 0.100000 1 50 127.000000 +NoteOn 0.100000 1 52 127.000000 +NoteOn 0.200000 1 50 127.000000 +NoteOn 0.100000 1 48 127.000000 +NoteOn 0.100000 1 50 127.000000 +NoteOn 0.100000 1 32 127.000000 +NoteOn 0.100000 1 36 127.000000 +NoteOff 0.800000 1 36 63.500000 diff --git a/scores/organs.ski b/scores/organs.ski new file mode 100644 index 0000000..c4a5be2 --- /dev/null +++ b/scores/organs.ski @@ -0,0 +1,221 @@ +/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ +NoteOn 0.000327 2 68 64 +NoteOn 0.011439 2 72 60 +NoteOn 0.100661 2 69 58 +NoteOff 0.022910 2 68 0 +NoteOff 0.087179 2 69 0 +NoteOff 0.002768 2 72 0 +NoteOn 0.146276 2 74 60 +NoteOn 0.007877 2 70 73 +NoteOff 0.065823 2 74 0 +NoteOff 0.034091 2 70 0 +NoteOn 0.071562 2 65 42 +NoteOff 0.095505 2 65 0 +NoteOn 0.117222 2 72 36 +NoteOn 0.003568 2 75 57 +NoteOff 0.867934 2 72 0 +NoteOff 0.016747 2 75 0 +NoteOn 0.001292 2 70 66 +NoteOn 0.016806 2 74 41 +NoteOff 0.903721 2 70 0 +NoteOn 0.002269 2 71 60 +NoteOff 0.002452 2 74 0 +NoteOff 0.024367 2 71 0 +NoteOn 0.573769 2 71 71 +NoteOn 0.071125 2 72 47 +NoteOff 0.017603 2 71 0 +NoteOn 0.099531 2 77 63 +NoteOff 0.005133 2 72 0 +NoteOn 0.002825 2 75 57 +NoteOff 0.051047 2 77 0 +NoteOn 0.062443 2 72 42 +NoteOff 0.003421 2 75 0 +NoteOn 0.004190 2 73 22 +NoteOff 0.032476 2 73 0 +NoteOff 0.003357 2 72 0 +NoteOn 0.003412 2 71 51 +NoteOff 0.082169 2 71 0 +NoteOn 0.030527 2 70 64 +NoteOff 0.068936 2 70 0 +NoteOn 0.002836 2 68 63 +NoteOff 0.069395 2 68 0 +NoteOn 0.024967 2 65 52 +NoteOff 0.083696 2 65 0 +NoteOn 0.027784 2 63 69 +NoteOff 0.102489 2 63 0 +NoteOn 0.048174 2 60 61 +NoteOff 0.094914 2 60 0 +NoteOn 0.076034 2 58 62 +NoteOff 0.080772 2 58 0 +NoteOn 0.107826 2 56 73 +NoteOff 0.114325 2 56 0 +NoteOn 0.159665 2 53 71 +NoteOff 0.094385 2 53 0 +NoteOn 0.218823 2 56 82 +NoteOff 0.396073 2 56 0 +NoteOn 0.016601 2 53 79 +NoteOff 0.590675 2 53 0 +NoteOn 0.013945 2 41 61 +NoteOn 0.003797 2 53 48 +NoteOn 0.749734 2 57 69 +NoteOn 0.006420 2 63 69 +NoteOff 0.004025 2 53 0 +NoteOn 0.001033 2 59 71 +NoteOff 0.183718 2 59 0 +ControlChange 0.981560 2 1 1 +ControlChange 0.014051 2 1 2 +ControlChange 0.018312 2 1 3 +ControlChange 0.013991 2 1 4 +ControlChange 0.014672 2 1 5 +ControlChange 0.008917 2 1 6 +ControlChange 0.009676 2 1 7 +ControlChange 0.009401 2 1 8 +ControlChange 0.014007 2 1 9 +ControlChange 0.009716 2 1 10 +ControlChange 0.009322 2 1 11 +ControlChange 0.009533 2 1 12 +ControlChange 0.009596 2 1 13 +ControlChange 0.009475 2 1 14 +ControlChange 0.014006 2 1 15 +ControlChange 0.009540 2 1 16 +ControlChange 0.010279 2 1 17 +ControlChange 0.013663 2 1 18 +ControlChange 0.009675 2 1 19 +ControlChange 0.009790 2 1 20 +ControlChange 0.014027 2 1 21 +ControlChange 0.013973 2 1 22 +ControlChange 0.009544 2 1 23 +ControlChange 0.014007 2 1 24 +ControlChange 0.010353 2 1 25 +ControlChange 0.010221 2 1 26 +ControlChange 0.017407 2 1 27 +ControlChange 0.010088 2 1 28 +ControlChange 0.009214 2 1 29 +ControlChange 0.009312 2 1 31 +ControlChange 0.014216 2 1 32 +ControlChange 0.004844 2 1 33 +ControlChange 0.009540 2 1 34 +ControlChange 0.005039 2 1 35 +ControlChange 0.009520 2 1 36 +ControlChange 0.010018 2 1 37 +ControlChange 0.004663 2 1 38 +ControlChange 0.009539 2 1 39 +ControlChange 0.009540 2 1 41 +ControlChange 0.005017 2 1 42 +ControlChange 0.009504 2 1 43 +ControlChange 0.005097 2 1 44 +ControlChange 0.009941 2 1 45 +ControlChange 0.004610 2 1 46 +ControlChange 0.005284 2 1 47 +ControlChange 0.004821 2 1 48 +ControlChange 0.005134 2 1 49 +ControlChange 0.009580 2 1 51 +ControlChange 0.009561 2 1 52 +ControlChange 0.019091 2 1 54 +ControlChange 0.001107 2 1 55 +ControlChange 0.003756 2 1 56 +ControlChange 0.009684 2 1 57 +ControlChange 0.004888 2 1 58 +ControlChange 0.014042 2 1 59 +ControlChange 0.009508 2 1 60 +ControlChange 0.009528 2 1 61 +ControlChange 0.014029 2 1 62 +ControlChange 0.009753 2 1 63 +ControlChange 0.018303 2 1 64 +ControlChange 0.014210 2 1 65 +ControlChange 0.027270 2 1 66 +ControlChange 0.027450 2 1 67 +ControlChange 0.072463 2 1 68 +ControlChange 0.040774 2 1 69 +ControlChange 0.022966 2 1 70 +ControlChange 0.018511 2 1 71 +ControlChange 0.023463 2 1 72 +ControlChange 0.013521 2 1 73 +ControlChange 0.014483 2 1 74 +ControlChange 0.013854 2 1 75 +ControlChange 0.009555 2 1 76 +ControlChange 0.018674 2 1 77 +ControlChange 0.009540 2 1 78 +ControlChange 0.009616 2 1 79 +ControlChange 0.013994 2 1 80 +ControlChange 0.014260 2 1 81 +ControlChange 0.018448 2 1 82 +ControlChange 0.032114 2 1 83 +ControlChange 0.058711 2 1 84 +ControlChange 0.049895 2 1 85 +ControlChange 0.032104 2 1 86 +ControlChange 0.036434 2 1 87 +ControlChange 0.022873 2 1 88 +ControlChange 0.068096 2 1 89 +ControlChange 0.112544 2 1 90 +ControlChange 0.018361 2 1 91 +ControlChange 0.018528 2 1 92 +ControlChange 0.018461 2 1 93 +ControlChange 0.014041 2 1 94 +ControlChange 0.037010 2 1 95 +ControlChange 0.008956 2 1 96 +ControlChange 0.099445 2 1 95 +ControlChange 0.013834 2 1 94 +ControlChange 0.009499 2 1 93 +ControlChange 0.010104 2 1 92 +ControlChange 0.005027 2 1 91 +ControlChange 0.010180 2 1 90 +ControlChange 0.008871 2 1 89 +ControlChange 0.009510 2 1 88 +ControlChange 0.005047 2 1 87 +ControlChange 0.014061 2 1 86 +ControlChange 0.009903 2 1 85 +ControlChange 0.009119 2 1 84 +ControlChange 0.009573 2 1 83 +ControlChange 0.009491 2 1 82 +ControlChange 0.005078 2 1 81 +ControlChange 0.005002 2 1 80 +ControlChange 0.009607 2 1 78 +ControlChange 0.005082 2 1 77 +ControlChange 0.009826 2 1 76 +ControlChange 0.004771 2 1 75 +ControlChange 0.005025 2 1 74 +ControlChange 0.005486 2 1 72 +ControlChange 0.004613 2 1 71 +ControlChange 0.005046 2 1 70 +ControlChange 0.005514 2 1 69 +ControlChange 0.004571 2 1 67 +ControlChange 0.005025 2 1 66 +ControlChange 0.005039 2 1 65 +ControlChange 0.005033 2 1 63 +ControlChange 0.005073 2 1 62 +ControlChange 0.005017 2 1 60 +ControlChange 0.005073 2 1 59 +ControlChange 0.005033 2 1 57 +ControlChange 0.005061 2 1 56 +ControlChange 0.005057 2 1 54 +ControlChange 0.005024 2 1 52 +ControlChange 0.005068 2 1 51 +ControlChange 0.004988 2 1 49 +ControlChange 0.005074 2 1 47 +ControlChange 0.005035 2 1 45 +ControlChange 0.005221 2 1 44 +ControlChange 0.005234 2 1 42 +ControlChange 0.005196 2 1 40 +ControlChange 0.005115 2 1 38 +ControlChange 0.005286 2 1 36 +ControlChange 0.005148 2 1 34 +ControlChange 0.005234 2 1 32 +ControlChange 0.005301 2 1 30 +ControlChange 0.005069 2 1 28 +ControlChange 0.005155 2 1 26 +ControlChange 0.008498 2 1 24 +ControlChange 0.002918 2 1 21 +ControlChange 0.004145 2 1 20 +ControlChange 0.005652 2 1 17 +ControlChange 0.004790 2 1 15 +ControlChange 0.005180 2 1 13 +ControlChange 0.005223 2 1 10 +ControlChange 0.005177 2 1 8 +ControlChange 0.005270 2 1 6 +ControlChange 0.005135 2 1 4 +ControlChange 0.005196 2 1 2 +ControlChange 0.005197 2 1 0 +NoteOff 0.354573 2 63 0 +NoteOff 0.014193 2 57 0 +NoteOff 0.008219 2 41 0 diff --git a/scores/pictures.ski b/scores/pictures.ski new file mode 100644 index 0000000..269e4c0 --- /dev/null +++ b/scores/pictures.ski @@ -0,0 +1,30 @@ +/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ +NoteOn 0.000000 1 72 127.000000 +NoteOff 0.540000 1 72 63.500000 +NoteOn 0.060000 1 70 127.000000 +NoteOff 0.540000 1 70 63.500000 +NoteOn 0.060000 1 75 127.000000 +NoteOff 0.540000 1 75 63.500000 +NoteOn 0.060000 1 77 127.000000 +NoteOff 0.270023 1 77 63.500000 +NoteOn 0.030023 1 70 127.000000 +ControlChange 0.000000 1 2 96.000000 +NoteOff 0.299728 1 70 63.500000 +NoteOn 0.000317 1 79 127.000000 +NoteOff 0.540000 1 79 63.500000 +NoteOn 0.060000 1 77 127.000000 +NoteOff 0.270023 1 77 63.500000 +NoteOn 0.030023 1 70 127.000000 +ControlChange 0.000000 1 2 96.000000 +NoteOff 0.299728 1 70 63.500000 +NoteOn 0.000317 1 79 127.000000 +NoteOff 0.540000 1 79 63.500000 +NoteOn 0.060000 1 75 127.000000 +NoteOff 0.540000 1 75 63.500000 +NoteOn 0.060000 1 77 127.000000 +NoteOff 0.540000 1 77 63.500000 +NoteOn 0.060000 1 72 127.000000 +NoteOff 0.540000 1 72 63.500000 +NoteOn 0.060000 1 70 127.000000 +NoteOff 0.540000 1 70 63.500000 +NoteOff 0.060000 1 70 63.500000 diff --git a/scores/riderson.ski b/scores/riderson.ski new file mode 100644 index 0000000..4b8ba8f --- /dev/null +++ b/scores/riderson.ski @@ -0,0 +1,63 @@ +/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ +ControlChange 0.000000 1 1 50.000000 +NoteOn 0.000000 1 60 114.299997 +NoteOff 0.480045 1 60 88.899998 +NoteOn 0.120045 1 60 76.200003 +NoteOff 0.150023 1 60 63.500000 +NoteOn 0.150023 1 62 101.600002 +NoteOff 0.720000 1 62 88.899998 +NoteOn 0.180000 1 62 76.200003 +NoteOff 0.150023 1 62 63.500000 +NoteOn 0.150023 1 63 101.600002 +NoteOff 0.720000 1 63 88.899998 +NoteOn 0.180000 1 63 38.100002 +NoteOff 0.150023 1 63 63.500000 +NoteOn 0.150023 1 62 101.600002 +NoteOff 0.720000 1 62 88.899998 +NoteOn 0.180000 1 62 76.200003 +NoteOff 0.480045 1 62 88.899998 +NoteOn 0.120045 1 48 114.299997 +NoteOff 0.480045 1 48 88.899998 +NoteOn 0.120045 1 48 76.200003 +NoteOff 0.150023 1 48 63.500000 +NoteOn 0.150023 1 50 101.600002 +NoteOff 0.720000 1 50 88.899998 +NoteOn 0.180000 1 50 76.200003 +NoteOff 0.150023 1 50 63.500000 +NoteOn 0.150023 1 51 101.600002 +NoteOff 0.720000 1 51 88.899998 +NoteOn 0.180000 1 51 38.100002 +NoteOff 0.150023 1 51 63.500000 +NoteOn 0.150023 1 50 101.600002 +NoteOff 0.720000 1 50 88.899998 +NoteOn 0.180000 1 48 76.200003 +NoteOff 0.240045 1 48 88.899998 +NoteOn 0.060045 1 72 88.899998 +NoteOff 0.240045 1 72 88.899998 +NoteOn 0.060045 1 77 114.299997 +NoteOff 0.240045 1 77 88.899998 +NoteOn 0.060045 1 77 101.600002 +NoteOff 0.240045 1 77 88.899998 +NoteOn 0.060045 1 77 88.899998 +NoteOff 0.240045 1 77 88.899998 +NoteOn 0.060045 1 75 76.200003 +NoteOff 0.240045 1 75 88.899998 +NoteOn 0.060045 1 77 88.899998 +NoteOff 0.480045 1 77 88.899998 +NoteOn 0.120045 1 77 88.899998 +NoteOff 0.150023 1 77 63.500000 +NoteOn 0.150023 1 77 88.899998 +NoteOff 0.150023 1 77 63.500000 +NoteOn 0.150023 1 87 101.600002 +NoteOff 0.240045 1 87 88.899998 +NoteOn 0.060045 1 84 76.200003 +NoteOff 0.150023 1 84 63.500000 +NoteOn 0.150023 1 84 76.200003 +NoteOff 0.240045 1 84 88.899998 +NoteOn 0.060045 1 82 76.200003 +NoteOff 0.240045 1 82 88.899998 +NoteOn 0.060045 1 84 88.899998 +NoteOff 0.960045 1 84 88.899998 +NoteOn 0.240045 1 48 127.000000 +ControlChange 0.000000 1 1 127.000000 +NoteOff 1.300000 1 48 63.500000 diff --git a/scores/simplgft.ski b/scores/simplgft.ski new file mode 100644 index 0000000..56e9f78 --- /dev/null +++ b/scores/simplgft.ski @@ -0,0 +1,47 @@ +/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ +NoteOn 0.000000 1 60 127.000000 +NoteOff 0.475011 1 60 63.500000 +NoteOn 0.025034 1 65 127.000000 +NoteOff 0.475011 1 65 63.500000 +NoteOn 0.025034 1 65 127.000000 +NoteOff 0.124989 1 65 63.500000 +NoteOn 0.124989 1 67 127.000000 +NoteOff 0.124989 1 67 63.500000 +NoteOn 0.124989 1 69 127.000000 +NoteOff 0.237506 1 69 63.500000 +NoteOn 0.012517 1 65 127.000000 +NoteOff 0.124989 1 65 63.500000 +NoteOn 0.124989 1 69 127.000000 +NoteOff 0.124989 1 69 63.500000 +NoteOn 0.124989 1 70 127.000000 +NoteOff 0.237506 1 70 63.500000 +NoteOn 0.012517 1 72 127.000000 +NoteOff 0.475011 1 72 63.500000 +NoteOn 0.025034 1 72 127.000000 +NoteOff 0.237506 1 72 63.500000 +NoteOn 0.012517 1 70 127.000000 +NoteOff 0.124989 1 70 63.500000 +NoteOn 0.124989 1 69 127.000000 +NoteOff 0.475011 1 69 63.500000 +NoteOn 0.025034 1 79 127.000000 +NoteOff 0.124989 1 79 63.500000 +NoteOn 0.124989 1 77 127.000000 +NoteOff 0.124989 1 77 63.500000 +NoteOn 0.124989 1 79 127.000000 +NoteOff 0.475011 1 79 63.500000 +NoteOn 0.025034 1 79 127.000000 +NoteOff 0.475011 1 79 63.500000 +NoteOn 0.025034 1 81 127.000000 +NoteOff 0.475011 1 81 63.500000 +NoteOn 0.025034 1 81 127.000000 +NoteOff 0.124989 1 81 63.500000 +NoteOn 0.124989 1 79 127.000000 +NoteOff 0.124989 1 79 63.500000 +NoteOn 0.124989 1 77 127.000000 +ControlChange 0.000000 1 1 32.000000 +NoteOff 0.475011 1 77 63.500000 +NoteOn 0.025034 1 65 127.000000 +NoteOff 0.475011 1 65 63.500000 +NoteOn 0.025034 1 41 127.000000 +NoteOff 0.950023 1 41 63.500000 +NoteOff 0.050023 1 41 63.500000 diff --git a/scores/spain.ski b/scores/spain.ski new file mode 100644 index 0000000..2423500 --- /dev/null +++ b/scores/spain.ski @@ -0,0 +1,23 @@ +/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ +NoteOn 0.000000 1 48 88.899998 +NoteOff 0.416009 1 48 63.500000 +NoteOn 0.104036 1 53 101.600002 +NoteOff 0.312018 1 53 63.500000 +NoteOn 0.078005 1 56 63.500000 +NoteOn 0.130023 1 55 101.600002 +NoteOn 0.260000 1 51 76.200003 +NoteOn 0.130023 1 48 38.100002 +NoteOn 0.130023 1 53 101.600002 +NoteOn 0.520000 1 58 127.000000 +NoteOff 0.312018 1 58 63.500000 +NoteOn 0.078005 1 63 76.200003 +NoteOn 0.130023 1 62 114.299997 +NoteOff 0.416009 1 62 63.500000 +NoteOn 0.104036 1 58 127.000000 +NoteOn 0.130023 1 60 50.800001 +NoteOn 0.260000 1 56 88.899998 +NoteOn 0.260000 1 56 63.500000 +NoteOn 0.130023 1 63 76.200003 +NoteOn 0.260000 1 41 127.000000 +ControlChange 0.000000 1 1 127.000000 +NoteOff 1.950023 1 41 63.500000 diff --git a/scores/streetsf.ski b/scores/streetsf.ski new file mode 100644 index 0000000..7e09fa1 --- /dev/null +++ b/scores/streetsf.ski @@ -0,0 +1,56 @@ +/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ +NoteOn 0.000000 1 60 127.000000 +NoteOff 0.126032 1 60 63.500000 +NoteOn 0.014014 1 60 127.000000 +NoteOff 0.252018 1 60 63.500000 +NoteOn 0.028027 1 60 127.000000 +NoteOff 0.252018 1 60 63.500000 +NoteOn 0.028027 1 60 127.000000 +NoteOff 0.126032 1 60 63.500000 +NoteOn 0.014014 1 63 127.000000 +NoteOff 0.126032 1 63 63.500000 +NoteOn 0.014014 1 60 127.000000 +NoteOff 0.126032 1 60 63.500000 +NoteOn 0.014014 1 65 127.000000 +NoteOff 0.252018 1 65 63.500000 +NoteOn 0.028027 1 67 127.000000 +NoteOff 0.756009 1 67 63.500000 +NoteOn 0.084036 1 72 127.000000 +NoteOff 0.252018 1 72 63.500000 +NoteOn 0.028027 1 75 127.000000 +NoteOff 0.126032 1 75 63.500000 +NoteOn 0.014014 1 72 127.000000 +NoteOff 0.378005 1 72 63.500000 +NoteOn 0.042041 1 70 127.000000 +NoteOff 0.126032 1 70 63.500000 +NoteOn 0.014014 1 67 127.000000 +NoteOff 0.126032 1 67 63.500000 +NoteOn 0.014014 1 72 127.000000 +NoteOff 0.252018 1 72 63.500000 +NoteOn 0.028027 1 70 127.000000 +NoteOff 0.252018 1 70 63.500000 +NoteOn 0.028027 1 67 127.000000 +NoteOff 0.126032 1 67 63.500000 +NoteOn 0.014014 1 65 127.000000 +NoteOff 0.126032 1 65 63.500000 +NoteOn 0.014014 1 63 127.000000 +NoteOff 0.252018 1 63 63.500000 +NoteOn 0.028027 1 48 127.000000 +NoteOff 0.126032 1 48 63.500000 +NoteOn 0.014014 1 48 127.000000 +NoteOff 0.252018 1 48 63.500000 +NoteOn 0.028027 1 48 127.000000 +NoteOff 0.252018 1 48 63.500000 +NoteOn 0.028027 1 48 127.000000 +NoteOff 0.126032 1 48 63.500000 +NoteOn 0.014014 1 51 127.000000 +NoteOff 0.126032 1 51 63.500000 +NoteOn 0.014014 1 48 127.000000 +NoteOff 0.126032 1 48 63.500000 +NoteOn 0.014014 1 53 127.000000 +NoteOff 0.252018 1 53 63.500000 +NoteOn 0.028027 1 51 127.000000 +NoteOff 1.260000 1 51 63.500000 +NoteOn 0.140000 1 84 127.000000 +NoteOff 0.630023 1 84 63.500000 +NoteOff 0.070023 1 84 63.500000 diff --git a/scores/thecars.ski b/scores/thecars.ski new file mode 100644 index 0000000..f7076c4 --- /dev/null +++ b/scores/thecars.ski @@ -0,0 +1,38 @@ +/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ +NoteOn 0.000000 1 48 127.000000 +NoteOff 0.380000 1 48 63.500000 +NoteOn 0.020000 1 48 127.000000 +NoteOff 0.100000 1 48 63.500000 +NoteOn 0.100000 1 48 127.000000 +NoteOff 0.100000 1 48 63.500000 +NoteOn 0.100000 1 51 127.000000 +NoteOff 0.100000 1 51 63.500000 +NoteOn 0.100000 1 51 127.000000 +NoteOff 0.570023 1 51 63.500000 +NoteOn 0.030023 1 50 127.000000 +NoteOff 0.100000 1 50 63.500000 +NoteOn 0.100000 1 46 127.000000 +NoteOff 0.200000 1 46 63.500000 +NoteOn 0.200000 1 60 127.000000 +NoteOff 0.950023 1 60 63.500000 +NoteOn 0.050023 1 77 127.000000 +NoteOff 0.190023 1 77 63.500000 +NoteOn 0.010023 1 72 127.000000 +NoteOff 0.190023 1 72 63.500000 +NoteOn 0.010023 1 69 127.000000 +NoteOff 0.100000 1 69 63.500000 +NoteOn 0.100000 1 75 127.000000 +NoteOff 0.380000 1 75 63.500000 +NoteOn 0.020000 1 70 127.000000 +NoteOff 0.100000 1 70 63.500000 +NoteOn 0.100000 1 67 127.000000 +NoteOff 0.100000 1 67 63.500000 +NoteOn 0.100000 1 74 127.000000 +NoteOff 0.380000 1 74 63.500000 +NoteOn 0.020000 1 70 127.000000 +NoteOff 0.100000 1 70 63.500000 +NoteOn 0.100000 1 65 127.000000 +NoteOff 0.100000 1 65 63.500000 +NoteOn 0.100000 1 72 127.000000 +ControlChange 0.000000 1 1 20.000000 +NoteOff 1.000000 1 72 63.500000 diff --git a/scores/tstloops.sco b/scores/tstloops.sco new file mode 100644 index 0000000..fc05d88 --- /dev/null +++ b/scores/tstloops.sco @@ -0,0 +1,60 @@ +/******* Pitch and amplitude Test Loops ********/ + +/* for (j=0;j<12;j++) { + printf("%lf\n",55.0 * pow(1.414,j)); + instrument.noteOn(55.0 * pow(1.414,j),0.1); + for (i=0;i<15000;i++) output.tick(instrument.tick()); + instrument.noteOff(0.1); + for (i=0;i<5000;i++) output.tick(instrument.tick()); + instrument.noteOn(55.0 * pow(1.414,j),0.4); + for (i=0;i<15000;i++) output.tick(instrument.tick()); + instrument.noteOff(0.1); + for (i=0;i<5000;i++) output.tick(instrument.tick()); + instrument.noteOn(55.0 * pow(1.414,j),0.7); + for (i=0;i<15000;i++) output.tick(instrument.tick()); + instrument.noteOff(0.1); + for (i=0;i<5000;i++) output.tick(instrument.tick()); + instrument.noteOn(55.0 * pow(1.414,j),1.0); + for (i=0;i<15000;i++) output.tick(instrument.tick()); + instrument.noteOff(0.1); + for (i=0;i<5000;i++) output.tick(instrument.tick()); + } +*/ + +/************ Controller Test Loops ***************/ + for (j=0;j<5;j++) { + instrument.noteOn(440,1.0); + instrument.controlChange(MOD_WHEEL,3 + (j*31)); + for (i=0;i<20000;i++) { + output.tick(instrument.tick()); + } + } + for (j=0;j<5;j++) { + instrument.noteOn(440,1.0); + instrument.controlChange(CONTROL3,3 + (j*31)); + for (i=0;i<20000;i++) { + output.tick(instrument.tick()); + } + } + instrument.controlChange(CONTROL3,64); + instrument.controlChange(MOD_WHEEL,0); + for (j=0;j<5;j++) { + instrument.controlChange(CONTROL1,3 + (j*31)); + instrument.noteOn(440,1.0); /* some need it before, some after */ + instrument.controlChange(CONTROL1,3 + (j*31)); + for (i=0;i<20000;i++) { + output.tick(instrument.tick()); + } + } + instrument.controlChange(CONTROL1,64); + for (j=0;j<5;j++) { + instrument.controlChange(CONTROL2,3 + (j*31)); + instrument.noteOn(440,1.0); /* some need it before, some after */ + instrument.controlChange(CONTROL2,3 + (j*31)); + for (i=0;i<20000;i++) { + output.tick(instrument.tick()); + } + } + instrument.controlChange(CONTROL2,64); + + diff --git a/scores/tubebell.ski b/scores/tubebell.ski new file mode 100644 index 0000000..67cd14a --- /dev/null +++ b/scores/tubebell.ski @@ -0,0 +1,19 @@ +/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ +NoteOn 0.000000 1 65 63.500000 +NoteOn 0.200000 1 73 101.600002 +NoteOn 0.200000 1 65 76.200003 +NoteOn 0.200000 1 75 114.299997 +NoteOn 0.200000 1 65 63.500000 +NoteOn 0.200000 1 72 76.200003 +NoteOn 0.200000 1 73 114.299997 +NoteOn 0.200000 1 65 50.800001 +NoteOn 0.200000 1 72 114.299997 +NoteOn 0.200000 1 65 63.500000 +NoteOn 0.200000 1 70 114.299997 +NoteOn 0.200000 1 65 50.800001 +NoteOn 0.200000 1 85 127.000000 +NoteOn 0.200000 1 65 76.200003 +NoteOn 0.200000 1 80 76.200003 +NoteOn 0.200000 1 46 127.000000 +ControlChange 0.000000 1 1 120.000000 +NoteOff 2.000000 1 46 63.500000 diff --git a/scores/vocaliz.ski b/scores/vocaliz.ski new file mode 100644 index 0000000..1f16d7d --- /dev/null +++ b/scores/vocaliz.ski @@ -0,0 +1,158 @@ +/* Howdy!! ToolKit96cpp SKINI File, Perry Cook */ +/**** BASS ****/ +ControlChange 0.000000 1 1 20.000000 +ControlChange 0.000000 1 4 8.000000 +NoteOn 0.000000 1 40 64.000000 +NoteOff 0.500000 1 40 64.500000 +NoteOn 0.000000 1 44 74.000000 +NoteOff 0.500000 1 44 64.500000 +NoteOn 0.000000 1 47 84.000000 +NoteOff 0.500000 1 47 64.500000 +NoteOn 0.000000 1 52 94.000000 +NoteOff 0.500000 1 52 64.500000 +ControlChange 0.000000 1 4 0.000000 +NoteOn 0.000000 1 51 84.000000 +NoteOff 0.500000 1 51 64.500000 +NoteOn 0.000000 1 47 74.000000 +NoteOff 0.500000 1 47 64.500000 +NoteOn 0.000000 1 45 64.000000 +NoteOff 0.500000 1 45 64.500000 +NoteOn 0.000000 1 42 54.000000 +NoteOff 0.500000 1 42 64.500000 +ControlChange 0.000000 1 4 20.000000 +NoteOn 0.000000 1 40 64.000000 +NoteOff 0.500000 1 40 64.500000 +NoteOn 0.000000 1 44 74.000000 +NoteOff 0.500000 1 44 64.500000 +NoteOn 0.000000 1 47 84.000000 +NoteOff 0.500000 1 47 64.500000 +NoteOn 0.000000 1 52 94.000000 +NoteOff 0.500000 1 52 64.500000 +ControlChange 0.000000 1 4 12.000000 +NoteOn 0.000000 1 51 84.000000 +NoteOff 0.500000 1 51 64.500000 +NoteOn 0.000000 1 47 74.000000 +NoteOff 0.500000 1 47 64.500000 +NoteOn 0.000000 1 45 64.000000 +NoteOff 0.500000 1 45 64.500000 +NoteOn 0.000000 1 42 54.000000 +NoteOff 0.500000 1 42 64.500000 +NoteOn 0.000000 1 40 64.000000 +NoteOff 1.000000 1 40 64.500000 +/**** TENOR ****/ +ControlChange 0.000000 1 4 40.000000 +NoteOn 0.000000 1 45 64.000000 +NoteOff 0.500000 1 45 64.500000 +NoteOn 0.000000 1 49 74.000000 +NoteOff 0.500000 1 49 64.500000 +NoteOn 0.000000 1 52 84.000000 +NoteOff 0.500000 1 52 64.500000 +NoteOn 0.000000 1 57 94.000000 +NoteOff 0.500000 1 57 64.500000 +ControlChange 0.000000 1 4 32.000000 +NoteOn 0.000000 1 56 84.000000 +NoteOff 0.500000 1 56 64.500000 +NoteOn 0.000000 1 52 74.000000 +NoteOff 0.500000 1 52 64.500000 +NoteOn 0.000000 1 50 64.000000 +NoteOff 0.500000 1 50 64.500000 +NoteOn 0.000000 1 47 54.000000 +NoteOff 0.500000 1 47 64.500000 +ControlChange 0.000000 1 4 52.000000 +NoteOn 0.000000 1 45 64.000000 +NoteOff 0.500000 1 45 64.500000 +NoteOn 0.000000 1 49 74.000000 +NoteOff 0.500000 1 49 64.500000 +NoteOn 0.000000 1 52 84.000000 +NoteOff 0.500000 1 52 64.500000 +NoteOn 0.000000 1 57 94.000000 +NoteOff 0.500000 1 57 64.500000 +ControlChange 0.000000 1 4 44.000000 +NoteOn 0.000000 1 56 84.000000 +NoteOff 0.500000 1 56 64.500000 +NoteOn 0.000000 1 52 74.000000 +NoteOff 0.500000 1 52 64.500000 +NoteOn 0.000000 1 50 64.000000 +NoteOff 0.500000 1 50 64.500000 +NoteOn 0.000000 1 47 54.000000 +NoteOff 0.500000 1 47 64.500000 +NoteOn 0.000000 1 45 64.000000 +NoteOff 1.000000 1 45 64.500000 +/**** ALTO ****/ +ControlChange 0.000000 1 4 72.000000 +NoteOn 0.000000 1 50 64.000000 +NoteOff 0.500000 1 50 64.500000 +NoteOn 0.000000 1 54 74.000000 +NoteOff 0.500000 1 54 64.500000 +NoteOn 0.000000 1 57 84.000000 +NoteOff 0.500000 1 57 64.500000 +NoteOn 0.000000 1 62 94.000000 +NoteOff 0.500000 1 62 64.500000 +ControlChange 0.000000 1 4 64.000000 +NoteOn 0.000000 1 61 84.000000 +NoteOff 0.500000 1 61 64.500000 +NoteOn 0.000000 1 57 74.000000 +NoteOff 0.500000 1 57 64.500000 +NoteOn 0.000000 1 55 64.000000 +NoteOff 0.500000 1 55 64.500000 +NoteOn 0.000000 1 52 54.000000 +NoteOff 0.500000 1 52 64.500000 +ControlChange 0.000000 1 4 84.000000 +NoteOn 0.000000 1 50 64.000000 +NoteOff 0.500000 1 50 64.500000 +NoteOn 0.000000 1 54 74.000000 +NoteOff 0.500000 1 54 64.500000 +NoteOn 0.000000 1 57 84.000000 +NoteOff 0.500000 1 57 64.500000 +NoteOn 0.000000 1 62 94.000000 +NoteOff 0.500000 1 62 64.500000 +ControlChange 0.000000 1 4 76.000000 +NoteOn 0.000000 1 61 84.000000 +NoteOff 0.500000 1 61 64.500000 +NoteOn 0.000000 1 57 74.000000 +NoteOff 0.500000 1 57 64.500000 +NoteOn 0.000000 1 55 64.000000 +NoteOff 0.500000 1 55 64.500000 +NoteOn 0.000000 1 52 54.000000 +NoteOff 0.500000 1 52 64.500000 +NoteOn 0.000000 1 50 64.000000 +NoteOff 1.000000 1 50 64.500000 +/**** SOPRANO ****/ +ControlChange 0.000000 1 4 104.000000 +NoteOn 0.000000 1 70 64.000000 +NoteOff 0.500000 1 70 64.500000 +NoteOn 0.000000 1 74 74.000000 +NoteOff 0.500000 1 74 64.500000 +NoteOn 0.000000 1 77 84.000000 +NoteOff 0.500000 1 77 64.500000 +NoteOn 0.000000 1 82 94.000000 +NoteOff 0.500000 1 82 64.500000 +ControlChange 0.000000 1 4 96.000000 +NoteOn 0.000000 1 81 84.000000 +NoteOff 0.500000 1 81 64.500000 +NoteOn 0.000000 1 77 74.000000 +NoteOff 0.500000 1 77 64.500000 +NoteOn 0.000000 1 75 64.000000 +NoteOff 0.500000 1 75 64.500000 +NoteOn 0.000000 1 72 54.000000 +NoteOff 0.500000 1 72 64.500000 +ControlChange 0.000000 1 4 116.000000 +NoteOn 0.000000 1 70 64.000000 +NoteOff 0.500000 1 70 64.500000 +NoteOn 0.000000 1 74 74.000000 +NoteOff 0.500000 1 74 64.500000 +NoteOn 0.000000 1 77 84.000000 +NoteOff 0.500000 1 77 64.500000 +NoteOn 0.000000 1 82 94.000000 +NoteOff 0.500000 1 82 64.500000 +ControlChange 0.000000 1 4 108.000000 +NoteOn 0.000000 1 81 84.000000 +NoteOff 0.500000 1 81 64.500000 +NoteOn 0.000000 1 77 74.000000 +NoteOff 0.500000 1 77 64.500000 +NoteOn 0.000000 1 75 64.000000 +NoteOff 0.500000 1 75 64.500000 +NoteOn 0.000000 1 72 54.000000 +NoteOff 0.500000 1 72 64.500000 +NoteOn 0.000000 1 70 64.000000 +NoteOff 1.000000 1 70 64.500000 diff --git a/sgio.C b/sgio.C new file mode 100644 index 0000000..7c0e0a8 --- /dev/null +++ b/sgio.C @@ -0,0 +1,58 @@ +#include +#include +#include +#include +#define ABS(x) ((x < 0) ? (-x) : (x)) +#define MAX(A,B) ( (A) > (B) ? (A) : (B) ) + +/* + This version of soundio.c is specific for use on an SGI machine. + + -Doug Scott, 10/95 +*/ + +ALconfig audio_port_config; +ALport audio_port; +long bufsize; +int lookaheadbuffers = 8; // number of lookahead buffers +short peakl, peakr; + +int +init_sound(float sr,int chans) + +{ + long pvbuf[2]; + int nbuf; + audio_port_config = ALnewconfig(); + if(ALsetchannels(audio_port_config, chans) < 0) + exit(-1); + /* make output queue twice the size of our buffer */ + nbuf = (chans == 2) ? lookaheadbuffers : lookaheadbuffers/2; + if(ALsetqueuesize(audio_port_config, bufsize=BUFFER_SIZE * nbuf) < 0) + exit(-1); + if(audio_port) ALcloseport(audio_port); + audio_port = ALopenport("sgi.driver", "w", audio_port_config); + if(!audio_port) exit(-1); + ALfreeconfig(audio_port_config); + audio_port_config = 0; + + pvbuf[0] = AL_OUTPUT_RATE; + pvbuf[1] = (long) sr; + ALsetparams(AL_DEFAULT_DEVICE, pvbuf, 2); /* set output SR */ + /* tell port to accept refill at buffers - 1 */ + ALsetfillpoint(audio_port,BUFFER_SIZE * (lookaheadbuffers - 1)); + return(0); +} + +int +playbuf(short *buf,int bufsize) +{ + ALwritesamps(audio_port, buf, bufsize); + return(0); +} + +void shuddup() +{ + if(audio_port) ALcloseport(audio_port); + audio_port=0; +} diff --git a/testMIDI.cpp b/testMIDI.cpp new file mode 100644 index 0000000..e0f6c60 --- /dev/null +++ b/testMIDI.cpp @@ -0,0 +1,71 @@ +/************** Test Main Program Individual Voice *********************/ + +#include "miditabl.h" +#include "MIDIInpt.h" + +#define ATOUCHMAX 2 + +int main(int argc,char *argv[]) +{ + long i, j; + int oneOn = 0; + int lastTouch = 0; + int aTouchThin = 0; + MY_FLOAT temp,temp2; + MIDIInpt controller; + + if (argc!=1) { + printf("useage: testMIDI\n"); + exit(0); + } + + while(1) { + if (controller.nextMessage() > 0) { + temp2 = controller.getByteThree(); + temp = controller.getByteTwo(); + if (controller.getType()==9) { + if (temp2 < 1.0) { + if (oneOn == 1) { + printf("NoteOff 0.0 1 %f %f\n",temp,64.0); + } + oneOn -= 1; + } + else { + printf("NoteOn 0.0 1 %f %f\n",temp,temp2); + oneOn += 1; + } + } + else if (controller.getType()==8) { + if (temp2 < 2.0) temp2 = 64.0; + if (oneOn ==1) { + printf("NoteOff 0.0 1 %f %f\n",temp,temp2); + } + oneOn -= 1; + } + else if (controller.getType() == 11) { + j = (int) temp; + printf("ControlChange 0.0 1 %i %f\n",j,temp2); + } + else if (controller.getType() == 13) { +// aTouchThin += 1; +// if (aTouchThin == ATOUCHMAX) { +// temp2 = fabs(temp - lastTouch); +// if (temp2 > 10) { +// printf("AfterTouch 0.0 1 %f\n",temp); +// lastTouch = temp; +// } +// aTouchThin = 0; +// } + } + else if (controller.getType() == 12) { + j = (int) temp; + printf("ProgramChange 0.0 1 %i\n",j); + } + fflush(stdout); + } + } + + +} + + diff --git a/testMono.cpp b/testMono.cpp new file mode 100644 index 0000000..c6f6c52 --- /dev/null +++ b/testMono.cpp @@ -0,0 +1,110 @@ +/************** Test Main Program Individual Voice *********************/ + +#include "miditabl.h" +#include "RawWvOut.h" +#include "MIDIText.h" +#include "Instrmnt.h" +#include "Marimba.h" +#include "Vibraphn.h" +#include "AgogoBel.h" +#include "Plucked.h" +#include "Mandolin.h" +#include "Clarinet.h" +#include "Flute.h" +#include "Brass.h" +#include "Bowed.h" +#include "Rhodey.h" +#include "Wurley.h" +#include "TubeBell.h" +#include "HeavyMtl.h" +#include "PercFlut.h" +#include "BeeThree.h" +#include "FMVoices.h" +#include "VoicForm.h" +#include "Moog1.h" +#include "Reverb.h" + +int main(int argc,char *argv[]) +{ + long i, j; + MY_FLOAT temp,temp2; + Instrmnt *instrument; + RawWvOut output("test.snd"); + Reverb reverb(2137); + MIDIText *score; + + if (argc<3) { + printf("useage: testMono Instr file.mtx\n"); + printf(" where Instr = Marimba Vibraphn AgogoBel Plucked\n"); + printf(" Mandolin Clarinet Flute Brass Bowed \n"); + printf(" Rhodey Wurley TubeBell HeavyMtl\n"); + printf(" PercFlut BeeThree FMVoices Moog1 VoicForm\n"); + exit(0); + } + if (!strcmp(argv[1],"Marimba")) instrument = new Marimba; + else if (!strcmp(argv[1],"Vibraphn")) instrument = new Vibraphn; + else if (!strcmp(argv[1],"AgogoBel")) instrument = new AgogoBel; + else if (!strcmp(argv[1],"Plucked")) instrument = new Plucked(50.0); + else if (!strcmp(argv[1],"Mandolin")) instrument = new Mandolin(50.0); + else if (!strcmp(argv[1],"Clarinet")) instrument = new Clarinet(50.0); + else if (!strcmp(argv[1],"Flute")) instrument = new Flute(50.0); + else if (!strcmp(argv[1],"Brass")) instrument = new Brass(50.0); + else if (!strcmp(argv[1],"Bowed")) instrument = new Bowed(50.0); + else if (!strcmp(argv[1],"Rhodey")) instrument = new Rhodey; + else if (!strcmp(argv[1],"Wurley")) instrument = new Wurley; + else if (!strcmp(argv[1],"TubeBell")) instrument = new TubeBell; + else if (!strcmp(argv[1],"HeavyMtl")) instrument = new HeavyMtl; + else if (!strcmp(argv[1],"PercFlut")) instrument = new PercFlut; + else if (!strcmp(argv[1],"BeeThree")) instrument = new BeeThree; + else if (!strcmp(argv[1],"FMVoices")) instrument = new FMVoices; + else if (!strcmp(argv[1],"VoicForm")) instrument = new VoicForm; + else if (!strcmp(argv[1],"Moog1")) instrument = new Moog1; + else { + printf("Instrument type must be 1 of:\n"); + printf("Marimba Vibraphn AgogoBel Plucked Mandolin\n"); + printf("Clarinet Flute Brass Bowed Rhodey Wurley TubeBell\n"); + printf("HeavyMtl PercFlut BeeThree FMVoices Moog1 VoicForm\n"); + exit(0); + } + score = new MIDIText(argv[2]); + + reverb.setEffectMix(0.2); + while(score->getType() > 0) { + j = (long) (score->getDelta() * SRATE); +#if defined(_debug_) + printf("%i\n",j); +#endif + if (j > 0) { + for (i=0;itick())); + } + } + temp2 = score->getByteThree()*NORM_7; + if (score->getType()==9) { + if (score->getByteThree() == 0) + instrument->noteOff(temp2); + else { + j = (int) score->getByteTwo(); + temp = __MIDI_To_Pitch[j]; + instrument->noteOn(temp,temp2); + } + } + else if (score->getType() == 8) { + instrument->noteOff(temp2); + } + else if (score->getType() == 11) { + j = (int) score->getByteTwo(); + instrument->controlChange(j,temp2*128.0); + } + score->nextMessage(); + } + for (i=0;i<22000;i++) { /* let the reverb settle a little */ + output.tick(reverb.tick(instrument->tick())); + } + + delete score; + delete instrument; + +} + + diff --git a/testMult.cpp b/testMult.cpp new file mode 100644 index 0000000..d8ccc6a --- /dev/null +++ b/testMult.cpp @@ -0,0 +1,87 @@ +/************** Test Main Program Individual Voice *********************/ + +#include "miditabl.h" +#include "RawWvOut.h" +#include "MIDIText.h" +#include "Reverb.h" +#include "VoicMang.h" + +int main(int argc,char *argv[]) +{ + long i, j; + MY_FLOAT temp,temp2; + VoicMang *section; + RawWvOut output("test.snd"); + Reverb reverb(2137); + float gain; + MIDIText *score; + + if (argc<3) { + printf("useage: testMulti Instr file.mtx\n"); + printf(" where Instr = Marimba Vibraphn AgogoBel Plucked\n"); + printf(" Mandolin Clarinet Flute Brass Bowed \n"); + printf(" Rhodey Wurley TubeBell HeavyMtl\n"); + printf(" PercFlut BeeThree Moog1\n"); + exit(0); + } + else if (argc==4) { + gain = atof(argv[1]); + section = new VoicMang(8,argv[2]); + score = new MIDIText(argv[3]); + } + else if (argc==3) { + gain = 0.125; + section = new VoicMang(8,argv[1]); + score = new MIDIText(argv[2]); + } + if (!section) { + printf("section type must be 1 of:\n"); + printf("Marimba Vibraphn AgogoBel Plucked Mandolin\n"); + printf("Clarinet Flute Brass Bowed Rhodey Wurley\n"); + printf("TubeBell HeavyMtl PercFlut BeeThree Moog1\n"); + exit(0); + } + + reverb.setEffectMix(0.2); + while(score->getType() > 0) { + j = long (score->getDelta() * SRATE); +// printf("%i\n",j); + if (j > 0) { + for (i=0;itick())); + } + } + temp = score->getByteTwo(); + temp2 = score->getByteThree(); + if (score->getType()==9) { + if (score->getByteThree() == 0) { + section->noteOffN((int) temp,temp2); + } + else { + j = section->noteOn(temp,temp2); + if (j<0) { + printf("Out of Voices Here\n"); + section->kill(section->oldestVoice()); + section->noteOn(temp,temp2); + } + } + } + else if (score->getType() == 8) { + section->noteOffN((int) temp,temp2); + } + else if (score->getType() == 11) { + j = (int) score->getByteTwo(); + section->controlChange(j,temp2); + } + score->nextMessage(); + } + for (i=0;i<22000;i++) { /* let the reverb settle a little */ + output.tick(reverb.tick(0.125 * section->tick())); + } + + delete score; + delete section; + +} + + diff --git a/testTextIn.cpp b/testTextIn.cpp new file mode 100644 index 0000000..db3f1eb --- /dev/null +++ b/testTextIn.cpp @@ -0,0 +1,187 @@ +/************** Test Main Program Individual Voice *********************/ + +#include "miditabl.h" +#include "RawWvOut.h" +#include "Instrmnt.h" +#include "Marimba.h" +#include "Vibraphn.h" +#include "AgogoBel.h" +#include "Plucked.h" +#include "Mandolin.h" +#include "Clarinet.h" +#include "Flute.h" +#include "Brass.h" +#include "Bowed.h" +#include "Rhodey.h" +#include "Wurley.h" +#include "TubeBell.h" +#include "HeavyMtl.h" +#include "PercFlut.h" +#include "BeeThree.h" +#include "FMVoices.h" +#include "Moog1.h" +#include "VoicForm.h" +#include "Reverb.h" + +#include +#include +#define _BSD_SIGNALS +#include + +#define MAX_BUF 16 + +int gotOne = 0; +char inputString[128]; +int test_pid; + +void newString(void *) +{ + while (1) { + fgets(inputString,128,stdin); + gotOne = 1; + } +} + +int main(int argc,char *argv[]) +{ + long i, j; + MY_FLOAT temp,temp2; + Instrmnt *instrument; + RawWvOut output("test.snd"); + Reverb reverb(2137); + int outAHere; + double deltaTime; + int channel; + int point; + char tempString[32]; + float byteTwo,byteThree,lastPitch=100.0; + + if (argc<2) { + printf("useage: testTCL Instr\n"); + printf(" where Instr = Marimba Vibraphn AgogoBel Plucked\n"); + printf(" Mandolin Clarinet Flute Brass Bowed \n"); + printf(" Rhodey Wurley TubeBell HeavyMtl\n"); + printf(" PercFlut BeeThree FMVoices VoicForm Moog1\n"); + exit(0); + } + if (!strcmp(argv[1],"Marimba")) instrument = new Marimba; + else if (!strcmp(argv[1],"Vibraphn")) instrument = new Vibraphn; + else if (!strcmp(argv[1],"AgogoBel")) instrument = new AgogoBel; + else if (!strcmp(argv[1],"Plucked")) instrument = new Plucked(50.0); + else if (!strcmp(argv[1],"Mandolin")) instrument = new Mandolin(50.0); + else if (!strcmp(argv[1],"Clarinet")) instrument = new Clarinet(50.0); + else if (!strcmp(argv[1],"Flute")) instrument = new Flute(50.0); + else if (!strcmp(argv[1],"Brass")) instrument = new Brass(50.0); + else if (!strcmp(argv[1],"Bowed")) instrument = new Bowed(50.0); + else if (!strcmp(argv[1],"Rhodey")) instrument = new Rhodey; + else if (!strcmp(argv[1],"Wurley")) instrument = new Wurley; + else if (!strcmp(argv[1],"TubeBell")) instrument = new TubeBell; + else if (!strcmp(argv[1],"HeavyMtl")) instrument = new HeavyMtl; + else if (!strcmp(argv[1],"PercFlut")) instrument = new PercFlut; + else if (!strcmp(argv[1],"BeeThree")) instrument = new BeeThree; + else if (!strcmp(argv[1],"FMVoices")) instrument = new FMVoices; + else if (!strcmp(argv[1],"VoicForm")) instrument = new VoicForm; + else if (!strcmp(argv[1],"Moog1")) instrument = new Moog1; + else { + printf("Instrument type must be 1 of:\n"); + printf("Marimba Vibraphn AgogoBel Plucked Mandolin\n"); + printf("Clarinet Flute Brass Bowed Rhodey Wurley TubeBell\n"); + printf("HeavyMtl PercFlut BeeThree FMVoices VoicForm Moog1\n"); + exit(0); + } + + reverb.setEffectMix(0.2); + instrument->noteOn(440.0, 0.95); + + test_pid = sproc(newString, PR_SALL); + + if (test_pid == -1) + { + fprintf(stderr, "unable to create input thread...aborting.\n"); + exit(-1); + } + + outAHere = 0; + + while (!outAHere) { + while (gotOne == 0) { + output.tick(reverb.tick(instrument->tick())); + } + if (gotOne > 0) { + sscanf(inputString,"%s %lf %i %f %f",tempString,&deltaTime,&channel,&byteTwo,&byteThree); + gotOne = 0; + point = 5; + if (tempString[0]=='%') point = 1; + if (tempString[point] == 'n') { // NoteO'n' + j = (int) byteTwo; + byteTwo = __MIDI_To_Pitch[j]; + lastPitch = byteTwo; + instrument->noteOn(byteTwo,byteThree*NORM_7); + } + else if (tempString[point] == 'f') { // NoteO'f'f + j = (int) byteTwo; + instrument->noteOff(byteThree*NORM_7); + } + else if (tempString[point] == 'B') { // Pitch'B'end + byteThree = byteTwo; + j = (int) byteThree; + byteThree -= j; + lastPitch = __MIDI_To_Pitch[j] * pow(2.0,byteThree / 12.0) ; + instrument->setFreq(lastPitch); + } + else if (tempString[point] == 'a') { // Progr'a'mChange + instrument->noteOff(1.0); + for (i=0;i<4096;i++) { + output.tick(reverb.tick(instrument->tick())); + } + delete instrument; + if (byteTwo==0) instrument = new Clarinet(50.0); + else if (byteTwo==1) instrument = new Flute(50.0); + else if (byteTwo==2) instrument = new Brass(50.0); + else if (byteTwo==3) instrument = new Bowed(50.0); + + else if (byteTwo==4) instrument = new Mandolin(50.0); + else if (byteTwo==5) instrument = new Marimba; + else if (byteTwo==6) instrument = new Vibraphn; + else if (byteTwo==7) instrument = new AgogoBel; + else if (byteTwo==8) instrument = new Rhodey; + else if (byteTwo==9) instrument = new Wurley; + else if (byteTwo==10) instrument = new TubeBell; + + else if (byteTwo==11) instrument = new FMVoices; + else if (byteTwo==12) instrument = new VoicForm; + + else if (byteTwo==13) instrument = new HeavyMtl; + else if (byteTwo==14) instrument = new PercFlut; + else if (byteTwo==15) instrument = new Moog1; + + instrument->noteOn(lastPitch, 0.95); + } + else if (tempString[point] == 'T') { // After'T'ouch + instrument->controlChange(128,byteTwo); + } + else if (tempString[point] == 'o') { // Contr'o'lChange + j = (long) byteTwo; + instrument->controlChange(j,byteThree); + } + else if (tempString[0] == 'E' && tempString[1] == 'x') { + gotOne = 0; + outAHere = 1; + } + +// else if (tempString[0] == '/') { +// notDone = 1; +// } + + gotOne = 0; + + } + + } + + kill(test_pid, SIGKILL); + delete instrument; + +} + + diff --git a/textVoic.cpp b/textVoic.cpp new file mode 100644 index 0000000..5707d04 --- /dev/null +++ b/textVoic.cpp @@ -0,0 +1,80 @@ +/* Very simple text input program for formant voice + model. Perry R. Cook 1996 */ + +/************ Test Main Program *****************/ + +#include "VoicForm.h" +#include "RawWvOut.h" +#include "Reverb.h" + +int main(int argc, char *argv[]) +{ + VoicForm instrument; + RawWvOut output("test.snd"); + Reverb reverb(2137); + long i,j,k; + double temp = 110.0; + + if (argc>1) { + + instrument.setPitchSweepRate(0.001); + instrument.setFreq(temp); + reverb.setEffectMix(0.2); + for (j=1;j