Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of eVY1Sheld_test_for_LPC1768 by
Revision 1:139a18be7b78, committed 2013-11-25
- Comitter:
- y_notsu
- Date:
- Mon Nov 25 13:10:02 2013 +0000
- Parent:
- 0:35804e977865
- Commit message:
- eVY1 command confirm program from Switch Science Shinichi-Ohki
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Tue Nov 19 16:01:17 2013 +0000 +++ b/main.cpp Mon Nov 25 13:10:02 2013 +0000 @@ -1,7 +1,30 @@ +//////////////////////////////////////////////////////// +// eVY1 Sheeld Program +// mml_play.ino +// auther Shinichi-Ohki +// Copyright(c) 2013 Yamaha Corporation +// Copyright(c) 2013 Switch Science +// CDEFGAB(ドレミファソラシド) 対応 +// 音符の後ろの長さの数字 対応 +// . 付点(1.5倍) 対応 +// R 休符 対応 +// T テンポ 対応 +// V ボリューム 対応 +// L 長さセット 対応 +// O オクターブ変化 対応 +// < 1オクターブ下げる 対応 +// > 1オクターブ上げる 対応 +// P パン 未着手 +// # シャープ たぶん対応 +// & タイ 未着手 +// P ポルタメント 未着手 +// 2013/11/25 : modified for mbed1769 +//////////////////////////////////////////////////////// #include "mbed.h" Serial evy1(p9, p10); // tx, rx configured for LPC800-MAX //Serial evy1(PTA2, PTA1); // tx, rx configured for FRDM-KL25Z +DigitalOut myled(LED1); // DO NOT EDIT!! const char* phoneticSymbols[] = { @@ -24,8 +47,37 @@ //lylics //さんまのうたがきこえてくるよ -int lylics[]={10,47,30,24,2,15,50,6,9,3,18,7,42,39}; -char mml[] ="CDEFEDC EFGAGFE"; +//int lylics[]={10,47,30,24,2,15,50,6,9,3,18,7,42,39}; +//char mml[] ="CDEFEDC EFGAGFE"; + +// 歌詞 +//int voice[] = {25,31,25,31,25,31,1,30,25,31,25,31,30,0}; +int voice[] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0, + 0,1,2,3,4,5,6,7,8,9, + 0,0,0,0,0, + 0,1,2,3,4, + 5,6,7,8,9, + 10,11,12,13,14, + 50,50,50,50 +}; +//int voice[] = {6,47,9,47,5,47,9,47,6,47,9,47,5,47,9,47}; +// メロディ +//char melody[] = "R1T60L8O6EC>G<CDGGGDED>G<CC4"; +char melody[] = "o5cdefgab<cdefgab<co5v1cv3cv7cv15cv31cv63cv127v8cccccccccccrcrrcrrrcrrrrcrrrrrl1cl2cl4cl8cl16cl32cl1rt10crt20crt30crt40crt50crt40c16c8c4c2c1r2l2crc2rc2.rc."; +//char melody[] = "T80L4O5FF32AA32GG32CC16RCC32GG32AA32FF32"; +//-------------------------------------------- + +char tempo,tempo_now; +char volume,volume_now; +char octave,octave_now; +char current_time,time_now; +int temp_int; +int melody_counter; +char old_key; +char time_table[] = {0,32,16,0,8,0,0,0,4,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}; + void Short_Message(int cmd, int d1, int d2) { evy1.putc(cmd); @@ -34,63 +86,156 @@ } // send lylics -void lylic_send(int num){ +void send_voice(int num){ //hedaer + //manual page.8 eVocaloid Phonetic symbols evy1.putc(0xF0); evy1.putc(0x43); evy1.putc(0x79); evy1.putc(0x09); evy1.putc(0x00); evy1.putc(0x50); - evy1.putc(0x10); + evy1.putc(0x10); //1m Mode m=0(replace)/m=1(append) + //The number of data have to be under 128byte for(int i=0;i<num;i++){ if(i != 0) evy1.putc(0x2c); // 0x2c is separator - evy1.printf(phoneticSymbols[lylics[i]]); + evy1.printf(phoneticSymbols[voice[i]]); } //footer evy1.putc(0x00); // footer for NSX-1 evy1.putc(0xF7); // footer of MIDI sys-ex } + +void read_num() { + bool flag = true; + temp_int = 0; + while (true) { + if ((melody[melody_counter + 1] >= '0') && (melody[melody_counter + 1] <= '9')) { + temp_int = temp_int * 10 + melody[++melody_counter] - '0'; + flag = false; + } else { + if (flag == true) temp_int = -1; + else melody_counter++; + break; + } + } +} int main() { - int key = 0x3c; //C - + //int key = 0x3c; //C + tempo = 40; + current_time = 4; + volume = 5; + octave = 4; evy1.baud(31250); // MIDI speed wait(5); // waiting for eVY1 module boot up while(1) { - //send lylics - int lylic_len = sizeof(lylics) / sizeof(lylics[0]); - lylic_send(lylic_len); // sending lylics first + // 歌詞転送 + int voice_len = sizeof(voice) / sizeof(voice[0]); + send_voice(voice_len); - int mml_len = sizeof(mml) / sizeof(mml[0]); - - for(int i = 0;i< mml_len ;i++){ - char c = mml[i]; - if(c >= 'a' && c <='z') c-= 0x20; - if((c>='A' && c<='Z')||c=='<'||c=='>'){ - //key send - if(i!=0){ - Short_Message(0x90,key,0x7f); - wait(0.5); - } - key= 0x3c; - - switch(c) { - case 'C': break; - case 'D': key+=2; break; - case 'E': key+=4; break; - case 'F': key+=5; break; - case 'G': key+=7; break; - case 'A': key+=9; break; - case 'B': key+=11; break; - default: break; + int melody_len = sizeof(melody) / sizeof(melody[0]); + // MML解析&PLAY + for (melody_counter = 0;melody_counter < melody_len - 1;melody_counter++) { + bool flag = true; + while (flag) { + char c = melody[melody_counter]; + if ((c >= 'a') && (c <= 'z')) { // 小文字を大文字に補正 + c -= 0x20; + } + if (((c >= 'A') && (c <= 'G')) || (c == 'R')) { // 音符または休符 + int time_temp; + if (c != 'R') { + char table[] = {9,11,0,2,4,5,7}; // A,B,C,D,E,F,G + old_key = table[c - 'A'] + octave_now * 12; + if (melody[melody_counter + 1] == '#') { + old_key++; + melody_counter++; + } + Short_Message(0x90,old_key,volume_now); // 鳴らす + } else { + Short_Message(0x80,old_key,volume_now); // 止める + } + read_num(); + if (temp_int != -1) { + if ((temp_int > 0) && (temp_int <= 32)) { + melody_counter--; + time_temp = time_table[temp_int]; + } else { + myled=1; + while(true) {} + } + } else { + time_temp = time_table[time_now]; + } + if (melody[melody_counter + 1] == '.') { + time_temp = time_temp * 15 / 10; + melody_counter++; } + wait_ms(tempo_now * time_temp); // 通常の音符長 + flag = false; + } else { // 音符以外 + switch (c) { + case 'T': // テンポのセット(5~100) + read_num(); + if ((temp_int == -1) || (temp_int < 5) || (temp_int > 100)) { + myled=1; + while(true) {} + } + tempo_now = (char)temp_int; + break; + + case 'V': // ボリュームのセット(0~127) + read_num(); + if ((temp_int == -1) || (temp_int < 0) || (temp_int > 127)) { + myled=1; + while(true) {} + } + volume_now = (char)temp_int; + break; + case 'O': // オクターブのセット(0~10) + read_num(); + if ((temp_int == -1) || (temp_int < 0) || (temp_int > 10)) { + myled=1; + while(true) {} + } + octave_now = (char)temp_int; + break; + case '>': // オクターブ1下げる + if (octave >= 0) { + octave_now--; + melody_counter++; + } else { + myled=1; + while(true) {} + } + break; + case '<': // オクターブ1上げる + if (octave <= 10) { + octave_now++; + melody_counter++; + } else { + myled=1; + while(true) {} + } + break; + case 'L': // 音の長さのセット(1,2,4,8,16,32) + read_num(); + if ((temp_int > 0) && (temp_int <= 32)) { + time_now = temp_int; + } else { + myled=1; + while (true) {} + } + break; + } + } } } - Short_Message(0x90,key,0x7f); // note on message. 0x90=1ch, 0x7f=Velocity + Short_Message(0x80,old_key,volume_now); // 止める wait(0.5); } }