チーム1667
課題名
明大カラオケ
研究者名
Maito Miyawaki
Masahiro Muraoka
Hiroki Inoue
概要
Enterキーを押すと校歌を歌詞付で演奏する。
詳細
UARTを利用し、画面にPress Enter to play musicという文字が表示された後、開始信号(Enter)を送るとTimer割り込みが開始しスピーカーから校歌を演奏する。
その際、Tera Termウインドウ上にメロディーと同期した歌詞を表示する。
演奏は、PWM16を4つ使用し、それらをEXORで合成することによって疑似的に和音を生成し、
1つのスピーカーから4和音を出力する。
この発想は、ラボlab2_pwm_lcdの ”デジタル的にうなり共振を発生させる” という項目から着想を得た。
使用機器
- PSoC基盤(29466) 1個
- PSoC MiniProg 1個
- スピーカー 1個
- ストレート通信ケーブル 1本
- ジャンパー線 5本
ソースコード
※900行超と長いコードになったため、畳んでいます +をクリックしてソースコードを表示します
...
#include <m8c.h>
#include "PSoCAPI.h"
#pragma interrupt_handler myISR
int PW=125;
int TC=0;
int sil=0;
int lfis=324,lg=306,lgis=288,la=273,lh=243;
int c=229; d=204,e=182,f=172,g=153,a=136,h=121,eis=172;
int cis=217,fis=162,gis=145,ais=129;
int mc=115,md=102,me=91,mf=86,mg=76,ma=68,mh=60,mmc=57;
int mcis=108,mfis=81;
void main(void)
{
UART_CmdReset(); UART_IntCntl(UART_ENABLE_RX_INT); Counter8_WritePeriod(155); Counter8_WriteCompareValue(77); Counter8_Start(); UART_Start(UART_PARITY_NONE); M8C_EnableGInt ; UART_CPutString("\r\nPress Enter to play music\r\n"); while(1){ if(UART_bCmdCheck()){ PWM16_2_Start(); PWM16_3_Start(); PWM16_4_Start(); PWM16_5_Start(); Timer16_1_EnableInt(); Timer16_1_Start(); while(1){} } UART_CmdReset(); }
}
void myISR(void){
TC++; PWM16_2_WritePulseWidth(PW); PWM16_3_WritePulseWidth(PW); PWM16_4_WritePulseWidth(PW); PWM16_5_WritePulseWidth(PW); if(TC == 1){ PWM16_2_WritePeriod(la); PWM16_3_WritePeriod(la); PWM16_4_WritePeriod(la); PWM16_5_WritePeriod(la); UART_CPutString("\r\n白雲なびく\r\n"); } else if(TC==9){ PWM16_2_WritePeriod(d); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(d); PWM16_5_WritePeriod(d); } else if(TC==17){ PWM16_2_WritePeriod(e); PWM16_3_WritePeriod(cis); PWM16_4_WritePeriod(e); PWM16_5_WritePeriod(cis); } else if(TC==25){ PWM16_2_WritePeriod(fis); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(fis); PWM16_5_WritePeriod(d); } else if(TC==33){ PWM16_2_WritePeriod(g); PWM16_3_WritePeriod(e); PWM16_4_WritePeriod(g); PWM16_5_WritePeriod(lh); } else if(TC==41){ PWM16_2_WritePeriod(h); PWM16_3_WritePeriod(e); PWM16_4_WritePeriod(g); PWM16_5_WritePeriod(cis); } else if(TC==45){ PWM16_2_WritePeriod(a); PWM16_3_WritePeriod(fis); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(d); } else if(TC==61){ PWM16_2_WritePeriod(0); PWM16_3_WritePeriod(0); PWM16_4_WritePeriod(0); PWM16_5_WritePeriod(0); } else if(TC==65){ PWM16_2_WritePeriod(d); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(fis); UART_CPutString("\r\n駿河台\r\n"); } else if(TC==71){ PWM16_2_WritePeriod(e); PWM16_3_WritePeriod(cis); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(e); } else if(TC==73){ PWM16_2_WritePeriod(fis); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(d); } else if(TC==81){ PWM16_2_WritePeriod(a); PWM16_3_WritePeriod(fis); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(cis); } else if(TC==89){ PWM16_2_WritePeriod(md); PWM16_3_WritePeriod(fis); PWM16_4_WritePeriod(h); PWM16_5_WritePeriod(lh); } else if(TC==97){ PWM16_2_WritePeriod(h); PWM16_3_WritePeriod(g); PWM16_4_WritePeriod(h); PWM16_5_WritePeriod(lg); } else if(TC==103){ PWM16_2_WritePeriod(h); PWM16_3_WritePeriod(g); PWM16_4_WritePeriod(mcis); PWM16_5_WritePeriod(lg); } else if(TC==105){ PWM16_2_WritePeriod(a); PWM16_3_WritePeriod(fis); PWM16_4_WritePeriod(md); PWM16_5_WritePeriod(d); } else if(TC==125){ PWM16_2_WritePeriod(0); PWM16_3_WritePeriod(0); PWM16_4_WritePeriod(0); PWM16_5_WritePeriod(0); } else if(TC==129){ PWM16_2_WritePeriod(mfis); PWM16_3_WritePeriod(g); PWM16_4_WritePeriod(mcis); PWM16_5_WritePeriod(a); UART_CPutString("\r\n眉秀でたる\r\n"); } else if(TC==135){ PWM16_2_WritePeriod(me); PWM16_3_WritePeriod(g); PWM16_4_WritePeriod(mcis); PWM16_5_WritePeriod(a); } else if(TC==137){ PWM16_2_WritePeriod(md); PWM16_3_WritePeriod(fis); PWM16_4_WritePeriod(md); PWM16_5_WritePeriod(d); } else if(TC==145){ PWM16_2_WritePeriod(md); PWM16_3_WritePeriod(fis); PWM16_4_WritePeriod(ais); PWM16_5_WritePeriod(d); } else if(TC==153){ PWM16_2_WritePeriod(md); PWM16_3_WritePeriod(g); PWM16_4_WritePeriod(h); PWM16_5_WritePeriod(e); } else if(TC==161){ PWM16_2_WritePeriod(h); PWM16_3_WritePeriod(gis); PWM16_4_WritePeriod(h); PWM16_5_WritePeriod(eis); } else if(TC==169){ PWM16_2_WritePeriod(d); PWM16_3_WritePeriod(a); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(fis); } else if(TC==173){ PWM16_2_WritePeriod(g); PWM16_3_WritePeriod(fis); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(d); } else if(TC==189){ PWM16_2_WritePeriod(0); PWM16_3_WritePeriod(0); PWM16_4_WritePeriod(0); PWM16_5_WritePeriod(0); } else if(TC==193){ PWM16_2_WritePeriod(fis); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(fis); UART_CPutString("\r\n若人が\r\n"); } else if(TC==199){ PWM16_2_WritePeriod(a); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(fis); } else if(TC==201){ PWM16_2_WritePeriod(md); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(fis); PWM16_5_WritePeriod(lh); } else if(TC==209){ PWM16_2_WritePeriod(h); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(g); PWM16_5_WritePeriod(lg); } else if(TC==217){ PWM16_2_WritePeriod(a); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(lfis); } else if(TC==225){ PWM16_2_WritePeriod(fis); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(h); PWM16_5_WritePeriod(lgis); } else if(TC==233){ PWM16_2_WritePeriod(e); PWM16_3_WritePeriod(e); PWM16_4_WritePeriod(mcis); PWM16_5_WritePeriod(la); } else if(TC==253){ PWM16_2_WritePeriod(0); PWM16_3_WritePeriod(0); PWM16_4_WritePeriod(0); PWM16_5_WritePeriod(0); } else if(TC==257){ PWM16_2_WritePeriod(a); PWM16_3_WritePeriod(cis); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(la); UART_CPutString("\r\n撞くや\r\n"); } else if(TC==261){ PWM16_2_WritePeriod(me); PWM16_3_WritePeriod(cis); PWM16_4_WritePeriod(g); PWM16_5_WritePeriod(la); } else if(TC==265){ PWM16_2_WritePeriod(md); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(fis); PWM16_5_WritePeriod(d); } else if(TC==273){ PWM16_2_WritePeriod(md); PWM16_3_WritePeriod(g); PWM16_4_WritePeriod(h); PWM16_5_WritePeriod(d); } else if(TC==281){ PWM16_2_WritePeriod(md); PWM16_3_WritePeriod(fis); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(d); } else if(TC==285){ PWM16_2_WritePeriod(0); PWM16_3_WritePeriod(0); PWM16_4_WritePeriod(0); PWM16_5_WritePeriod(0); } else if(TC==289){ PWM16_2_WritePeriod(fis); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(d); UART_CPutString("\r\n時代の\r\n"); } else if(TC==293){ PWM16_2_WritePeriod(g); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(d); } else if(TC==297){ PWM16_2_WritePeriod(a); PWM16_3_WritePeriod(cis); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(e); } else if(TC==313){ PWM16_2_WritePeriod(a); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(fis); } else if(TC==317){ PWM16_2_WritePeriod(0); PWM16_3_WritePeriod(0); PWM16_4_WritePeriod(0); PWM16_5_WritePeriod(0); } else if(TC==321){ PWM16_2_WritePeriod(fis); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(d); UART_CPutString("\r\n暁の鐘\r\n"); } else if(TC==327){ PWM16_2_WritePeriod(g); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(e); } else if(TC==329){ PWM16_2_WritePeriod(a); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(fis); } else if(TC==337){ PWM16_2_WritePeriod(h); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(gis); PWM16_5_WritePeriod(f); } else if(TC==345){ PWM16_2_WritePeriod(md); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(g); PWM16_5_WritePeriod(e); } else if(TC==349){ PWM16_2_WritePeriod(a); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(g); PWM16_5_WritePeriod(e); } else if(TC==353){ PWM16_2_WritePeriod(a); PWM16_3_WritePeriod(cis); PWM16_4_WritePeriod(g); PWM16_5_WritePeriod(la); } else if(TC==357){ PWM16_2_WritePeriod(h); PWM16_3_WritePeriod(cis); PWM16_4_WritePeriod(g); PWM16_5_WritePeriod(la); } else if(TC==361){ PWM16_2_WritePeriod(md); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(gis); PWM16_5_WritePeriod(lh); } else if(TC==377){ PWM16_2_WritePeriod(md); PWM16_3_WritePeriod(fis); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(la); } else if(TC==381){ PWM16_2_WritePeriod(0); PWM16_3_WritePeriod(0); PWM16_4_WritePeriod(0); PWM16_5_WritePeriod(0); } else if(TC==385){ PWM16_2_WritePeriod(mfis); PWM16_3_WritePeriod(a); PWM16_4_WritePeriod(mcis); PWM16_5_WritePeriod(la); UART_CPutString("\r\n文化の潮を\r\n"); } else if(TC==391){ PWM16_2_WritePeriod(me); PWM16_3_WritePeriod(g); PWM16_4_WritePeriod(mcis); PWM16_5_WritePeriod(la); } else if(TC==393){ PWM16_2_WritePeriod(md); PWM16_3_WritePeriod(fis); PWM16_4_WritePeriod(0); PWM16_5_WritePeriod(d); } else if(TC==401){ PWM16_2_WritePeriod(a); PWM16_3_WritePeriod(g); PWM16_4_WritePeriod(me); PWM16_5_WritePeriod(cis); } else if(TC==409){ PWM16_2_WritePeriod(a); PWM16_3_WritePeriod(fis); PWM16_4_WritePeriod(md); PWM16_5_WritePeriod(d); } else if(TC==417){ PWM16_2_WritePeriod(h); PWM16_3_WritePeriod(eis); PWM16_4_WritePeriod(md); PWM16_5_WritePeriod(g); } else if(TC==425){ PWM16_2_WritePeriod(a); PWM16_3_WritePeriod(fis); PWM16_4_WritePeriod(md); PWM16_5_WritePeriod(d); } else if(TC==429){ PWM16_2_WritePeriod(fis); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(d); } else if(TC==445){ PWM16_2_WritePeriod(0); PWM16_3_WritePeriod(0); PWM16_4_WritePeriod(0); PWM16_5_WritePeriod(0); } else if(TC==449){ PWM16_2_WritePeriod(d); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(fis); UART_CPutString("\r\n導きて\r\n"); } else if(TC==455){ PWM16_2_WritePeriod(e); PWM16_3_WritePeriod(cis); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(e); } else if(TC==457){ PWM16_2_WritePeriod(fis); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(d); } else if(TC==465){ PWM16_2_WritePeriod(a); PWM16_3_WritePeriod(fis); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(cis); } else if(TC==473){ PWM16_2_WritePeriod(md); PWM16_3_WritePeriod(fis); PWM16_4_WritePeriod(h); PWM16_5_WritePeriod(lh); } else if(TC==481){ PWM16_2_WritePeriod(h); PWM16_3_WritePeriod(g); PWM16_4_WritePeriod(h); PWM16_5_WritePeriod(lg); } else if(TC==487){ PWM16_2_WritePeriod(h); PWM16_3_WritePeriod(g); PWM16_4_WritePeriod(mcis); PWM16_5_WritePeriod(lg); } else if(TC==489){ PWM16_2_WritePeriod(a); PWM16_3_WritePeriod(fis); PWM16_4_WritePeriod(md); PWM16_5_WritePeriod(d); } else if(TC==509){ PWM16_2_WritePeriod(0); PWM16_3_WritePeriod(0); PWM16_4_WritePeriod(0); PWM16_5_WritePeriod(0); } else if(TC==513){ PWM16_2_WritePeriod(md); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(h); PWM16_5_WritePeriod(g); UART_CPutString("\r\n遂げし\r\n"); } else if(TC==521){ PWM16_2_WritePeriod(h); PWM16_3_WritePeriod(cis); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(g); } else if(TC==529){ PWM16_2_WritePeriod(h); PWM16_3_WritePeriod(lh); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(g); } else if(TC==535){ PWM16_2_WritePeriod(h); PWM16_3_WritePeriod(cis); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(g); } else if(TC==537){ PWM16_2_WritePeriod(a); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(fis); } else if(TC==541){ PWM16_2_WritePeriod(0); PWM16_3_WritePeriod(0); PWM16_4_WritePeriod(0); PWM16_5_WritePeriod(0); } else if(TC==545){ PWM16_2_WritePeriod(md); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(h); PWM16_5_WritePeriod(g); UART_CPutString("\r\n維新の\r\n"); } else if(TC==551){ PWM16_2_WritePeriod(mcis); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(h); PWM16_5_WritePeriod(g); } else if(TC==553){ PWM16_2_WritePeriod(h); PWM16_3_WritePeriod(cis); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(g); } else if(TC==561){ PWM16_2_WritePeriod(h); PWM16_3_WritePeriod(lh); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(g); } else if(TC==567){ PWM16_2_WritePeriod(h); PWM16_3_WritePeriod(cis); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(g); } else if(TC==569){ PWM16_2_WritePeriod(a); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(fis); } else if(TC==573){ PWM16_2_WritePeriod(0); PWM16_3_WritePeriod(0); PWM16_4_WritePeriod(0); PWM16_5_WritePeriod(0); } else if(TC==577){ PWM16_2_WritePeriod(a); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(fis); UART_CPutString("\r\n栄になふ\r\n"); } else if(TC==583){ PWM16_2_WritePeriod(h); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(h); PWM16_5_WritePeriod(fis); } else if(TC==585){ PWM16_2_WritePeriod(a); PWM16_3_WritePeriod(fis); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(d); } else if(TC==589){ PWM16_2_WritePeriod(fis); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(fis); PWM16_5_WritePeriod(d); } else if(TC==597){ PWM16_2_WritePeriod(g); PWM16_3_WritePeriod(e); PWM16_4_WritePeriod(g); PWM16_5_WritePeriod(d); } else if(TC==601){ PWM16_2_WritePeriod(a); PWM16_3_WritePeriod(fis); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(d); } else if(TC==609){ PWM16_2_WritePeriod(h); PWM16_3_WritePeriod(g); PWM16_4_WritePeriod(h); PWM16_5_WritePeriod(g); } else if(TC==617){ PWM16_2_WritePeriod(a); PWM16_3_WritePeriod(fis); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(fis); } else if(TC==621){ PWM16_2_WritePeriod(0); PWM16_3_WritePeriod(0); PWM16_4_WritePeriod(0); PWM16_5_WritePeriod(0); } else if(TC==625){ PWM16_2_WritePeriod(md); PWM16_3_WritePeriod(md); PWM16_4_WritePeriod(md); PWM16_5_WritePeriod(0); UART_CPutString("\r\nOh-o!\r\n"); } else if(TC==633){ PWM16_2_WritePeriod(a); PWM16_3_WritePeriod(a); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(0); } else if(TC==637){ PWM16_2_WritePeriod(0); PWM16_3_WritePeriod(0); PWM16_4_WritePeriod(0); PWM16_5_WritePeriod(0); } else if(TC==641){ PWM16_2_WritePeriod(mfis); PWM16_3_WritePeriod(g); PWM16_4_WritePeriod(mcis); PWM16_5_WritePeriod(la); UART_CPutString("\r\nMEIJI!\r\n"); } else if(TC==647){ PWM16_2_WritePeriod(me); PWM16_3_WritePeriod(g); PWM16_4_WritePeriod(mcis); PWM16_5_WritePeriod(la); } else if(TC==649){ PWM16_2_WritePeriod(md); PWM16_3_WritePeriod(fis); PWM16_4_WritePeriod(md); PWM16_5_WritePeriod(d); } else if(TC==665){ PWM16_2_WritePeriod(md); PWM16_3_WritePeriod(fis); PWM16_4_WritePeriod(mcis); PWM16_5_WritePeriod(d); } else if(TC==669){ PWM16_2_WritePeriod(0); PWM16_3_WritePeriod(0); PWM16_4_WritePeriod(0); PWM16_5_WritePeriod(0); } else if(TC==673){ PWM16_2_WritePeriod(md); PWM16_3_WritePeriod(g); PWM16_4_WritePeriod(h); PWM16_5_WritePeriod(g); UART_CPutString("\r\nその名ぞ\r\n"); } else if(TC==679){ PWM16_2_WritePeriod(me); PWM16_3_WritePeriod(g); PWM16_4_WritePeriod(h); PWM16_5_WritePeriod(g); } else if(TC==681){ PWM16_2_WritePeriod(md); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(fis); } else if(TC==689){ PWM16_2_WritePeriod(md); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(fis); PWM16_5_WritePeriod(d); } else if(TC==695){ PWM16_2_WritePeriod(md); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(g); PWM16_5_WritePeriod(e); } else if(TC==697){ PWM16_2_WritePeriod(h); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(fis); } else if(TC==701){ PWM16_2_WritePeriod(0); PWM16_3_WritePeriod(0); PWM16_4_WritePeriod(0); PWM16_5_WritePeriod(0); } else if(TC==705){ PWM16_2_WritePeriod(h); PWM16_3_WritePeriod(g); PWM16_4_WritePeriod(mcis); PWM16_5_WritePeriod(la); UART_CPutString("\r\nわれらが母校\r\n"); } else if(TC==709){ PWM16_2_WritePeriod(a); PWM16_3_WritePeriod(g); PWM16_4_WritePeriod(mcis); PWM16_5_WritePeriod(la); } else if(TC==713){ PWM16_2_WritePeriod(a); PWM16_3_WritePeriod(fis); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(d); } else if(TC==717){ PWM16_2_WritePeriod(fis); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(fis); PWM16_5_WritePeriod(d); } else if(TC==725){ PWM16_2_WritePeriod(g); PWM16_3_WritePeriod(e); PWM16_4_WritePeriod(g); PWM16_5_WritePeriod(d); } else if(TC==729){ PWM16_2_WritePeriod(a); PWM16_3_WritePeriod(fis); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(d); } else if(TC==737){ PWM16_2_WritePeriod(h); PWM16_3_WritePeriod(g); PWM16_4_WritePeriod(h); PWM16_5_WritePeriod(g); } else if(TC==745){ PWM16_2_WritePeriod(a); PWM16_3_WritePeriod(fis); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(fis); } else if(TC==749){ PWM16_2_WritePeriod(0); PWM16_3_WritePeriod(0); PWM16_4_WritePeriod(0); PWM16_5_WritePeriod(0); } else if(TC==753){ PWM16_2_WritePeriod(md); PWM16_3_WritePeriod(md); PWM16_4_WritePeriod(md); PWM16_5_WritePeriod(0); UART_CPutString("\r\nOh-o!\r\n"); } else if(TC==761){ PWM16_2_WritePeriod(a); PWM16_3_WritePeriod(a); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(0); } else if(TC==765){ PWM16_2_WritePeriod(0); PWM16_3_WritePeriod(0); PWM16_4_WritePeriod(0); PWM16_5_WritePeriod(0); } else if(TC==769){ PWM16_2_WritePeriod(mfis); PWM16_3_WritePeriod(g); PWM16_4_WritePeriod(mcis); PWM16_5_WritePeriod(la); UART_CPutString("\r\nMEIJI!\r\n"); } else if(TC==775){ PWM16_2_WritePeriod(e); PWM16_3_WritePeriod(g); PWM16_4_WritePeriod(mcis); PWM16_5_WritePeriod(la); } else if(TC==777){ PWM16_2_WritePeriod(md); PWM16_3_WritePeriod(fis); PWM16_4_WritePeriod(md); PWM16_5_WritePeriod(lh); } else if(TC==785){ PWM16_2_WritePeriod(md); PWM16_3_WritePeriod(fis); PWM16_4_WritePeriod(md); PWM16_5_WritePeriod(a); } else if(TC==793){ PWM16_2_WritePeriod(md); PWM16_3_WritePeriod(fis); PWM16_4_WritePeriod(mcis); PWM16_5_WritePeriod(g); } else if(TC==797){ PWM16_2_WritePeriod(0); PWM16_3_WritePeriod(0); PWM16_4_WritePeriod(0); PWM16_5_WritePeriod(0); } else if(TC==801){ PWM16_2_WritePeriod(d); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(d); PWM16_5_WritePeriod(0); UART_CPutString("\r\nその名ぞ\r\n"); } else if(TC==807){ PWM16_2_WritePeriod(md); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(h); PWM16_5_WritePeriod(g); } else if(TC==809){ PWM16_2_WritePeriod(md); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(fis); } else if(TC==817){ PWM16_2_WritePeriod(md); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(fis); PWM16_5_WritePeriod(d); } else if(TC==823){ PWM16_2_WritePeriod(md); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(g); PWM16_5_WritePeriod(e); } else if(TC==825){ PWM16_2_WritePeriod(a); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(fis); } else if(TC==829){ PWM16_2_WritePeriod(0); PWM16_3_WritePeriod(0); PWM16_4_WritePeriod(0); PWM16_5_WritePeriod(0); } else if(TC==833){ PWM16_2_WritePeriod(h); PWM16_3_WritePeriod(g); PWM16_4_WritePeriod(md); PWM16_5_WritePeriod(d); UART_CPutString("\r\nわれらが母校\r\n"); } else if(TC==837){ PWM16_2_WritePeriod(a); PWM16_3_WritePeriod(fis); PWM16_4_WritePeriod(md); PWM16_5_WritePeriod(d); } else if(TC==845){ PWM16_2_WritePeriod(fis); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(d); } else if(TC==853){ PWM16_2_WritePeriod(d); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(a); PWM16_5_WritePeriod(fis); } else if(TC==857){ PWM16_2_WritePeriod(fis); PWM16_3_WritePeriod(lh); PWM16_4_WritePeriod(gis); PWM16_5_WritePeriod(e); } else if(TC==865){ PWM16_2_WritePeriod(e); PWM16_3_WritePeriod(cis); PWM16_4_WritePeriod(g); PWM16_5_WritePeriod(la); } else if(TC==873){ PWM16_2_WritePeriod(d); PWM16_3_WritePeriod(d); PWM16_4_WritePeriod(fis); PWM16_5_WritePeriod(fis); } else if(TC==893){ PWM16_2_WritePeriod(0); PWM16_3_WritePeriod(0); PWM16_4_WritePeriod(0); PWM16_5_WritePeriod(0); }
}
考察
- EXORで2つ以上のまったく同じデジタル信号を合成すると何も鳴らないと予想されたが、音量の大きい潰れたような音が鳴った。これは、PWMの信号が何度もEXORゲートを通過することによりわずかにずれが生じ、ハザードを引き起こして波形を出力しているため完全には打ち消しあわなかったためと予想した。
- UARTを利用して、開始信号を'y'で送りたかったが、なぜか上手くいかなかったので、バッファ読み込みは行わず、単にポーリングを用いてコマンド終端文字(Enter)を検出することによって演奏を開始するようにした。結果的には解決できなかったが、受信バッファに文字が入っていなかったことが原因かと思われる。
- Enterキーを何回か押さないとうまく演奏できない場合がある。これは、ポーリングとuartの周期がうまく合っていないためと考えられる。なお、uartは38400bpsで動き、ポーリングはCPU clock(24MHz)に準じた速度で動いている。
- 可変抵抗を操作してボリュームを変更する機能を追加したかったが、Referenceを見たところPWMにおいて出力電圧を変える機能が見つからなかったため断念した。周期をかなり短くすることによって積分値を用いて音量を変更する手法もあるらしいが、今回は時間がとれないためできなかった。
- 最終更新:2016-12-21 12:16:42