This is a part of the Kinetiszer project.
memory.c@0:cb80470434eb, 2014-10-28 (annotated)
- Committer:
- Clemo
- Date:
- Tue Oct 28 12:19:42 2014 +0000
- Revision:
- 0:cb80470434eb
Error & warning free.
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 | //******Read and write patches to flash memory************** |
Clemo | 0:cb80470434eb | 20 | |
Clemo | 0:cb80470434eb | 21 | #include "atmegatron.h" |
Clemo | 0:cb80470434eb | 22 | |
Clemo | 0:cb80470434eb | 23 | |
Clemo | 0:cb80470434eb | 24 | //save patch |
Clemo | 0:cb80470434eb | 25 | void Memory_Save(byte patchnum) |
Clemo | 0:cb80470434eb | 26 | { |
Clemo | 0:cb80470434eb | 27 | byte i; //, v, |
Clemo | 0:cb80470434eb | 28 | byte lsb, msb; |
Clemo | 0:cb80470434eb | 29 | byte anal, out; |
Clemo | 0:cb80470434eb | 30 | uint32_t addr; |
Clemo | 0:cb80470434eb | 31 | byte bit_position; |
Clemo | 0:cb80470434eb | 32 | //boolean b; |
Clemo | 0:cb80470434eb | 33 | |
Clemo | 0:cb80470434eb | 34 | cli(); //halt interrupts (i.e. audio engine). don't want it interfering with eeprom writing |
Clemo | 0:cb80470434eb | 35 | |
Clemo | 0:cb80470434eb | 36 | addr = (uint32_t)patchnum * MEM_PATCHSIZE; //find start address (normal patch size = 19 bytes) |
Clemo | 0:cb80470434eb | 37 | /*v = 0; |
Clemo | 0:cb80470434eb | 38 | |
Clemo | 0:cb80470434eb | 39 | for (i=0;i<8;i++){ //writes all 16 function values to memory |
Clemo | 0:cb80470434eb | 40 | lsb = Hardware_Get_Value(v); //each function is value 0-15 = 4 bit value. |
Clemo | 0:cb80470434eb | 41 | msb = Hardware_Get_Value(v+1); //so can store 2 function values in each byte (8 bits) |
Clemo | 0:cb80470434eb | 42 | msb = msb << 4; //this is done by bit-shifting every other value left 4 bits |
Clemo | 0:cb80470434eb | 43 | out = msb | lsb; //and ORing with other value |
Clemo | 0:cb80470434eb | 44 | EEPROM.write(addr+i, out); //then write to eeprom |
Clemo | 0:cb80470434eb | 45 | v += 2; |
Clemo | 0:cb80470434eb | 46 | }*/ |
Clemo | 0:cb80470434eb | 47 | |
Clemo | 0:cb80470434eb | 48 | // Write all 16 function values to memory |
Clemo | 0:cb80470434eb | 49 | for (i=0; i<8; i++) |
Clemo | 0:cb80470434eb | 50 | { |
Clemo | 0:cb80470434eb | 51 | lsb = Hardware_Get_Value(2*i); //each function is value 0-15 = 4 bit value. |
Clemo | 0:cb80470434eb | 52 | msb = Hardware_Get_Value(2*i+1); //so can store 2 function values in each byte (8 bits) |
Clemo | 0:cb80470434eb | 53 | EEPROM.write(addr,((msb<<4)&0xf0)|(lsb&0x0f)); //then write to eeprom |
Clemo | 0:cb80470434eb | 54 | addr += 1; |
Clemo | 0:cb80470434eb | 55 | } |
Clemo | 0:cb80470434eb | 56 | |
Clemo | 0:cb80470434eb | 57 | //write all ctrl values to memory |
Clemo | 0:cb80470434eb | 58 | anal = Hardware_Get_Ctrl(0, CTRL_FILT); //first the 6 red bank ctrls |
Clemo | 0:cb80470434eb | 59 | EEPROM.write(addr, anal); |
Clemo | 0:cb80470434eb | 60 | addr += 1; |
Clemo | 0:cb80470434eb | 61 | anal = Hardware_Get_Ctrl(0, CTRL_Q); |
Clemo | 0:cb80470434eb | 62 | EEPROM.write(addr, anal); |
Clemo | 0:cb80470434eb | 63 | addr += 1; |
Clemo | 0:cb80470434eb | 64 | anal = Hardware_Get_Ctrl(0, CTRL_ENV); |
Clemo | 0:cb80470434eb | 65 | EEPROM.write(addr, anal); |
Clemo | 0:cb80470434eb | 66 | addr += 1; |
Clemo | 0:cb80470434eb | 67 | anal = Hardware_Get_Ctrl(0, CTRL_LFO); |
Clemo | 0:cb80470434eb | 68 | EEPROM.write(addr, anal); |
Clemo | 0:cb80470434eb | 69 | addr += 1; |
Clemo | 0:cb80470434eb | 70 | anal = Hardware_Get_Ctrl(0, CTRL_AMP); |
Clemo | 0:cb80470434eb | 71 | EEPROM.write(addr, anal); |
Clemo | 0:cb80470434eb | 72 | addr += 1; |
Clemo | 0:cb80470434eb | 73 | anal = Hardware_Get_Ctrl(0, CTRL_FX); |
Clemo | 0:cb80470434eb | 74 | EEPROM.write(addr, anal); |
Clemo | 0:cb80470434eb | 75 | addr += 1; |
Clemo | 0:cb80470434eb | 76 | anal = Hardware_Get_Ctrl(1, CTRL_ENV); //then the 4 green bank ctrls |
Clemo | 0:cb80470434eb | 77 | EEPROM.write(addr, anal); |
Clemo | 0:cb80470434eb | 78 | addr += 1; |
Clemo | 0:cb80470434eb | 79 | anal = Hardware_Get_Ctrl(1, CTRL_LFO); |
Clemo | 0:cb80470434eb | 80 | EEPROM.write(addr, anal); |
Clemo | 0:cb80470434eb | 81 | addr += 1; |
Clemo | 0:cb80470434eb | 82 | anal = Hardware_Get_Ctrl(1, CTRL_AMP); |
Clemo | 0:cb80470434eb | 83 | EEPROM.write(addr, anal); |
Clemo | 0:cb80470434eb | 84 | addr += 1; |
Clemo | 0:cb80470434eb | 85 | anal = Hardware_Get_Ctrl(1, CTRL_FX); |
Clemo | 0:cb80470434eb | 86 | EEPROM.write(addr, anal); |
Clemo | 0:cb80470434eb | 87 | addr += 1; |
Clemo | 0:cb80470434eb | 88 | |
Clemo | 0:cb80470434eb | 89 | //write function shift modes to memory. |
Clemo | 0:cb80470434eb | 90 | out = 0; //these are boolean, so 1 bit each. so 8 can be store in each byte (i.e. 8 bits). out is used to build up output byte |
Clemo | 0:cb80470434eb | 91 | bit_position = 0x01; |
Clemo | 0:cb80470434eb | 92 | if (Hard_Get_Shift(FUNC_WAVE)==true){ //get each shift mode and set/clear each bit of out. First wavetable bank |
Clemo | 0:cb80470434eb | 93 | //bitSet(out, 0); |
Clemo | 0:cb80470434eb | 94 | out |= bit_position; |
Clemo | 0:cb80470434eb | 95 | } |
Clemo | 0:cb80470434eb | 96 | //else{ |
Clemo | 0:cb80470434eb | 97 | // bitClear(out, 0); |
Clemo | 0:cb80470434eb | 98 | //} |
Clemo | 0:cb80470434eb | 99 | bit_position <<= 1; |
Clemo | 0:cb80470434eb | 100 | if (Hard_Get_Shift(FUNC_FILT)==true){ //filter normalise mode |
Clemo | 0:cb80470434eb | 101 | //bitSet(out, 1); |
Clemo | 0:cb80470434eb | 102 | out |= bit_position; |
Clemo | 0:cb80470434eb | 103 | } |
Clemo | 0:cb80470434eb | 104 | //else{ |
Clemo | 0:cb80470434eb | 105 | // bitClear(out, 1); |
Clemo | 0:cb80470434eb | 106 | //} |
Clemo | 0:cb80470434eb | 107 | bit_position <<= 1; |
Clemo | 0:cb80470434eb | 108 | if (Hard_Get_Shift(FUNC_FENVA)==true){ //filt/pitch env invert mode |
Clemo | 0:cb80470434eb | 109 | //bitSet(out, 2); |
Clemo | 0:cb80470434eb | 110 | out |= bit_position; |
Clemo | 0:cb80470434eb | 111 | } |
Clemo | 0:cb80470434eb | 112 | //else{ |
Clemo | 0:cb80470434eb | 113 | // bitClear(out, 2); |
Clemo | 0:cb80470434eb | 114 | //} |
Clemo | 0:cb80470434eb | 115 | bit_position <<= 1; |
Clemo | 0:cb80470434eb | 116 | if (Hard_Get_Shift(FUNC_LFOTYPE)==true){ //lfo invert mode |
Clemo | 0:cb80470434eb | 117 | //bitSet(out, 3); |
Clemo | 0:cb80470434eb | 118 | out |= bit_position; |
Clemo | 0:cb80470434eb | 119 | } |
Clemo | 0:cb80470434eb | 120 | //else{ |
Clemo | 0:cb80470434eb | 121 | // bitClear(out, 3); |
Clemo | 0:cb80470434eb | 122 | //} |
Clemo | 0:cb80470434eb | 123 | #ifdef __HAS_ARPEGGIATOR__ |
Clemo | 0:cb80470434eb | 124 | bit_position <<= 1; |
Clemo | 0:cb80470434eb | 125 | if (Hard_Get_Shift(FUNC_ARPTYPE)==true){ //arp ping-pong mode |
Clemo | 0:cb80470434eb | 126 | //bitSet(out, 4); |
Clemo | 0:cb80470434eb | 127 | out |= bit_position; |
Clemo | 0:cb80470434eb | 128 | } |
Clemo | 0:cb80470434eb | 129 | //else{ |
Clemo | 0:cb80470434eb | 130 | // bitClear(out, 4); |
Clemo | 0:cb80470434eb | 131 | //} |
Clemo | 0:cb80470434eb | 132 | #endif // __HAS_ARPEGGIATOR__ |
Clemo | 0:cb80470434eb | 133 | bit_position <<= 1; |
Clemo | 0:cb80470434eb | 134 | if (Hard_Get_Shift(FUNC_PORTA)==true){ //proportional portamento |
Clemo | 0:cb80470434eb | 135 | //bitSet(out, 5); |
Clemo | 0:cb80470434eb | 136 | out |= bit_position; |
Clemo | 0:cb80470434eb | 137 | } |
Clemo | 0:cb80470434eb | 138 | //else{ |
Clemo | 0:cb80470434eb | 139 | // bitClear(out, 5); |
Clemo | 0:cb80470434eb | 140 | //} |
Clemo | 0:cb80470434eb | 141 | bit_position <<= 1; |
Clemo | 0:cb80470434eb | 142 | if (Hard_Get_Shift(FUNC_BITCRUSH)==true){ //bitcrush before filter mode |
Clemo | 0:cb80470434eb | 143 | //bitSet(out, 6); |
Clemo | 0:cb80470434eb | 144 | out |= bit_position; |
Clemo | 0:cb80470434eb | 145 | } |
Clemo | 0:cb80470434eb | 146 | //else{ |
Clemo | 0:cb80470434eb | 147 | // bitClear(out, 6); |
Clemo | 0:cb80470434eb | 148 | //} |
Clemo | 0:cb80470434eb | 149 | EEPROM.write(addr, out); //write compiled bits to eeprom |
Clemo | 0:cb80470434eb | 150 | addr += 1; |
Clemo | 0:cb80470434eb | 151 | sei(); //restart interrupts (audio engine) |
Clemo | 0:cb80470434eb | 152 | |
Clemo | 0:cb80470434eb | 153 | } |
Clemo | 0:cb80470434eb | 154 | |
Clemo | 0:cb80470434eb | 155 | |
Clemo | 0:cb80470434eb | 156 | bool Memory_Load_Patch(uint8_t *p_dst, uint32_t src) |
Clemo | 0:cb80470434eb | 157 | { |
Clemo | 0:cb80470434eb | 158 | int i; |
Clemo | 0:cb80470434eb | 159 | bool patch_not_empty = false; |
Clemo | 0:cb80470434eb | 160 | for (i=0; i<MEM_PATCHSIZE; i++) |
Clemo | 0:cb80470434eb | 161 | { |
Clemo | 0:cb80470434eb | 162 | // We use special EEPROM library that doesn't care about interrupts. |
Clemo | 0:cb80470434eb | 163 | p_dst[i] = EEPROM.read(src+i); |
Clemo | 0:cb80470434eb | 164 | if (p_dst[i]!=0 && p_dst[i]!=0xff) |
Clemo | 0:cb80470434eb | 165 | { |
Clemo | 0:cb80470434eb | 166 | patch_not_empty = true; |
Clemo | 0:cb80470434eb | 167 | } |
Clemo | 0:cb80470434eb | 168 | } |
Clemo | 0:cb80470434eb | 169 | return patch_not_empty; |
Clemo | 0:cb80470434eb | 170 | } |
Clemo | 0:cb80470434eb | 171 | |
Clemo | 0:cb80470434eb | 172 | |
Clemo | 0:cb80470434eb | 173 | //load patch |
Clemo | 0:cb80470434eb | 174 | bool Memory_Load(byte patchnum) |
Clemo | 0:cb80470434eb | 175 | { |
Clemo | 0:cb80470434eb | 176 | int i; |
Clemo | 0:cb80470434eb | 177 | byte in; |
Clemo | 0:cb80470434eb | 178 | uint8_t eeprom_buffer[MEM_PATCHSIZE]; |
Clemo | 0:cb80470434eb | 179 | |
Clemo | 0:cb80470434eb | 180 | if (Memory_Load_Patch(eeprom_buffer,patchnum*MEM_PATCHSIZE)==false) return false; |
Clemo | 0:cb80470434eb | 181 | |
Clemo | 0:cb80470434eb | 182 | //set function values |
Clemo | 0:cb80470434eb | 183 | for (i=0; i<8; i++) |
Clemo | 0:cb80470434eb | 184 | { |
Clemo | 0:cb80470434eb | 185 | in = eeprom_buffer[i]; |
Clemo | 0:cb80470434eb | 186 | // Two function values in each byte. First one can be obtained by blanking top 4 bits. |
Clemo | 0:cb80470434eb | 187 | Hardware_Let_Value(2*i,in&0x0f); |
Clemo | 0:cb80470434eb | 188 | Hardware_Let_Value(2*i+1,(in>>4)&0x0f); |
Clemo | 0:cb80470434eb | 189 | } |
Clemo | 0:cb80470434eb | 190 | |
Clemo | 0:cb80470434eb | 191 | Hardware_Let_Ctrl(0, CTRL_FILT, eeprom_buffer[i++]); |
Clemo | 0:cb80470434eb | 192 | Hardware_Let_Ctrl(0, CTRL_Q, eeprom_buffer[i++]); |
Clemo | 0:cb80470434eb | 193 | Hardware_Let_Ctrl(0, CTRL_ENV, eeprom_buffer[i++]); |
Clemo | 0:cb80470434eb | 194 | Hardware_Let_Ctrl(0, CTRL_LFO, eeprom_buffer[i++]); |
Clemo | 0:cb80470434eb | 195 | Hardware_Let_Ctrl(0, CTRL_AMP, eeprom_buffer[i++]); |
Clemo | 0:cb80470434eb | 196 | Hardware_Let_Ctrl(0, CTRL_FX, eeprom_buffer[i++]); |
Clemo | 0:cb80470434eb | 197 | Hardware_Let_Ctrl(1, CTRL_ENV, eeprom_buffer[i++]); //the the 4 green bank ctrls |
Clemo | 0:cb80470434eb | 198 | Hardware_Let_Ctrl(1, CTRL_LFO, eeprom_buffer[i++]); |
Clemo | 0:cb80470434eb | 199 | Hardware_Let_Ctrl(1, CTRL_AMP, eeprom_buffer[i++]); |
Clemo | 0:cb80470434eb | 200 | Hardware_Let_Ctrl(1, CTRL_FX, eeprom_buffer[i++]); |
Clemo | 0:cb80470434eb | 201 | |
Clemo | 0:cb80470434eb | 202 | in = eeprom_buffer[i++]; //read entire byte |
Clemo | 0:cb80470434eb | 203 | Hard_Let_Shift(FUNC_WAVE,(in&0x01)!=0); //and set wavetable bank accordingly |
Clemo | 0:cb80470434eb | 204 | Hard_Let_Shift(FUNC_FILT,(in&0x02)!=0); |
Clemo | 0:cb80470434eb | 205 | Hard_Let_Shift(FUNC_FENVA,(in&0x04)!=0); //filter/pitch env invert mode |
Clemo | 0:cb80470434eb | 206 | Hard_Let_Shift(FUNC_LFOTYPE,(in&0x08)!=0); //lfo invert mode |
Clemo | 0:cb80470434eb | 207 | #ifdef __HAS_ARPEGGIATOR__ |
Clemo | 0:cb80470434eb | 208 | Hard_Let_Shift(FUNC_ARPTYPE,(in&0x10)!=0); //arpeggiator pingpong |
Clemo | 0:cb80470434eb | 209 | #endif // __HAS_ARPEGGIATOR__ |
Clemo | 0:cb80470434eb | 210 | Hard_Let_Shift(FUNC_PORTA,(in&0x20)!=0); //proportional portamento |
Clemo | 0:cb80470434eb | 211 | Hard_Let_Shift(FUNC_BITCRUSH,(in&0x40)!=0); //filter before bit crusher |
Clemo | 0:cb80470434eb | 212 | |
Clemo | 0:cb80470434eb | 213 | return true; |
Clemo | 0:cb80470434eb | 214 | } |
Clemo | 0:cb80470434eb | 215 | |
Clemo | 0:cb80470434eb | 216 | |
Clemo | 0:cb80470434eb | 217 | //***** User wave ****** |
Clemo | 0:cb80470434eb | 218 | //save user wave |
Clemo | 0:cb80470434eb | 219 | void Memory_UserWave_Write(byte patchnum) |
Clemo | 0:cb80470434eb | 220 | { |
Clemo | 0:cb80470434eb | 221 | int i, addr; |
Clemo | 0:cb80470434eb | 222 | cli(); //stop interrupts (audio engine) |
Clemo | 0:cb80470434eb | 223 | addr = ((int)patchnum * WAVE_LEN) + (MEM_PATCHSIZE*16); //calc start address. 288 bytes is the offset from 16 mem patches |
Clemo | 0:cb80470434eb | 224 | for (i=0;i<WAVE_LEN;i++){ |
Clemo | 0:cb80470434eb | 225 | EEPROM.write(addr + i, Wave_Get_UserWave(i)); //write each sample to memory |
Clemo | 0:cb80470434eb | 226 | } |
Clemo | 0:cb80470434eb | 227 | sei(); //restart interrupts (audio engine) |
Clemo | 0:cb80470434eb | 228 | } |
Clemo | 0:cb80470434eb | 229 | |
Clemo | 0:cb80470434eb | 230 | |
Clemo | 0:cb80470434eb | 231 | //load user wave |
Clemo | 0:cb80470434eb | 232 | void Memory_UserWave_Read(byte patchnum) |
Clemo | 0:cb80470434eb | 233 | { |
Clemo | 0:cb80470434eb | 234 | int i, addr; |
Clemo | 0:cb80470434eb | 235 | cli(); //stop interrupts (audio engine) |
Clemo | 0:cb80470434eb | 236 | addr = ((int)patchnum * WAVE_LEN) + (MEM_PATCHSIZE*16); //calc start address. 288 bytes is the offset from 16 mem patches |
Clemo | 0:cb80470434eb | 237 | for (i=0;i<WAVE_LEN;i++){ |
Clemo | 0:cb80470434eb | 238 | Wave_Let_UserWave(i,EEPROM.read(addr + i)); //read each sample value from memory |
Clemo | 0:cb80470434eb | 239 | } |
Clemo | 0:cb80470434eb | 240 | sei(); //restart interrupts (audio engine) |
Clemo | 0:cb80470434eb | 241 | } |
Clemo | 0:cb80470434eb | 242 | |
Clemo | 0:cb80470434eb | 243 | |
Clemo | 0:cb80470434eb | 244 | //initialise atmegatron with vanilla patch |
Clemo | 0:cb80470434eb | 245 | void Memory_Vanilla(void) |
Clemo | 0:cb80470434eb | 246 | { |
Clemo | 0:cb80470434eb | 247 | Hardware_Let_Value(FUNC_WAVE, 0); //square wave |
Clemo | 0:cb80470434eb | 248 | Hardware_Let_Value(FUNC_FILT, 1); //lpf |
Clemo | 0:cb80470434eb | 249 | Hardware_Let_Value(FUNC_FENVA, 0); //'donk' shape filter env |
Clemo | 0:cb80470434eb | 250 | Hardware_Let_Value(FUNC_FENVDR, 6); |
Clemo | 0:cb80470434eb | 251 | Hardware_Let_Value(FUNC_FENVS, 0); |
Clemo | 0:cb80470434eb | 252 | Hardware_Let_Value(FUNC_AENVA, 0); //full sustain amp env with short decay if sustain lowered |
Clemo | 0:cb80470434eb | 253 | Hardware_Let_Value(FUNC_AENVD, 6); |
Clemo | 0:cb80470434eb | 254 | Hardware_Let_Value(FUNC_AENVS, 15); |
Clemo | 0:cb80470434eb | 255 | Hardware_Let_Value(FUNC_AENVR, 0); |
Clemo | 0:cb80470434eb | 256 | Hardware_Let_Value(FUNC_LFOTYPE, 0); //sine LFO |
Clemo | 0:cb80470434eb | 257 | Hardware_Let_Value(FUNC_LFOSPEED, 8); //semi-quavers |
Clemo | 0:cb80470434eb | 258 | #ifdef __HAS_ARPEGGIATOR__ |
Clemo | 0:cb80470434eb | 259 | Hardware_Let_Value(FUNC_ARPTYPE, 0); //arp off |
Clemo | 0:cb80470434eb | 260 | Hardware_Let_Value(FUNC_ARPSPEED, 5); //quavers |
Clemo | 0:cb80470434eb | 261 | #endif // __HAS_ARPEGGIATOR__ |
Clemo | 0:cb80470434eb | 262 | Hardware_Let_Value(FUNC_PORTA, 0); //porta off |
Clemo | 0:cb80470434eb | 263 | Hardware_Let_Value(FUNC_BITCRUSH, 0); //bitcrush off |
Clemo | 0:cb80470434eb | 264 | Hardware_Let_Ctrl(0,CTRL_FILT,255); //filter full open |
Clemo | 0:cb80470434eb | 265 | Hardware_Let_Ctrl(0,CTRL_Q,0); //resonance at min (0.5) |
Clemo | 0:cb80470434eb | 266 | Hardware_Let_Ctrl(0,CTRL_ENV,0); //All Envs and LFO amts = 0 |
Clemo | 0:cb80470434eb | 267 | Hardware_Let_Ctrl(1,CTRL_ENV,0); |
Clemo | 0:cb80470434eb | 268 | Hardware_Let_Ctrl(0,CTRL_LFO,0); |
Clemo | 0:cb80470434eb | 269 | Hardware_Let_Ctrl(1,CTRL_LFO,0); |
Clemo | 0:cb80470434eb | 270 | Hardware_Let_Ctrl(0,CTRL_AMP,0); |
Clemo | 0:cb80470434eb | 271 | Hardware_Let_Ctrl(1,CTRL_AMP,0); |
Clemo | 0:cb80470434eb | 272 | Hardware_Let_Ctrl(0,CTRL_FX,0); //no distortion |
Clemo | 0:cb80470434eb | 273 | Hardware_Let_Ctrl(1,CTRL_FX,0); //no phaser |
Clemo | 0:cb80470434eb | 274 | Hard_Let_Shift(FUNC_WAVE, false); //all shift modes off |
Clemo | 0:cb80470434eb | 275 | Hard_Let_Shift(FUNC_FILT, false); |
Clemo | 0:cb80470434eb | 276 | Hard_Let_Shift(FUNC_FENVA, false); |
Clemo | 0:cb80470434eb | 277 | Hard_Let_Shift(FUNC_LFOTYPE, false); |
Clemo | 0:cb80470434eb | 278 | #ifdef __HAS_ARPEGGIATOR__ |
Clemo | 0:cb80470434eb | 279 | Hard_Let_Shift(FUNC_ARPTYPE, false); |
Clemo | 0:cb80470434eb | 280 | #endif // __HAS_ARPEGGIATOR__ |
Clemo | 0:cb80470434eb | 281 | Hard_Let_Shift(FUNC_PORTA, false); |
Clemo | 0:cb80470434eb | 282 | Hard_Let_Shift(FUNC_BITCRUSH, false); |
Clemo | 0:cb80470434eb | 283 | } |
Clemo | 0:cb80470434eb | 284 | |
Clemo | 0:cb80470434eb | 285 | |
Clemo | 0:cb80470434eb | 286 | //read patch from memory and output as sysex |
Clemo | 0:cb80470434eb | 287 | void Memory_SYSEX_write_mem(void) |
Clemo | 0:cb80470434eb | 288 | { |
Clemo | 0:cb80470434eb | 289 | byte data; |
Clemo | 0:cb80470434eb | 290 | int i; |
Clemo | 0:cb80470434eb | 291 | |
Clemo | 0:cb80470434eb | 292 | Serial.write(SYSEXBEGIN); |
Clemo | 0:cb80470434eb | 293 | Serial.write(125); // 1 manufacturer ID |
Clemo | 0:cb80470434eb | 294 | Serial.write(0); // 2 product ID |
Clemo | 0:cb80470434eb | 295 | Serial.write(SYSEX_MEM); // 3 message type |
Clemo | 0:cb80470434eb | 296 | for (i=0;i<496;i++){ //496 bytes of the mem used |
Clemo | 0:cb80470434eb | 297 | cli(); |
Clemo | 0:cb80470434eb | 298 | data = EEPROM.read(i); |
Clemo | 0:cb80470434eb | 299 | sei(); |
Clemo | 0:cb80470434eb | 300 | Serial.write(data >> 1); //MSB |
Clemo | 0:cb80470434eb | 301 | Serial.write(data & 0x01); //LSB |
Clemo | 0:cb80470434eb | 302 | Serial.flush(); |
Clemo | 0:cb80470434eb | 303 | } |
Clemo | 0:cb80470434eb | 304 | Serial.write(SYSEXEND); |
Clemo | 0:cb80470434eb | 305 | |
Clemo | 0:cb80470434eb | 306 | } |
Clemo | 0:cb80470434eb | 307 | |
Clemo | 0:cb80470434eb | 308 | |
Clemo | 0:cb80470434eb | 309 | void Memory_Channel_Write(byte channel) |
Clemo | 0:cb80470434eb | 310 | { |
Clemo | 0:cb80470434eb | 311 | EEPROM.write(511, channel); |
Clemo | 0:cb80470434eb | 312 | } |
Clemo | 0:cb80470434eb | 313 | |
Clemo | 0:cb80470434eb | 314 | |
Clemo | 0:cb80470434eb | 315 | byte Memory_Channel_Read(void) |
Clemo | 0:cb80470434eb | 316 | { |
Clemo | 0:cb80470434eb | 317 | return EEPROM.read(511); |
Clemo | 0:cb80470434eb | 318 | } |