授课ANT日期528.ppt
BEEP and Sound,授課:ANT 日期:2014/5/28,授課內容,BEEP播放音樂 use System播放音樂 use PlaySound簡易使用windows.hMessageBox,About BEEP,最簡單的警示音,利用ASCII裡的基本設定。#include#include#include int main()printf(%c,7);Sleep(1000);printf(%c,a);return 0;,BEEP函式,C除了可利用 printf(“%c”,a);產生 beep單純一聲外,尚可利用 Beep 指令來完成單音的曲子、音階。運用windows.h裡的函式Beep(int dwFreq,int dwDuration);第一個參數dwFreq為音階頻率第二個參數dwDuration為延遲時間可依個人需求自訂延遲時間來分別判斷一拍及半拍.ex:600 為一拍=300 便是半拍.,小範例 ex10-1-1,這是一個利用蜂鳴器發出簡易音階的小範例。切記:請在無人時實作,因為真的很吵。,小蜜蜂範例 ex10-1-2,#include#includeint main()int row,col;int voice164=700,600,600,0,650,550,550,0,500,550,600,650,700,700,700,0,700,600,600,0,650,550,550,0,500,650,700,700,600,0,0,0,550,550,550,550,550,600,650,0,600,600,600,600,600,650,700,0,700,600,600,0,650,550,550,0,500,600,700,700,500,0,0,0;int tempo164=1,1,2,0,1,1,2,0,1,1,1,1,1,1,2,0,1,1,2,0,1,1,2,0,1,1,1,1,4,0,0,0,1,1,1,1,1,1,2,0,1,1,1,1,1,1,2,0,1,1,2,0,1,1,2,0,1,1,1,1,4,0,0,0;for(row=0;row16;row+)for(col=0;col4;col+)Beep(voicerowcol,temporowcol*350);return 0;,播放音樂 use System,使用系統預設的播放程式。它不是背景音樂,程式想繼續執行必須要關閉播放器。,播放音樂 use PlaySound,PlaySound是用來播放音樂的一個windows.h函式。其函式格式如下:BOOL PlaySound(LPCSTR pszSound,HMODULE hmod,DWORD fdwSound);參數意義 第一個參數可以是音效檔案名稱或內定的聲音別名或程式資源。第二個參數只有當第一個參數是程式資源時才可以用,通常為NULL。第三個參數指定第一個參數是檔案名稱以及同步播放選項如PlaySound(yoursound.wav,NULL,SND_FILENAME|SND_SYNC);,使用PlaySound的事前準備,由於此項函式較為特殊,因此必須使用到winmm.lib,屬於系統的LIB檔。在codeblocks底下,並沒有此lib檔。首先必須下載winmm.lib(在壓縮檔裡有附。)接著,將此lib檔放置到與.c檔同一個資料夾底下。在codeblocks的”setting”-“Compiler and debugger settings”-左欄“Global compiler settings”-“Linker settings”按add並將此lib檔加入。,使用PlaySound的事前準備(續),做完這動作後,還必須在程式中加入#pragma comment(lib,“winmm.lib”)#include#include 注意include時,window.h要放在mmsystem.h之上不然會有錯誤產生。但是此函式目前只能播放.wav格式的聲音檔,PlaySound,此函式的第三個參數為播放標誌,可有下列的選擇:SND_FILENAME pszSound參數指定了WAVE檔名SND_SYNC 做同步播放,在播放完後才返回SND_ASYNC 做非同步播放,函數在開始播放後立即返回SND_LOOP 重複播放聲音,但必須與SND_ASYNC同時使用SND_NODEFAULT 不播放如果沒有聲音的音效,如果沒使用則當發現 沒有聲音可撥放時會撥放音效。SND_PURGE 停止所有與調用任務有關的聲音。若參數pszSound 為NULL,就停止所有的聲音,否則停止 pszSound 指定的聲音。詳情參考 http:/.tw/43298441_d.html第三個參數在使用時可以使用”|”組合函式的功能。如SND_FILENAME|SND_ASYNC 表示指定了第一個參數為播放的檔案且做非同步播放。,範例 ex10-2,注意音樂檔名在輸入時,請記得要輸入完整的位址另外參數中的路徑使用兩個連續的反斜杠轉義代表一個反斜杠。,簡易windows.h使用-MessageBox,我們為了要讓程式看起來有點變化,可用messagebox產生一個對話方塊。當然,它會有自己的標題、文字訊息及按鍵鈕等。使用很簡單,如下#includeint main()MessageBox(NULL,“Hello World”,“,MB_OK|MB_ICONASTERISK);return 0;,MessageBox,格式如下:int MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UNIT uType)四個參數分別是:1)HWnd:要建立之訊息方塊的擁有人控制代碼。2)LpText:想要顯示的文字字串的指標。3)LpCaption:對話方塊標題字串的指標。4)UType:顯示在對話方塊上的小圖示的類型。詳細資料參考 http:/,MessageBox(續),小範例中第四個參數MB_OK及MB_ICONASTERISK,分別表示有個OK的按鈕及有個 的圖示。關於return值,如果messagebox有Cancel按鍵(ex.MB_OKCANCEL,表示式窗上有OK與Cancel按鍵),則按下它的回傳值會是IDCANCEL,另外如果是按鍵盤上的Esc鍵也會回傳IDCANCEL。按鍵類型與圖示類型請參考上頁連結。,範例 ex10-3,利用messagebox的回傳值,在主程式執行下一步的動作。對應到按取消鍵,則回傳IDCANCEL,而重試則是IDRETRY。,複習kbhit,Kbhit()的使用在於判斷是否有按按鍵。從系統來看就是說,此函式在於判斷暫存器buffer,是否有資料。當我們按鍵盤按鍵時,電腦會將按鍵字元存於keyboard buffer內,而kbhit如果判斷buffer內有資料則回傳非 0的值,無資料則回傳 0。注意:當使用kbhit()後,並未使用getch()函式的話,buffer內的資料會一直存在,再下一次按按鍵時會繼續儲存,直到buffer滿為止,因此往後的kbhit()持續回傳 1。,複習kbhit(續),因此從下面程式就可以知道瞭解問題。,Lab 10,用Beep製作一個電子琴 按下鍵盤上的ASDFGHJ便會發出對應的聲音 A-DoS-ReD-MiF-FaG-SoH-LaJ-Si,HW 10,簡易wav播放器透過本程式可讓使用者簡易的播放與更換背景音樂,本程式共有三種音樂讓使用者自行選擇。流程 使用者一開始(1)試聽(2)離開在選擇試聽後,出現現有的歌單,並選擇。在選擇某一音樂後,使用者有兩種選項(a)試聽秒數(b)任意,在(a)中給予試聽的秒數,在(b)中則提供歌曲播放不中斷直到按到鍵盤任一按鍵為止。當歌曲非意外性停止或中斷,也就是秒數到了或者選(b)的人按了鍵盤則回到最初選擇(1)試聽(2)離開,HW 10解釋,首先創建一txt文件檔,內含歌曲名稱,為求方便,歌曲名由助教定義(歌曲1:haunted.wav 歌曲2:blacksky.wav 歌曲3:rainielove.wav),避免作業繳交時上傳檔案過大,作業上傳時不需要上傳音樂檔。歌單檔名為song,檔案型態是txt,其中共有三筆資料由於歌曲檔案很大轉檔後每個約為40MB,故在程式撰寫時,測試程式時請自行找尋wav音樂檔,並命名為歌單的名稱,位置放置C槽底下,做測試。另外實驗室提供winmm.lib檔繳交作業需要附上.C檔及song.txt 以及書面檔案(.doc)將兩個檔案加入壓縮檔上傳(壓縮檔檔名為“系籍_學號_HW09”),