微机原理实验8254计算机钢琴,GitHub - SincereXIA/PianoMFC: 西电微机原理课设项目,键盘电子乐器演奏程序设计(电子琴),MFC...
PianoMFC
西電微機(jī)原理課設(shè)項(xiàng)目,鍵盤電子樂器演奏程序設(shè)計(jì)(電子琴),MFC
需要連接西電微機(jī)原理實(shí)驗(yàn)室提供的 QTH9054 微機(jī)試驗(yàn)箱,使用其蜂鳴器發(fā)聲,若不連接,程序會(huì)直接播放 mp3 文件模擬鋼琴聲。
請(qǐng)?jiān)?release 處下載編譯好的 exe 文件運(yùn)行,如需計(jì)算機(jī)喇叭發(fā)聲,請(qǐng)選擇聲卡輸出,并保證 sound 文件夾與 piano.exe 在同一目錄下。
功能設(shè)計(jì)
基礎(chǔ)功能
能夠演奏 C 調(diào)包含高、中、低音的不同節(jié)拍的樂曲,音調(diào)與頻率的對(duì)應(yīng)關(guān)系如下:
微機(jī)鍵盤與電子琴鍵盤的對(duì)應(yīng)關(guān)系為:高音依次為 Q,W,E,R,T,Y,U,中音依次為A,S,D,F,G,H,J,低音依次為 Z,X,C,V,B,N,M。
附加功能
增加自動(dòng)演奏樂曲功能。當(dāng)按下 P 鍵后,自動(dòng)播放一首樂曲,曲長(zhǎng)大于 20 秒。
增加琴鍵圖形顯示功能。屏幕上顯示 21 個(gè)琴鍵(高中低音),當(dāng)按下某鍵后屏幕上的對(duì)應(yīng)琴鍵有所反映。
增加一個(gè)音調(diào) D,當(dāng)從 C 調(diào)改為 D 調(diào)后,演奏音按照 D 調(diào)(比 C 高一個(gè)調(diào))發(fā)音。
進(jìn)階功能
實(shí)現(xiàn)鍵位切換功能:除了基礎(chǔ)功能要求的按鍵映射關(guān)系外,額外增加可以選擇 按鍵A~Z 對(duì)應(yīng)于音調(diào)的最低音到最高音
實(shí)現(xiàn)聲卡輸出功能:在脫離了微機(jī)實(shí)驗(yàn)箱的情況下,程序仍然能夠使用計(jì)算機(jī)內(nèi)置的聲卡,通過計(jì)算機(jī)喇叭或者耳機(jī)進(jìn)行聲音的輸出
環(huán)境要求
開發(fā)環(huán)境:
開發(fā)工具:實(shí)驗(yàn)室給定的 Visual C++ 6.0
操作系統(tǒng):實(shí)驗(yàn)室給定的 Windows XP
軟件執(zhí)行環(huán)境
執(zhí)行程序需要在 WIndows 平臺(tái)上運(yùn)行,在 Windows10、Windows 7 、Windows XP 上通過兼容性測(cè)試
QTH9054 微機(jī)試驗(yàn)箱 (可選)
為什么用 vc6.0
因?yàn)閷?shí)驗(yàn)室的電腦上面只有 vc6.0
硬件設(shè)計(jì)方案及硬件連線圖
硬件部分使用8254定時(shí)器,控制音調(diào)的高低,為了使蜂鳴器發(fā)出聲音,使用高頻時(shí)鐘脈沖信號(hào)(32.768KHz),向8254寫入方式三控制字,之后通過改變計(jì)數(shù)值值來獲得期望得到的脈沖信號(hào),將可聽頻率內(nèi)的脈沖信號(hào)直接接入蜂鳴喇叭,獲得聲音輸出。
硬件連線:
總線 LD0-LD7 接8254的 D0-D7 ,
LA0和LA1接8254的A0和A1,
IOWR和IORD接8254的WR和RD,
地址0000H接8254的CS
8254的GATE0接VCC
CLK0接初始的時(shí)鐘頻率32.768KHZ
OUT0接蜂鳴器輸入
硬件驅(qū)動(dòng)部分設(shè)計(jì)
使蜂鳴喇叭發(fā)出聲音的核心是 set_freq_dividing_ratio() 函數(shù),其參數(shù) ratio 設(shè)定了計(jì)數(shù)值,time 定義了聲音發(fā)出的時(shí)長(zhǎng)。
開始時(shí),先寫入 8254 的方式控制字,使其工作在方式 3,之后寫入計(jì)數(shù)值。該方式輸出的是方波。如果初始計(jì)數(shù)值是N, 那么方波的頻率是輸入時(shí)鐘的N分之一。該方式的特點(diǎn)是方波占空比約為1比1
void set_freq_dividing_ratio(int ratio,int time)
{
if(ratio!=0){
IO8bWrite(P8254MODE,0x14);//0x03
char input = (char)(ratio);
IO8bWrite(P8254A,input);
}
Sleep(time);
IO8bWrite(P8254MODE,0x10);
}
而計(jì)數(shù)值則由play_one_tone() 函數(shù)通過查表并計(jì)算得出
void play_one_tone(int freqnum,float flag)
{
//printf("\b%c%c\n",tone_list[freqnum-1][0],tone_list[freqnum-1][1]);
int div_ratio = get_div_ratio(freqnum, flag);
if (isLocalSound){
if(flag < 1) flag = 0;
play_one_toneL('a'+freqnum-1 + flag*7);
}else{
set_freq_dividing_ratio(div_ratio,beat);
}
}
測(cè)試結(jié)果與功能展示
執(zhí)行編譯好的 Piano.exe 文件,完成硬件驅(qū)動(dòng)檢測(cè)后,即會(huì)彈出電子樂器演奏程序的主界面
界面中部為模擬的電子琴界面,界面下部為設(shè)置界面。
單擊右下角的幫助按鈕,彈出幫助窗口,對(duì)程序功能進(jìn)行說明
按下鍵盤按鍵,微機(jī)試驗(yàn)箱上的蜂鳴器就會(huì)發(fā)出指定音調(diào)的聲音。
可以通過點(diǎn)擊按鈕來設(shè)定 C/D 調(diào) 以及聲音長(zhǎng)度(節(jié)拍)。如果選擇聲卡輸出,則會(huì)使用計(jì)算機(jī)的內(nèi)置聲卡進(jìn)行鋼琴音的模擬
點(diǎn)擊右下角的歌曲按鈕,會(huì)自動(dòng)播放內(nèi)置的音頻
工作中的微機(jī)試驗(yàn)箱:
總結(jié)
以上是生活随笔為你收集整理的微机原理实验8254计算机钢琴,GitHub - SincereXIA/PianoMFC: 西电微机原理课设项目,键盘电子乐器演奏程序设计(电子琴),MFC...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mapiicon.exe进程是什么文件
- 下一篇: master.exe是什么进程 有什么用