MIDI kontrollerad analog FM synt (4 / 4 steg)
Steg 4: Speltid
Här är en video demonstration av vad min bygga lät som när du använder en batteridriven förstärkare: http://youtu.be/JzKzRq4mcdk
//____________________________________________________
/*
write_pot (0, 0); 7555car ingång,
write_pot (1, 0); 7555car ansvarsfrihet,
write_pot (2, 0); 7555car volym,
write_pot (3, 0); 7555mod vol, effektivt modulering index
write_pot (4, 0); Tröskelvärde för 7555mod
write_pot (5, 0); 7555mod ansvarsfrihet
När tröskeln och ansvarsfrihet flyttas tillsammans på ett chip (transportören eller modulator)
de kontrollerar frekvens, när flyttas oberoende av varandra, de styr tonhöjd men med förändrade
puslewidth eller plikt cicle. Detta ändrar klangfärg i produktionen.
*/
Trim förinställningar.
skala 0-127 genom detta mycket för varje pott, volym skalas olikt än andra parametrar.
int data_scale [] = {2, 2, 1,25, 1,25, 2, 2};
Du kan behöva spela med detta nummer för att få din controller nummer uppradade med 6 parametrar.
int controllerOffSet = 0; Detta nummer är specfic till novation MIDI-controller
int DATAOUT = 11;
int DATAIN = 12. MISO - inte används, men en del av inbyggda SPI
int SPICLOCK = 13. SCK
int SLAVESELECT = 10; SS
int incomingByte = 0;
int Obs = 0;
int vel = 0;
int controller = 0;
int värde = 0;
byte motstånd = 0;
heltal index;
int outdex;
void setup()
{
Ställ in MIDI-baud-hastighet:
Serial.BEGIN(31250);
Debugger, eller seriell styrning baud
Serial.BEGIN(9600);
byte jag = 0;
byte clr = 0;
setup stift att arbeta med SPI
pinMode (DATAOUT, OUTPUT);
pinMode (DATAIN, indata);
pinMode(SPICLOCK,OUTPUT);
pinMode(SLAVESELECT,OUTPUT);
digitalWrite(SLAVESELECT,HIGH); Inaktivera enheten
SPCR = 01010000
avbryta inaktiverad, spi aktiverat, msb 1st, master, clk låg när sysslolös,
prov på framkanten av clk, system klocka/4 (snabbast)
SPCR = (1 << SPE) | (1 << MSTR);
CLR = SPSR;
CLR = SPDR;
Delay(10);
en LED flash och flash varje digital potten adress (för felsökning) och att tysta kretsen
Ange alla krukor till minsta/högsta antal motstånd och tillbaka igen
för (jag = 0; jag < 6; i ++)
{
digitalWrite (2, hög).
Delay(100);
write_pot(i,0);
digitalWrite (2, låg).
Delay(100);
}
Delay(1000); vänta en sekund
för (jag = 0; jag < 6; i ++)
{
digitalWrite (2, hög).
Delay(100);
write_pot (i, 255);
digitalWrite (2, låg).
Delay(100);
255 = full motstånd...
}
}
huvudprogrammet
void loop()
{
om (Serial.available() > 0) {
incomingByte = Serial.read();
om det finns ett visst meddelandeformat, om en viss MIDI status byte identifieras sedan
behandla de nästa två inkommande byte som data-byte
//
om (incomingByte == 176) {/ / status meddelande för midi cc kanal 1
Delay(1);
spela in den nästa byten som controller-nummer
Controller = Serial.read() - controllerOffSet;
Delay(1);
spela in den tredje byten som controller-data eller värde
värde = Serial.read();
}
Om styrenheten är inom rätt,
använda controller nummer Ange adressen (1 av 6 motstånd) och
Använd värdet av styrenheten att ställa in motståndet av nämnda adress
om (controller < 6 & & controller > = 0) {
vissa av parametrarna behöver skalning,
write_pot (controller, ((värde * data_scale[controller])));
slå på en LED när data skickas (för användaren feedback/felsökning)
digitalWrite (2, hög).
Delay(1);
} / / end om controller
} / / end om seriell
Delay(1);
digitalWrite (2, låg).
} / / end huvudloop
//-----------------------------------------------------------custom function calls--------------------
funktion för att skicka data till en viss adress
byte write_pot (int adress, int värde)
{
digitalWrite(SLAVESELECT,LOW);
2 byte opcode
spi_transfer(Address);
spi_transfer(Value);
digitalWrite(SLAVESELECT,HIGH); släppa chip, signalera slutet överföring
}
funktion för att överföra data över SPI
char spi_transfer (flyktiga röding data)
{
SPDR = data; Starta överföringen
tag (!. (SPSR & (1 << SPIF))) Vänta till slutet av överföringen
{
};
returnera SPDR; returnera den mottagna byten
}