This is a part of the Kinetiszer project.
waveforms.c@1:8ae4ab73ca6a, 2014-10-28 (annotated)
- Committer:
- Clemo
- Date:
- Tue Oct 28 20:09:12 2014 +0000
- Revision:
- 1:8ae4ab73ca6a
- Parent:
- 0:cb80470434eb
First publication (untested)
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Clemo | 0:cb80470434eb | 1 | /* |
Clemo | 0:cb80470434eb | 2 | Copyright 2013 Paul Soulsby www.soulsbysynths.com |
Clemo | 0:cb80470434eb | 3 | This file is part of Atmegatron. |
Clemo | 0:cb80470434eb | 4 | |
Clemo | 0:cb80470434eb | 5 | Atmegatron is free software: you can redistribute it and/or modify |
Clemo | 0:cb80470434eb | 6 | it under the terms of the GNU General Public License as published by |
Clemo | 0:cb80470434eb | 7 | the Free Software Foundation, either version 3 of the License, or |
Clemo | 0:cb80470434eb | 8 | (at your option) any later version. |
Clemo | 0:cb80470434eb | 9 | |
Clemo | 0:cb80470434eb | 10 | Atmegatron is distributed in the hope that it will be useful, |
Clemo | 0:cb80470434eb | 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
Clemo | 0:cb80470434eb | 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
Clemo | 0:cb80470434eb | 13 | GNU General Public License for more details. |
Clemo | 0:cb80470434eb | 14 | |
Clemo | 0:cb80470434eb | 15 | You should have received a copy of the GNU General Public License |
Clemo | 0:cb80470434eb | 16 | along with Atmegatron. If not, see <http://www.gnu.org/licenses/>. |
Clemo | 0:cb80470434eb | 17 | */ |
Clemo | 0:cb80470434eb | 18 | |
Clemo | 0:cb80470434eb | 19 | #include "atmegatron.h" |
Clemo | 0:cb80470434eb | 20 | |
Clemo | 0:cb80470434eb | 21 | //*********Wavetable - this is where the wavetables are stored and processed****************** |
Clemo | 0:cb80470434eb | 22 | //this is referred to as waveform in documentation |
Clemo | 0:cb80470434eb | 23 | const sample_t wave_store[2][16][WAVE_LEN] = |
Clemo | 0:cb80470434eb | 24 | { |
Clemo | 0:cb80470434eb | 25 | { |
Clemo | 0:cb80470434eb | 26 | //square |
Clemo | 0:cb80470434eb | 27 | {-128,-128,-128,-128,-128,-128,-128,-128,-128,-128,-128,-128,-128,-128,-128,-128,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127}, //Pure Square |
Clemo | 0:cb80470434eb | 28 | // {-127,-127,-127,-127,-127,-127,-127,-127,-127,-127,-127,-127,-127,-127,-127,-127,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126}, //Pure Square |
Clemo | 0:cb80470434eb | 29 | {75,89,92,92,92,91,90,89,-11,-21,-24,-25,-26,28,81,85,-2,-14,-16,-17,-17,-17,-17,-17,-119,-126,-128,-128,-127,-69,-16,-10}, //Octave square (Juno) |
Clemo | 0:cb80470434eb | 30 | {115,126,81,-2,-122,-105,-90,-67,82,93,104,109,-16,-100,-128,-107,46,58,70,77,-49,-34,-20,-7,7,20,33,43,-84,-69,-54,-37}, //square 5ths |
Clemo | 0:cb80470434eb | 31 | {106,127,125,124,123,122,121,121,-36,-47,-46,-46,-46,-45,-45,-45,-44,-44,-43,-43,-43,-42,-42,-42,-41,-41,-41,-40,-40,-40,-39,-35}, //NES pulse wave |
Clemo | 0:cb80470434eb | 32 | //saw |
Clemo | 0:cb80470434eb | 33 | {-128,-121,-113,-105,-97,-89,-81,-73,-65,-57,-49,-41,-33,-25,-17,-9,-1,7,15,23,31,39,47,55,63,71,79,87,95,103,111,119}, //Pure Saw |
Clemo | 0:cb80470434eb | 34 | {7,20,31,44,55,67,78,89,100,110,119,127,69,-90,-31,8,-33,-89,-61,-40,-46,-50,-109,-81,-67,-64,-58,-48,-36,-26,-16,-5}, //buzz saw |
Clemo | 0:cb80470434eb | 35 | {-128,-123,-108,-89,-69,-48,-28,-7,14,34,22,-26,-9,9,29,47,-29,-15,2,22,41,-5,-22,-5,15,34,54,74,93,99,33,45}, //Saw 5ths (Juno) |
Clemo | 0:cb80470434eb | 36 | {64,81,93,102,111,119,126,121,4,6,12,20,29,38,48,51,-58,-54,-47,-37,-27,-17,-6,0,-128,-127,-120,-112,-102,-92,-81,-64}, //Octave saw (Juno) |
Clemo | 0:cb80470434eb | 37 | //sine |
Clemo | 0:cb80470434eb | 38 | {-26,-61,-92,-110,-122,-128,-117,-119,-86,-92,-42,-58,0,-24,26,0,21,25,26,31,57,50,92,74,117,91,122,89,99,63,48,10}, //sub sine + square |
Clemo | 0:cb80470434eb | 39 | {-1,23,47,70,89,105,117,124,127,124,117,105,89,70,47,23,-1,-25,-49,-72,-91,-107,-119,-126,-128,-126,-119,-107,-91,-72,-49,-25}, //Pure Sine |
Clemo | 0:cb80470434eb | 40 | {18,47,44,68,109,108,98,121,127,106,94,106,83,40,34,29,-25,-45,-43,-76,-111,-104,-102,-127,-127,-103,-102,-111,-79,-42,-42,-28}, //sine harmonics (ppg) |
Clemo | 0:cb80470434eb | 41 | {44,57,62,66,72,79,90,120,126,85,69,58,49,42,36,28,-49,-60,-64,-69,-74,-82,-93,-122,-128,-88,-71,-60,-52,-45,-38,-30}, //warped sine |
Clemo | 0:cb80470434eb | 42 | //pulse |
Clemo | 0:cb80470434eb | 43 | {-128,7,7,6,6,5,5,4,4,3,3,3,2,2,2,1,1,1,1,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-2,1}, //pulse (CZ101) |
Clemo | 0:cb80470434eb | 44 | {-54,-36,127,99,-101,-123,30,107,13,-78,-43,43,46,-17,-43,-5,29,12,-19,-18,6,14,-1,-12,-6,6,5,-4,-7,-1,4,1}, //bassoon (multivox) |
Clemo | 0:cb80470434eb | 45 | {27,30,25,15,16,10,11,8,11,5,8,3,5,1,6,-1,2,-2,3,-2,1,-3,-1,-2,2,-2,1,-3,0,-19,-128,-52}, //bass (multivox) |
Clemo | 0:cb80470434eb | 46 | //noise |
Clemo | 0:cb80470434eb | 47 | {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} //Noise (calculated in code) |
Clemo | 0:cb80470434eb | 48 | }, |
Clemo | 0:cb80470434eb | 49 | { |
Clemo | 0:cb80470434eb | 50 | //buzz |
Clemo | 0:cb80470434eb | 51 | {-100,-65,10,7,-33,-60,-37,1,-22,-84,-45,-10,-19,-17,-53,25,37,13,60,64,-15,65,127,34,9,9,-11,-44,31,42,49,2}, //Metal 1 |
Clemo | 0:cb80470434eb | 52 | {93,35,-58,-128,5,24,30,75,44,-72,-39,59,-7,13,10,34,-35,66,77,52,-55,7,21,-31,-66,-55,-43,-104,7,7,-2,-6}, //Metal 2 |
Clemo | 0:cb80470434eb | 53 | {12,37,25,25,100,113,120,-36,-59,127,115,99,36,8,18,9,-15,-38,-47,-36,-52,-116,-124,-126,39,58,-119,-103,-83,-14,8,-14}, //Metal 3 |
Clemo | 0:cb80470434eb | 54 | {119,-16,26,50,66,-71,-52,3,62,15,6,-33,106,5,125,102,-103,-128,-9,-109,32,-9,-17,-62,-4,48,69,-65,-50,-28,16,-114}, //Metal 4 (PPG) |
Clemo | 0:cb80470434eb | 55 | //vocal |
Clemo | 0:cb80470434eb | 56 | {37,-49,31,-62,20,-28,-128,70,86,19,-64,94,4,89,-34,47,15,-114,96,-16,-17,-67,65,55,-70,26,-76,61,-57,-24,10,-77}, //Vocal 1 |
Clemo | 0:cb80470434eb | 57 | {44,119,126,111,53,7,-7,2,11,0,-25,-52,-67,-60,-40,-15,15,40,59,64,48,21,-5,-15,-5,4,-11,-58,-115,-128,-118,-43}, //Vocal 2 |
Clemo | 0:cb80470434eb | 58 | {-128,-116,-79,-116,-114,-128,-121,-54,18,-11,-15,18,29,16,6,3,-5,-6,-19,-29,-15,20,6,-16,70,117,127,109,104,78,113,110}, //Vocal 3 (PPG) |
Clemo | 0:cb80470434eb | 59 | //reed organ |
Clemo | 0:cb80470434eb | 60 | {28,36,38,38,37,36,33,35,67,44,29,22,17,14,13,13,41,23,12,6,3,1,0,-10,-128,-119,-100,-83,-67,-52,-39,-24}, //brass (multivox) |
Clemo | 0:cb80470434eb | 61 | {-128,-127,-119,-102,-52,-43,10,22,10,28,50,17,-11,-27,-12,25,-27,11,25,8,-20,-52,-28,-11,-23,-10,43,51,101,115,122,127}, //reed organ (PPG) |
Clemo | 0:cb80470434eb | 62 | {35,94,118,71,51,84,88,64,27,19,6,-66,-111,-110,-128,-94,-19,48,87,64,62,55,-55,-96,-54,-7,13,-37,-70,-61,-74,-40}, //elec piano (Logic) |
Clemo | 0:cb80470434eb | 63 | {69,126,125,120,81,-8,-94,-128,-113,-74,-29,15,58,98,121,105,32,-64,-121,-128,-125,-100,16,118,126,90,-87,65,-19,-125,-123,-64}, //reed |
Clemo | 0:cb80470434eb | 64 | //resonant |
Clemo | 0:cb80470434eb | 65 | {-128,24,-119,27,-110,29,-102,30,-93,23,-84,22,-76,22,-67,16,-40,23,-15,30,7,37,25,44,43,47,54,54,63,61,69,56}, //resonant saw (CZ101) |
Clemo | 0:cb80470434eb | 66 | //harmonics |
Clemo | 0:cb80470434eb | 67 | {40,35,-50,-32,43,0,-117,-35,-22,52,11,8,24,15,-31,16,95,94,-128,-70,-10,28,-26,-17,-8,-28,-48,33,51,113,-36,-31}, //bell (PPG) |
Clemo | 0:cb80470434eb | 68 | {-29,-39,116,-30,-97,101,-10,-23,-56,88,-16,-128,104,-3,-31,-51,77,36,-115,89,33,-47,-54,66,33,-111,5,73,-48,-71,89,5}, //chord |
Clemo | 0:cb80470434eb | 69 | {104,120,120,29,-128,-117,-109,30,118,74,87,-72,-74,-54,-62,63,4,71,21,-4,31,-89,-29,-72,-7,102,75,111,-57,-103,-123,-91}, //sine overtones |
Clemo | 0:cb80470434eb | 70 | {28,86,48,-53,-80,-20,38,61,-18,32,-72,-12,46,-38,-7,50,-2,-1,-34,-53,7,64,75,-26,-103,-42,17,73,127,-97,-93,-32} //saw 3rds |
Clemo | 0:cb80470434eb | 71 | } |
Clemo | 0:cb80470434eb | 72 | }; |
Clemo | 0:cb80470434eb | 73 | //lets and gets |
Clemo | 0:cb80470434eb | 74 | byte wave_curtable = 0; //current wavetable number |
Clemo | 0:cb80470434eb | 75 | byte wave_curbank = 0; //current bank number |
Clemo | 0:cb80470434eb | 76 | boolean wave_usermode = false; //user mode |
Clemo | 0:cb80470434eb | 77 | |
Clemo | 0:cb80470434eb | 78 | //local |
Clemo | 0:cb80470434eb | 79 | sample_t wave_process[WAVE_LEN]; //temp wavetable used to process wavetable |
Clemo | 0:cb80470434eb | 80 | sample_t wave_process_ch2[WAVE_LEN]; //temp wavetable used for channel two |
Clemo | 0:cb80470434eb | 81 | sample_t wave_user[WAVE_LEN]; //wavetable of current user wavetable (flash mem too slow to stream from) |
Clemo | 0:cb80470434eb | 82 | boolean wave_cleared; //if all keys up, has wave_process been blanked? |
Clemo | 0:cb80470434eb | 83 | boolean wave_noise; //is the wavetable = noise (gnerated in real time) |
Clemo | 0:cb80470434eb | 84 | |
Clemo | 0:cb80470434eb | 85 | //lets and gets |
Clemo | 0:cb80470434eb | 86 | void Wave_Let_Table(byte newtable) //sets the wavetable number |
Clemo | 0:cb80470434eb | 87 | { |
Clemo | 0:cb80470434eb | 88 | if (newtable!=wave_curtable) //if new val is different: |
Clemo | 0:cb80470434eb | 89 | { |
Clemo | 0:cb80470434eb | 90 | wave_curtable = newtable; //set new num |
Clemo | 0:cb80470434eb | 91 | if (wave_curtable==15 && wave_curbank==0) //bank 0, wave 15 = noise |
Clemo | 0:cb80470434eb | 92 | { |
Clemo | 0:cb80470434eb | 93 | wave_noise = true; |
Clemo | 0:cb80470434eb | 94 | } |
Clemo | 0:cb80470434eb | 95 | else |
Clemo | 0:cb80470434eb | 96 | { |
Clemo | 0:cb80470434eb | 97 | wave_noise = false; |
Clemo | 0:cb80470434eb | 98 | } |
Clemo | 0:cb80470434eb | 99 | } |
Clemo | 0:cb80470434eb | 100 | } |
Clemo | 0:cb80470434eb | 101 | |
Clemo | 0:cb80470434eb | 102 | |
Clemo | 0:cb80470434eb | 103 | byte Wave_Get_Table(void) |
Clemo | 0:cb80470434eb | 104 | { |
Clemo | 0:cb80470434eb | 105 | return wave_curtable; |
Clemo | 0:cb80470434eb | 106 | } |
Clemo | 0:cb80470434eb | 107 | |
Clemo | 0:cb80470434eb | 108 | |
Clemo | 0:cb80470434eb | 109 | void Wave_Let_Bank(byte newbank) //set the bank number |
Clemo | 0:cb80470434eb | 110 | { |
Clemo | 0:cb80470434eb | 111 | if (newbank!=wave_curbank) //if new val is different: |
Clemo | 0:cb80470434eb | 112 | { |
Clemo | 0:cb80470434eb | 113 | wave_curbank = newbank; //set new bank |
Clemo | 0:cb80470434eb | 114 | if (wave_curtable==15 && wave_curbank==0) //bank 0, wave 15 = noise |
Clemo | 0:cb80470434eb | 115 | { |
Clemo | 0:cb80470434eb | 116 | wave_noise = true; |
Clemo | 0:cb80470434eb | 117 | } |
Clemo | 0:cb80470434eb | 118 | else |
Clemo | 0:cb80470434eb | 119 | { |
Clemo | 0:cb80470434eb | 120 | wave_noise = false; |
Clemo | 0:cb80470434eb | 121 | } |
Clemo | 0:cb80470434eb | 122 | } |
Clemo | 0:cb80470434eb | 123 | } |
Clemo | 0:cb80470434eb | 124 | |
Clemo | 0:cb80470434eb | 125 | |
Clemo | 0:cb80470434eb | 126 | byte Wave_Get_Bank(void) |
Clemo | 0:cb80470434eb | 127 | { |
Clemo | 0:cb80470434eb | 128 | return wave_curbank; |
Clemo | 0:cb80470434eb | 129 | } |
Clemo | 0:cb80470434eb | 130 | |
Clemo | 0:cb80470434eb | 131 | |
Clemo | 0:cb80470434eb | 132 | inline void Wave_Let_Process(byte index, sample_t newval) //set sample in processing wavetable. used by all the other tabs |
Clemo | 0:cb80470434eb | 133 | { |
Clemo | 0:cb80470434eb | 134 | wave_process[index] = newval; |
Clemo | 0:cb80470434eb | 135 | } |
Clemo | 0:cb80470434eb | 136 | |
Clemo | 0:cb80470434eb | 137 | |
Clemo | 0:cb80470434eb | 138 | inline sample_t Wave_Get_Process(byte index) |
Clemo | 0:cb80470434eb | 139 | { |
Clemo | 0:cb80470434eb | 140 | return wave_process[index]; |
Clemo | 0:cb80470434eb | 141 | } |
Clemo | 0:cb80470434eb | 142 | |
Clemo | 0:cb80470434eb | 143 | |
Clemo | 0:cb80470434eb | 144 | void Wave_Let_UserMode(boolean newval) //set user mode |
Clemo | 0:cb80470434eb | 145 | { |
Clemo | 0:cb80470434eb | 146 | wave_usermode = newval; |
Clemo | 0:cb80470434eb | 147 | } |
Clemo | 0:cb80470434eb | 148 | |
Clemo | 0:cb80470434eb | 149 | |
Clemo | 0:cb80470434eb | 150 | boolean Wave_Get_UserMode(void) |
Clemo | 0:cb80470434eb | 151 | { |
Clemo | 0:cb80470434eb | 152 | return wave_usermode; |
Clemo | 0:cb80470434eb | 153 | } |
Clemo | 0:cb80470434eb | 154 | |
Clemo | 0:cb80470434eb | 155 | |
Clemo | 0:cb80470434eb | 156 | void Wave_Let_UserWave(byte index, sample_t newval) //set sample of user wavetable. Used when loading userwave from flash or sysex dump in librarian |
Clemo | 0:cb80470434eb | 157 | { |
Clemo | 0:cb80470434eb | 158 | wave_user[index] = newval; |
Clemo | 0:cb80470434eb | 159 | } |
Clemo | 0:cb80470434eb | 160 | |
Clemo | 0:cb80470434eb | 161 | |
Clemo | 0:cb80470434eb | 162 | sample_t Wave_Get_UserWave(byte index) |
Clemo | 0:cb80470434eb | 163 | { |
Clemo | 0:cb80470434eb | 164 | return wave_user[index]; |
Clemo | 0:cb80470434eb | 165 | } |
Clemo | 0:cb80470434eb | 166 | |
Clemo | 0:cb80470434eb | 167 | |
Clemo | 0:cb80470434eb | 168 | //Wavetable meat |
Clemo | 0:cb80470434eb | 169 | void Init_Waves(void) //initialise the wavetables. would be really annoying to boot to silent sound! |
Clemo | 0:cb80470434eb | 170 | { |
Clemo | 0:cb80470434eb | 171 | byte i; |
Clemo | 0:cb80470434eb | 172 | for (i=0;i<WAVE_LEN;i++) |
Clemo | 0:cb80470434eb | 173 | { |
Clemo | 0:cb80470434eb | 174 | wave_process[i] = wave_store[wave_curbank][wave_curtable][i]; |
Clemo | 0:cb80470434eb | 175 | wave_user[i] = wave_store[wave_curbank][wave_curtable][i]; |
Clemo | 0:cb80470434eb | 176 | } |
Clemo | 0:cb80470434eb | 177 | } |
Clemo | 0:cb80470434eb | 178 | |
Clemo | 0:cb80470434eb | 179 | |
Clemo | 0:cb80470434eb | 180 | //******************PROCESS THE WAVETABLE******************* |
Clemo | 0:cb80470434eb | 181 | //****This is where the wavetbale is filtered/shaped/etc**** |
Clemo | 0:cb80470434eb | 182 | void Wave_Process(void) |
Clemo | 0:cb80470434eb | 183 | { |
Clemo | 0:cb80470434eb | 184 | byte i; |
Clemo | 0:cb80470434eb | 185 | if (wave_usermode==true) //if userwave is on, initialise process wavetable to userwave wavetable |
Clemo | 0:cb80470434eb | 186 | { |
Clemo | 0:cb80470434eb | 187 | for (i=0;i<WAVE_LEN;i++) |
Clemo | 0:cb80470434eb | 188 | { |
Clemo | 0:cb80470434eb | 189 | wave_process[i] = wave_user[i]; |
Clemo | 0:cb80470434eb | 190 | } |
Clemo | 0:cb80470434eb | 191 | } |
Clemo | 0:cb80470434eb | 192 | else if (wave_noise==true) //if noise, generate the noise |
Clemo | 0:cb80470434eb | 193 | { |
Clemo | 0:cb80470434eb | 194 | // TODO cpv: this creates aliased noise, fix it. |
Clemo | 0:cb80470434eb | 195 | for (i=0;i<WAVE_LEN;i++) |
Clemo | 0:cb80470434eb | 196 | { |
Clemo | 0:cb80470434eb | 197 | wave_process[i] = random(-128,127); |
Clemo | 0:cb80470434eb | 198 | } |
Clemo | 0:cb80470434eb | 199 | } |
Clemo | 0:cb80470434eb | 200 | else //otherwise init the process wavetable from progmem |
Clemo | 0:cb80470434eb | 201 | { |
Clemo | 0:cb80470434eb | 202 | for (i=0;i<WAVE_LEN;i++) |
Clemo | 0:cb80470434eb | 203 | { |
Clemo | 0:cb80470434eb | 204 | wave_process[i] = wave_store[wave_curbank][wave_curtable][i]; |
Clemo | 0:cb80470434eb | 205 | } |
Clemo | 0:cb80470434eb | 206 | } |
Clemo | 0:cb80470434eb | 207 | if (PWM_Get_LFOAmt()>0) //1. Apply PWM to wavetable |
Clemo | 0:cb80470434eb | 208 | { |
Clemo | 0:cb80470434eb | 209 | PWM_Process(); |
Clemo | 0:cb80470434eb | 210 | } |
Clemo | 0:cb80470434eb | 211 | if (BitCrush_Get_Type()>0 && BitCrush_Get_PreFilt()==true) //2. Apply wave crusher if pre-filt mode on |
Clemo | 0:cb80470434eb | 212 | { |
Clemo | 0:cb80470434eb | 213 | BitCrush_Process(); |
Clemo | 0:cb80470434eb | 214 | } |
Clemo | 0:cb80470434eb | 215 | if (Filt_Get_Type()>0) //3. Apply filter |
Clemo | 0:cb80470434eb | 216 | { |
Clemo | 0:cb80470434eb | 217 | Filt_Process(); |
Clemo | 0:cb80470434eb | 218 | } |
Clemo | 0:cb80470434eb | 219 | Amplitude_Process(); //4. Apply amplitude (always do this) |
Clemo | 0:cb80470434eb | 220 | if (Flange_Get_LFOAmt()>0) //5. Apply phaser |
Clemo | 0:cb80470434eb | 221 | { |
Clemo | 0:cb80470434eb | 222 | Flange_Process(); |
Clemo | 0:cb80470434eb | 223 | } |
Clemo | 0:cb80470434eb | 224 | if (BitCrush_Get_Type()>0 && BitCrush_Get_PreFilt()==false) //6. Apply wave crusher if pre-filt mode off |
Clemo | 0:cb80470434eb | 225 | { |
Clemo | 0:cb80470434eb | 226 | BitCrush_Process(); |
Clemo | 0:cb80470434eb | 227 | } |
Clemo | 0:cb80470434eb | 228 | if (Distortion_Get_Amt()>0) //7. Apply distortion |
Clemo | 0:cb80470434eb | 229 | { |
Clemo | 0:cb80470434eb | 230 | Distortion_Process(); |
Clemo | 0:cb80470434eb | 231 | } |
Clemo | 0:cb80470434eb | 232 | |
Clemo | 0:cb80470434eb | 233 | for (i=0;i<WAVE_LEN;i++) //8. Write processed wave to output |
Clemo | 0:cb80470434eb | 234 | { |
Clemo | 0:cb80470434eb | 235 | master_output[i] = wave_process[i]+128; |
Clemo | 0:cb80470434eb | 236 | // CPV |
Clemo | 0:cb80470434eb | 237 | master_output_ch2[i] = wave_process_ch2[i]+128; |
Clemo | 0:cb80470434eb | 238 | } |
Clemo | 0:cb80470434eb | 239 | wave_cleared=false; //wavetable isn't blank |
Clemo | 0:cb80470434eb | 240 | } |
Clemo | 0:cb80470434eb | 241 | |
Clemo | 0:cb80470434eb | 242 | |
Clemo | 0:cb80470434eb | 243 | void Wave_Clear(void) //this is used to make sure that synth is silent when all keys are up |
Clemo | 0:cb80470434eb | 244 | { |
Clemo | 0:cb80470434eb | 245 | byte i; //the main issue was the phaser + distortion would feedback endlessly, even with keys up |
Clemo | 0:cb80470434eb | 246 | if (wave_cleared==false) |
Clemo | 0:cb80470434eb | 247 | { |
Clemo | 0:cb80470434eb | 248 | for (i=0; i<WAVE_LEN; i++) |
Clemo | 0:cb80470434eb | 249 | { |
Clemo | 0:cb80470434eb | 250 | wave_process[i] = 0; |
Clemo | 0:cb80470434eb | 251 | master_output[i] = 128; |
Clemo | 0:cb80470434eb | 252 | wave_process_ch2[i] = 0; |
Clemo | 0:cb80470434eb | 253 | master_output_ch2[i] = 128; |
Clemo | 0:cb80470434eb | 254 | } |
Clemo | 0:cb80470434eb | 255 | wave_cleared = true; |
Clemo | 0:cb80470434eb | 256 | } |
Clemo | 0:cb80470434eb | 257 | } |