チーム2132
課題名
音楽プレーヤー (再生、停止、リスタート機能搭載)
研究者名
丹村悠暉
日永凜太朗
使用機材
PSoC基盤
PSoC MiniProg
スピーカー
ジャンパ線(2本)
概要
ドラクエの曲を再生する音楽プレーヤー
キーボードのコマンドを入力することで、楽曲の再生や一時停止などを行うことができる。
p:再生
s:一時停止
r:リスタート
動作
配線
ソースコード
ソースコード
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#pragma interrupt_handler myISR
int PW=125; // Pulse Width
int SILENT=0, D=229, L=204, M=182, F=172, S=153, R=136, C=121, DD=115, LL=102, Fs=162, Ss=145, DDs=108, Ff=162, Dd=193, s=308, MM=91, FF=86, SS=306,RR=68,Cc=243;
int TC=0; //Time Count
void myISR(void)
{
PWM16_1_WritePulseWidth(PW); if (TC == 4) PWM16_1_WritePeriod(s); else if (TC == 6) PWM16_1_WritePeriod(SILENT); else if (TC == 7) PWM16_1_WritePeriod(s); else if (TC == 11) PWM16_1_WritePeriod(D); else if (TC == 15) PWM16_1_WritePeriod(L); else if (TC == 19) PWM16_1_WritePeriod(M); else if (TC == 23) PWM16_1_WritePeriod(F); else if (TC == 27) PWM16_1_WritePeriod(S); else if (TC == 31) PWM16_1_WritePeriod(DD); else if (TC == 35) PWM16_1_WritePeriod(C); else if (TC == 40) PWM16_1_WritePeriod(R); else if (TC == 42) PWM16_1_WritePeriod(SILENT); else if (TC == 43) PWM16_1_WritePeriod(R); else if (TC == 46) PWM16_1_WritePeriod(S); else if (TC == 50) PWM16_1_WritePeriod(Ff); else if (TC == 54) PWM16_1_WritePeriod(R); else if (TC == 56) PWM16_1_WritePeriod(S); else if (TC == 60) PWM16_1_WritePeriod(M); else if (TC == 63) PWM16_1_WritePeriod(M); else if (TC == 65) PWM16_1_WritePeriod(SILENT); else if (TC == 66) PWM16_1_WritePeriod(M); else if (TC == 68) PWM16_1_WritePeriod(SILENT); else if (TC == 69) PWM16_1_WritePeriod(M); else if (TC == 71) PWM16_1_WritePeriod(SILENT); else if (TC == 73) PWM16_1_WritePeriod(M); else if (TC == 77) PWM16_1_WritePeriod(Ff); else if (TC == 81) PWM16_1_WritePeriod(Ss); else if (TC == 85) PWM16_1_WritePeriod(R); else if (TC == 90) PWM16_1_WritePeriod(R); else if (TC == 93) PWM16_1_WritePeriod(C); else if (TC == 96) PWM16_1_WritePeriod(DD); else if (TC == 99) PWM16_1_WritePeriod(LL); else if (TC == 105) PWM16_1_WritePeriod(R); else if (TC == 107) PWM16_1_WritePeriod(SILENT); else if (TC == 108) PWM16_1_WritePeriod(R); else if (TC == 110) PWM16_1_WritePeriod(DD); else if (TC == 112) PWM16_1_WritePeriod(SILENT); else if (TC == 113) PWM16_1_WritePeriod(DD); else if (TC == 116) PWM16_1_WritePeriod(C); else if (TC == 120) PWM16_1_WritePeriod(R); else if (TC == 124) PWM16_1_WritePeriod(S); else if (TC == 128) PWM16_1_WritePeriod(MM); else if (TC == 133) PWM16_1_WritePeriod(FF); else if (TC == 136) PWM16_1_WritePeriod(MM); else if (TC == 139) PWM16_1_WritePeriod(LL); else if (TC == 142) PWM16_1_WritePeriod(DD); else if (TC == 146) PWM16_1_WritePeriod(R); else if (TC == 148) PWM16_1_WritePeriod(SILENT); else if (TC == 149) PWM16_1_WritePeriod(R); else if (TC == 153) PWM16_1_WritePeriod(LL); else if (TC == 157) PWM16_1_WritePeriod(MM); else if (TC == 160) PWM16_1_WritePeriod(LL); else if (TC == 162) PWM16_1_WritePeriod(DD); else if (TC == 164) PWM16_1_WritePeriod(SILENT); else if (TC == 166) PWM16_1_WritePeriod(DD); else if (TC == 170) PWM16_1_WritePeriod(C); else if (TC == 174) PWM16_1_WritePeriod(S); else if (TC == 178) PWM16_1_WritePeriod(SS); else if (TC == 182) PWM16_1_WritePeriod(MM); else if (TC == 185) PWM16_1_WritePeriod(FF); else if (TC == 188) PWM16_1_WritePeriod(SS); else if (TC == 191) PWM16_1_WritePeriod(R); else if (TC == 195) PWM16_1_WritePeriod(SILENT); else if (TC == 197) PWM16_1_WritePeriod(R); else if (TC == 200) PWM16_1_WritePeriod(C); else if (TC == 203) PWM16_1_WritePeriod(DD); else if (TC == 206) PWM16_1_WritePeriod(FF); else if (TC == 211) PWM16_1_WritePeriod(MM); else if (TC == 216) PWM16_1_WritePeriod(DD); else if (TC >= 221) PWM16_1_WritePeriod(SILENT); TC += 1; //TC = TC +1
}
void main(void)
{
char * strPtr; // Parameter pointer UART_CmdReset(); // Initialize receiver/cmd buffer UART_IntCntl(UART_ENABLE_RX_INT); // Enable RX interrupts Counter8_1_WritePeriod(155); // Set up baud rate generator Counter8_1_WriteCompareValue(77); Counter8_1_Start(); // Turn on baud rate generator UART_Start(UART_PARITY_NONE); // Enable UART M8C_EnableGInt ; // Turn on interrupts Timer16_1_EnableInt(); UART_CPutString(" \r\n pで楽曲の再生、sで楽曲の停止、rでリピート再生を行います \r\n"); while(1) { if(UART_bCmdCheck()) { // Wait for command if(strPtr = UART_szGetParam()) { // More than delimiter? UART_PutString(strPtr); // Print out command; if (*strPtr=='p'){ UART_CPutString(" \r\n 再生 \r\n"); Timer16_1_Start(); PWM16_1_Start(); } else if (*strPtr=='s'){ UART_CPutString(" \r\n 停止 \r\n"); Timer16_1_Stop(); PWM16_1_Stop(); } else if (*strPtr=='r'){ UART_CPutString(" \r\n リスタート\r\n"); Timer16_1_Stop(); PWM16_1_Stop(); TC = 0; Timer16_1_Start(); PWM16_1_Start(); } else { UART_CPutString(" \r\n 無効なコマンドです \r\n"); } } UART_CmdReset(); // Reset command buffer } }
}
考察
今回は音楽を再生し、キーボードからのコマンドによって再生、停止、リスタートを行えるようにした。
参考にした2048班のものではリピートを実現しようとしたが、再生の状態で曲が終わるとまた曲がスタートしてしまっていた。よって、そこを曲が終わると音が鳴らないように改良をし、リピートボタンはリスタートボタンとした。これにより、曲が再生されている途中にrのコマンドが送られてきた場合に曲の初めからまた再生がされるような仕様にした。
課題としてはこのPSoC基盤ではスピーカーを1つしか繋げることができず、和音を駆使して本来の音楽通りに演奏することができないことである。どうしても単一な音しか奏でることができずオルゴールのようになってしまう。
時間があれば実装したかった動作は、曲を複数用意しておいて選ばれた曲を奏でるものや、再生スピードの変更が可能なものである。これを実現することができればより良い音楽プレーヤーを作成することができるはずである。
引用:2048班
- 最終更新:2021-07-13 17:19:11