This is a part of the Kinetiszer project.

Dependencies:   inc

Dependents:   kinetisizer

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?

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 //******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 }