Skip to content

Instantly share code, notes, and snippets.

@xiupos
Created December 30, 2018 23:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xiupos/003ec66c355f43848eb86c17d77cc453 to your computer and use it in GitHub Desktop.
Save xiupos/003ec66c355f43848eb86c17d77cc453 to your computer and use it in GitHub Desktop.
MIDI to YMZ294(SPI)
#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