#define NOTELIM 70 // Highest MIDI note to output.
#define PWLIM 300 //Pulse Width limit in us.
#define PWMULT 3 // multiplier applied to velocity to get pulse width .
//Include librarys.
#include <MIDI.h>
#include "TimerOne.h"
//Define Global Variables
unsigned int midiperiod[128]; // Array to store midi note periods
unsigned int pw = 20; // Caurrent Pulase width
void setup(void)
{
// Prepare Timer1
Timer1.initialize(1000000);//타이머 인터럽트의 주기를 1000000으로 초기설정.
// Set the pin we want the ISR to toggle for output.
pinMode(9, OUTPUT);
//Start up the serial port
Serial.begin(9600);
//Define Midi Note Periods
midiperiod[0] = 122312;
midiperiod[1] = 115447;
midiperiod[2] = 108968;
midiperiod[3] = 102852;
midiperiod[4] = 97079;
midiperiod[5] = 91631;
midiperiod[6] = 86488;
midiperiod[7] = 81634;
midiperiod[8] = 77052;
midiperiod[9] = 72727;
midiperiod[10] = 68645;
midiperiod[11] = 64793;
midiperiod[36] = 15289;
midiperiod[37] = 14431;
midiperiod[38] = 13621;
midiperiod[39] = 12856;
midiperiod[40] = 12135;
midiperiod[41] = 11454;
midiperiod[42] = 10811;
midiperiod[43] = 10204;
midiperiod[44] = 9631;
midiperiod[45] = 9091;
midiperiod[46] = 8581;
midiperiod[47] = 8099;
midiperiod[72] = 1911;
midiperiod[73] = 1804;
midiperiod[74] = 1703;
midiperiod[75] = 1607;
midiperiod[76] = 1517;
midiperiod[77] = 1432;
midiperiod[78] = 1351;
midiperiod[79] = 1276;
midiperiod[80] = 1204;
midiperiod[81] = 1136;
midiperiod[82] = 1073;
midiperiod[83] = 1012;
midiperiod[108] = 239;
midiperiod[109] = 225;
midiperiod[110] = 213;
midiperiod[111] = 201;
midiperiod[112] = 190;
midiperiod[113] = 179;
midiperiod[114] = 169;
midiperiod[115] = 159;
midiperiod[116] = 150;
midiperiod[117] = 142;
midiperiod[118] = 134;
midiperiod[119] = 127;
midiperiod[12] = 61156;
midiperiod[13] = 57724;
midiperiod[14] = 54484;
midiperiod[15] = 51426;
midiperiod[16] = 48540;
midiperiod[17] = 45815;
midiperiod[18] = 43244;
midiperiod[19] = 40817;
midiperiod[20] = 38526;
midiperiod[21] = 36364;
midiperiod[22] = 34323;
midiperiod[23] = 32396;
midiperiod[48] = 7645;
midiperiod[49] = 7215;
midiperiod[50] = 6810;
midiperiod[51] = 6428;
midiperiod[52] = 6067;
midiperiod[53] = 5727;
midiperiod[54] = 5405;
midiperiod[55] = 5102;
midiperiod[56] = 4816;
midiperiod[57] = 4545;
midiperiod[58] = 4290;
midiperiod[59] = 4050;
midiperiod[84] = 956;
midiperiod[85] = 902;
midiperiod[86] = 851;
midiperiod[87] = 804;
midiperiod[88] = 758;
midiperiod[89] = 716;
midiperiod[90] = 676;
midiperiod[91] = 638;
midiperiod[92] = 602;
midiperiod[93] = 568;
midiperiod[94] = 536;
midiperiod[95] = 506;
midiperiod[120] = 119;
midiperiod[121] = 113;
midiperiod[122] = 106;
midiperiod[123] = 100;
midiperiod[124] = 95;
midiperiod[125] = 89;
midiperiod[126] = 84;
midiperiod[127] = 80;
midiperiod[24] = 30578;
midiperiod[25] = 28862;
midiperiod[26] = 27242;
midiperiod[27] = 25713;
midiperiod[28] = 24270;
midiperiod[29] = 22908;
midiperiod[30] = 21622;
midiperiod[31] = 20408;
midiperiod[32] = 19263;
midiperiod[33] = 18182;
midiperiod[34] = 17161;
midiperiod[35] = 16198;
midiperiod[60] = 3822;
midiperiod[61] = 3608;
midiperiod[62] = 3405;
midiperiod[63] = 3214;
midiperiod[64] = 3034;
midiperiod[65] = 2863;
midiperiod[66] = 2703;
midiperiod[67] = 2551;
midiperiod[68] = 2408;
midiperiod[69] = 2273;
midiperiod[70] = 2145;
midiperiod[71] = 2025;
midiperiod[96] = 478;
midiperiod[97] = 451;
midiperiod[98] = 426;
midiperiod[99] = 402;
midiperiod[100] = 379;
midiperiod[101] = 358;
midiperiod[102] = 338;
midiperiod[103] = 319;
midiperiod[104] = 301;
midiperiod[105] = 284;
midiperiod[106] = 268;
midiperiod[107] = 253;
MIDI.begin(); // Launch MIDI with default options
}
void pulse()//인터럽트 신호 한 주기를 발생시키는 코드. pw의 듀티사이클을 가짐. 이 함수가 1초에 5번 실행되면 5hz가 되는것.
{
digitalWrite(OUTPIN, HIGH);
delayMicroseconds(pw);
digitalWrite(OUTPIN, LOW);
}
void loop()
{
int controlnote;
//Check for availible midi data
if (MIDI.read())
{
switch (MIDI.getType())
{ // Get the type of the message we caught
case NoteOn:
// get note on number and check for limit
controlnote = MIDI.getData1();//getData1에는 음정정보가 저장된다.
if (controlnote > NOTELIM)//음정(주파수)의 최대치를 한정해주는 작업
{
controlnote = 10;
}
Timer1.attachInterrupt(pulse, midiperiod[controlnote]);//midiperiod[controlnote]의 주기로 pulse함수를 실행하라.
// Calculate Pulse width from velocity and Limit to PWLIM
pw = PWMULT * MIDI.getData2();//getData2에는 음량정보가 저장된다.
if (pw > PWLIM)//음량(펄스폭)의 최대치를 한정해주는 작업
{
pw = PWLIM;
}
break;
case NoteOff:
//Disable the interupt.
Timer1.detachInterrupt();
break;
default:
break;
}// switch (MIDI.getType()) 끝
}// if (MIDI.read())함수 끝
}
'Programming > Embedded' 카테고리의 다른 글
MIDI OUT 회로도 (0) | 2022.02.18 |
---|---|
아두이노 TIMER1/3 라이브러리 사용설명 (0) | 2022.02.18 |
MIDI Library 정리 (0) | 2022.02.18 |
아두이노 이론정리-기초적인 아두이노 라이브러리 함수 (0) | 2022.02.18 |
아두이노 이론정리 1-아두이노 단자 설명 (0) | 2022.02.18 |