Начало.
Подарил мне приятель в начале 2000-х синтезатор YM2149f и на днях попался он мне на глаза и решил я с ним заморочиться. Нагуглил вот этот проект:
https://electronicfields.wordpress.com/2012/05/02/ym2149-and-midi/
Большой…, древний, скомпилировался только в Arduino IDE 1.0.6. Должен был получиться чиптюновый MIDI-синтезатор. Не работает. Нашел проект попроще:
const int ad[8] = { 8, 9, 2, 3, 4, 5, 6, 7 }; // connect to DA0,1,...,7
const int pinBC1 = 10;
const int pinBDIR = 11;
const int pinRES = 12;
//Fast pin switching macros
#define CLR(x,y) (x&=(~(1<<y)))
#define SET(x,y) (x|=(1<<y))
#define __BCPORT__ PORTB
#define __BC1__ 2
#define __BDIR__ 3
void setup() {
//init pins
for( int i=0; i < 8; i++)
pinMode(ad[i], OUTPUT);
pinMode(pinBC1, OUTPUT);
pinMode(pinBDIR, OUTPUT);
pinMode(pinRES, OUTPUT);
//inactive mode
digitalWrite(pinBC1, LOW);
digitalWrite(pinBDIR, LOW);
digitalWrite(pinRES, HIGH);
//serial init
Serial.begin(57600);
}
void send_data(unsigned char address, unsigned char data) {
//write address to pins
PORTB |= address & 0x03;
PORTD |= address & 0xFC;
//validate addess
__BCPORT__ |= (1 << __BDIR__) + (1 << __BC1__);
delayMicroseconds(1);
__BCPORT__ &= ~((1 << __BDIR__) + (1 << __BC1__));
PORTB &= ~(address & 0x03);
PORTD &= ~(address & 0xFC);
//write data to pins
PORTB |= data & 0x03;
PORTD |= data & 0xFC;
//validate data
SET(__BCPORT__,__BDIR__);
delayMicroseconds(1);
CLR(__BCPORT__,__BDIR__);
PORTB &= ~(data & 0x03);
PORTD &= ~(data & 0xFC);
}
void loop() {
byte reg;
while(1) {
do {
while(Serial.available() < 1) { delayMicroseconds(1); }
reg = Serial.read();
}
while( reg > 15 );
while(Serial.available() < 1) { delayMicroseconds(1); }
send_data(reg, Serial.read());
}
}
Работает по UART с софтовым плеером AYPlayer. Пока сравнивал распайку (она один к одному) нашел косяк на плате. Перерезал дорожку от MIDI, подпаял USB-UART на CH340, залил код - работает. Залил код MIDI-синтезатора - работает.
Хочу объединить два этих кода в один. Первая идея - сделать это через case. Механический переключатель входов для порта UART и он же поднимает-опускает флаг для case, но… Проблема с древним кодом синтезатора, который не компилируется в современной IDE (плеер компилируется), и еще, Serial инициализируется в setup с разными скоростями. Я застрял…
Какие есть идеи, коллеги?