Skip to content

Instantly share code, notes, and snippets.

@MattRix
Created November 16, 2019 21:10
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 MattRix/c4ba0efab437ab211a24bab1a38b5d27 to your computer and use it in GitHub Desktop.
Save MattRix/c4ba0efab437ab211a24bab1a38b5d27 to your computer and use it in GitHub Desktop.
Avril 14 on the Arduino OPL2
#include <SPI.h>
#include <OPL2.h>
#include <midi_instruments.h>
OPL2 opl2;
float tempo = 80;
const int numParts = 3;
int bassNotes[] = {32,36,37,34};
int leftNotes[] = {32,41,44,48, 36,44,48,51, 37,44,49,51, 34,44,49,48};
int rightNotes[] = {60,0,0,0, 53,0,0,0, 56,0,0,0,0,0, 56, 53,0,0,0,0,0,0, 53,0, 63,0, 61,0, 60,0, 56,0};
struct Part
{
int *notes;
int numNotes;
int channel;
float noteLength; //in beats
long millisPerNote;
unsigned long nextNoteTime;
int index;
};
struct Part parts[numParts];
void setup()
{
tempo = 120.0f;
Serial.begin(9600);
parts[0].notes = &bassNotes[0];
parts[0].numNotes = sizeof(bassNotes)/sizeof(bassNotes[0]);
parts[0].noteLength = 4;
parts[1].notes = &leftNotes[0];
parts[1].numNotes = sizeof(leftNotes)/sizeof(leftNotes[0]);
parts[1].noteLength = 1;
parts[2].notes = &rightNotes[0];
parts[2].numNotes = sizeof(rightNotes)/sizeof(rightNotes[0]);
parts[2].noteLength = 0.5f;
for (int p = 0; p < numParts; p ++)
{
Part part = parts[p];
part.channel = p;
part.nextNoteTime = millis();
part.index = 0;
part.millisPerNote = part.noteLength*(long) (60000.0f/tempo);
parts[p] = part;
}
opl2.init();
opl2.setInstrument(0, opl2.loadInstrument(INSTRUMENT_SYNBASS2));
opl2.setBlock(0, 4);
opl2.setInstrument(1, opl2.loadInstrument(INSTRUMENT_PIANO1));
opl2.setBlock(1, 4);
opl2.setInstrument(2, opl2.loadInstrument(INSTRUMENT_POLYSYN));
opl2.setBlock(2, 4);
}
void loop()
{
for(int p = 0; p<numParts; p++)
{
Part part = parts[p];
if(millis() > part.nextNoteTime)
{
part.nextNoteTime += part.millisPerNote;
int note = part.notes[part.index];
if(++part.index >= part.numNotes)
{
part.index = 0;
}
if(note == 0)
{
opl2.setKeyOn(p,false);
}
else
{
opl2.playNote(p, note/12, note % 12);
}
}
parts[p] = part;
}
delay(1);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment