This is a part of the Kinetiszer project.

Dependencies:   inc

Dependents:   kinetisizer

Committer:
Clemo
Date:
Tue Oct 28 12:19:42 2014 +0000
Revision:
0:cb80470434eb
Error & warning free.

Who changed what in which revision?

UserRevisionLine numberNew 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 }