1 / 21

BEEP and Sound

BEEP and Sound. 授課: ANT 日期: 2010/5/26. 授課內容. BEEP 播放音樂 use System 播放音樂 use PlaySound 簡易使用 windows.h MessageBox. About BEEP. 最簡單的警示音,利用 ASCII 裡的基本設定。 #include <stdio.h> #include <stdlib.h> #include <windows.h> int main() { printf("%c",7); Sleep(1000);

Download Presentation

BEEP and Sound

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. BEEPand Sound 授課:ANT 日期:2010/5/26

  2. 授課內容 • BEEP • 播放音樂 use System • 播放音樂 use PlaySound • 簡易使用windows.h • MessageBox

  3. About BEEP 最簡單的警示音,利用ASCII裡的基本設定。 #include <stdio.h> #include <stdlib.h> #include <windows.h> int main() { printf("%c",7); Sleep(1000); printf("%c", '\a' ); return 0 ; }

  4. BEEP函式 • C除了可利用 printf(“%c”, ‘\a’ );產生 beep單純一聲外,尚可利用 Beep 指令來完成單音的曲子、音階。 • 運用windows.h裡的函式 • Beep(int dwFreq, int dwDuration); • 第一個參數dwFreq為音階頻率 • 第二個參數dwDuration為延遲時間 • 可依個人需求自訂延遲時間來分別判斷一拍及半拍. ex : 600 為一拍 => 300 便是半拍.

  5. 小範例 ex10-1-1 • 這是一個利用蜂鳴器發出 簡易音階的小範例。 • 切記:請在無人時實作, 因為真的很吵。

  6. 小蜜蜂範例 ex10-1-2 #include<windows.h> #include<conio.h> int main() { int row,col; int voice[16][4]={{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 tempo[16][4]={{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; row<16; row++) { for(col=0; col<4; col++) { Beep(voice[row][col],tempo[row][col]*350); } } return 0; }

  7. 播放音樂 use System • 使用系統預設的播放程式。。 • 它不是背景音樂,程式想繼 續執行必須要關閉播放器。

  8. 播放音樂 use PlaySound • PlaySound是用來播放音樂的一個windows.h函式。其函式格式如下: • BOOL PlaySound(LPCSTR pszSound, HMODULE hmod,DWORD fdwSound); • 參數意義 – • 第一個參數可以是音效檔案名稱或內定的聲音別名或程式資源 。 • 第二個參數只有當第一個參數是程式資源時才可以用,通常為NULL。 • 第三個參數指定第一個參數是檔案名稱以及同步播放選項 • 如PlaySound( "yoursound.wav" , NULL, SND_FILENAME | SND_SYNC );

  9. 使用PlaySound的事前準備 • 由於此項函式較為特殊,因此必須使用到winmm.lib,屬於系統的LIB檔。在codeblocks底下,並沒有此lib檔。 • 首先必須下載winmm.lib (在壓縮檔裡有附。) • 接著,將此lib檔放置到與.c檔同一個資料夾底下。 • 在codeblocks的”setting” -> “Compiler and debugger settings” -> 左欄“Global compiler settings” -> “Linker settings” • 按add並將此lib檔加入。

  10. 使用PlaySound的事前準備(續) • 做完這動作後,還必須在程式中加入 • #pragma comment(lib,“winmm.lib”) • #include <windows.h> • #include <mmsystem.h> 注意include時,window.h要放在mmsystem.h之 上不然會有錯誤產生。 • 但是此函式目前只能播放.wav 格式的聲音檔

  11. PlaySound • 此函式的第三個參數為播放標誌,可有下列的選擇: • SND_FILENAMEpszSound參數指定了WAVE檔名 • SND_SYNC 做同步播放,在播放完後才返回 • SND_ASYNC 做非同步播放,函數在開始播放後立即返回 • SND_LOOP 重複播放聲音,但必須與SND_ASYNC同時使用 • SND_NODEFAULT 不播放如果沒有聲音的音效,如果沒使用則當發現 沒有聲音可撥放時會撥放音效。 • SND_PURGE停止所有與調用任務有關的聲音。若參數pszSound 為NULL,就停止所有的聲音,否則停止pszSound 指定的聲音。 詳情參考 http://chenzhand1.blog.hexun.com.tw/43298441_d.html • 第三個參數在使用時可以使用”|”組合函式的功能。 • 如SND_FILENAME | SND_ASYNC 表示指定了第一個參數為播放的檔案且做非同步播放。

  12. 範例 ex10-2 • 注意 音樂檔名在輸入時,請記得要輸入完整的位址 • 另外參數中的路徑使用兩個連續的反斜杠轉義代表一個反斜杠。

  13. 簡易windows.h使用 -MessageBox • 我們為了要讓程式看起來有點變化,可用messagebox產生一個對話方塊。當然,它會有自己的標題、 文字訊息及按鍵鈕等。 • 使用很簡單,如下 #include<windows.h> int main() { MessageBox(NULL , “Hello World” , “^^",MB_OK|MB_ICONASTERISK); return 0 ; }

  14. MessageBox • 格式如下: int MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UNIT uType) • 四個參數分別是: 1) HWnd :父窗口的控制碼。 2) LpText :想要顯示的文字字串的指標。 3) LpCaption :對話方塊標題字串的指標。 4) UType :顯示在對話方塊上的小圖示的類型。 詳細資料參考 http://msdn.microsoft.com/en-us/library/ms645505(VS.85).aspx

  15. MessageBox(續) • 小範例中第四個參數MB_OK及MB_ICONASTERISK,分別表示有個OK的按鈕及有個 的圖示。 • 關於return值,如果messagebox有Cancel按鍵(ex. MB_OKCANCEL,表示式窗上有OK與Cancel按鍵),則按下它的回傳值會是IDCANCEL,另外如果是按鍵盤上的Esc鍵也會回傳IDCANCEL。 • 按鍵類型與圖示類型請參考上頁連結。

  16. 範例 ex10-3 • 利用messagebox的回 傳值,在主程式執行下 一步的動作。 • 對應到按取消鍵,則 回傳IDCANCEL,而重 試則是IDRETRY。

  17. 複習kbhit • Kbhit()的使用在於判斷是否有按按鍵。從系統來看就是說,此函式在於判斷暫存器buffer,是否有資料。 • 當我們按鍵盤按鍵時,電腦會將按鍵字元存於keyboard buffer內,而kbhit如果判斷buffer內有資料則回傳非 0的值,無資料則回傳 0 。 • 注意:當使用kbhit()後,並未使用getch()函式的話,buffer內的資料會一直存在,再下一次按按鍵時會繼續儲存,直到buffer滿為止,因此往後的kbhit()持續回傳 1 。

  18. 複習kbhit(續) • 因此從下面程式就可以知道瞭解問題。

  19. Lab 10 • 簡易wav播放器 透過本程式可讓使用者簡易的播放與更換背景音樂,本程式共有三種音樂讓使用者自行選擇。 • 流程 – • 使用者一開始(1)試聽 (2)離開 • 在選擇試聽後, 出現現有的歌單, 並選擇。 • 在選擇某一音樂後,使用者有兩種選項(a)試聽秒數 (b)任意, 在(a)中給予試聽的秒數,在(b)中則提供歌曲播放不中斷直到按到鍵盤任一按鍵為止。 • 當歌曲非意外性停止或中斷, 也就是秒數到了或者選(b)的人按了鍵盤則回到最初選擇(1)試聽 (2)離開

  20. Lab 10解釋 • 首先創建一txt文件檔,內含歌曲名稱,為求方便,歌曲名由助教定義,避免作業繳交時上傳檔案過大,作業上傳時不需要上傳音樂檔。 • 同時歌曲一律放在C槽底下,其相對應的位址將會是 C:\blacksky.wav C:\OhYeah.wav C:\family.wav • 歌單檔名為song,檔案型態是txt,其中共有三筆資料 • 由於歌曲檔案很大轉檔後每個約為40MB,故在程式撰寫時,測試程式時請自行找尋wav音樂檔,並命名為歌單的名稱,位置放置C槽底下,做測試。 • 另外實驗室提供winmm.lib檔

More Related