Created
December 30, 2018 23:07
-
-
Save xiupos/003ec66c355f43848eb86c17d77cc453 to your computer and use it in GitHub Desktop.
MIDI to YMZ294(SPI)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <SPI.h> | |
#include <MIDI.h> // http://playground.arduino.cc/Main/MIDILibrary | |
#define SS 10 | |
#define A0 9 | |
int tone1Interval = 0; | |
int tone2Interval = 0; | |
int tone3Interval = 0; | |
MIDI_CREATE_DEFAULT_INSTANCE(); | |
int m2t[128] = { | |
8,9,9,10,10,11,12,12,13,14,15,15,16,17,18,19,21,22,23,25,26,28,29,31, | |
33,35,37,39,41,44,46,49,52,55,58,62,65,69,73,78,82,87,93,98,104,110,117, | |
124,131,139,147,156,165,175,185,196,208,220,233,247,262,277,294,311,330, | |
349,370,392,415,440,466,494,523,554,587,622,659,699,740,784,831,880,932, | |
988,1047,1109,1175,1245,1319,1397,1480,1568,1661,1760,1865,1976,2093, | |
2218,2349,2489,2637,2794,2960,3136,3322,3520,3729,3951,4186,4435,4699, | |
4978,5274,5588,5920,6272,6645,7040,7459,7902,8372,8870,9397,9956,10548, | |
11175,11840,12544,}; | |
void set_register(byte addr, byte data){ | |
digitalWrite(A0, LOW); | |
digitalWrite(SS, LOW); | |
SPI.transfer(addr); | |
digitalWrite(SS, HIGH); | |
delayMicroseconds(50); | |
digitalWrite(A0, HIGH); | |
digitalWrite(SS, LOW); | |
SPI.transfer(data); | |
digitalWrite(SS, HIGH); | |
delayMicroseconds(50); | |
} | |
void reset() { | |
set_register(0x00, 0); | |
set_register(0x01, 0); | |
set_register(0x02, 0); | |
set_register(0x03, 0); | |
set_register(0x04, 0); | |
set_register(0x05, 0); | |
set_register(0x06, 0); | |
set_register(0x07, 0); | |
set_register(0x08, 0); | |
set_register(0x09, 0); | |
set_register(0x0a, 0); | |
set_register(0x0b, 0); | |
set_register(0x0c, 0); | |
set_register(0x0d, 0); | |
} | |
void SetFrequency(byte ch, word freq, byte vol) { | |
word cal_freqency = 0; | |
if (freq != 0) { | |
cal_freqency = 125000 / freq; | |
} | |
cal_freqency &= 0b0000111111111111; | |
set_register(0x00 + (ch * 2), cal_freqency & 0xff); | |
set_register(0x01 + (ch * 2), (cal_freqency >> 8) & 0xff); | |
set_register(0x08 + ch, vol); | |
} | |
void setup() { | |
pinMode(SS, OUTPUT); | |
pinMode(A0, OUTPUT); | |
SPI.setBitOrder(MSBFIRST); | |
SPI.setClockDivider(SPI_CLOCK_DIV4); | |
SPI.setDataMode(SPI_MODE2); | |
SPI.begin(); | |
MIDI.begin(); | |
Serial.begin(115200); | |
delay(1000); | |
reset(); | |
set_register(0x07, 0b00111000); | |
SetFrequency(0, 0, 0); | |
SetFrequency(1, 0, 0); | |
SetFrequency(2, 0, 0); | |
} | |
void loop() | |
{ | |
uint8_t code; | |
uint8_t ch,data1,data2; | |
ch = 1; //Read channel set; | |
if (MIDI.read()) { | |
MIDI.setInputChannel(ch); // Channel | |
switch(MIDI.getType()) { | |
case midi::NoteOn: | |
data1 = MIDI.getData1(); // note no | |
data2 = MIDI.getData2(); // velocity | |
if(data2 == 0){ | |
} else if(tone1Interval == 0){ | |
tone1Interval = data1; | |
SetFrequency(0, m2t[data1], 15); | |
} else if(tone2Interval == 0){ | |
tone2Interval = data1; | |
SetFrequency(1, m2t[data1], 15); | |
} else if(tone3Interval == 0){ | |
tone3Interval = data1; | |
SetFrequency(2, m2t[data1], 15); | |
} | |
break; | |
case midi::NoteOff: | |
data1 = MIDI.getData1(); // note no | |
if(tone1Interval == data1){ | |
tone1Interval = 0; | |
SetFrequency(0, 0, 0); | |
} | |
if(tone2Interval == data1){ | |
tone2Interval = 0; | |
SetFrequency(1, 0, 0); | |
} | |
if(tone3Interval == data1){ | |
tone3Interval = 0; | |
SetFrequency(2, 0, 0); | |
} | |
break; | |
case midi::PitchBend: | |
data2 = MIDI.getData2(); | |
if(tone1Interval != 0){ | |
int tmp = tone1Interval + 19 + data2; | |
SetFrequency(0, tmp, 15); | |
} | |
if(tone2Interval != 0){ | |
int tmp = tone2Interval + 19 + data2; | |
SetFrequency(1, tmp, 15); | |
} | |
if(tone3Interval != 0){ | |
int tmp = tone3Interval + 19 + data2; | |
SetFrequency(2, tmp, 15); | |
} | |
break; | |
default: | |
break; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment