22
授授ANT 授授2014/5/28

BEEP and Sound

  • Upload
    oro

  • View
    64

  • Download
    0

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: BEEP and Sound

授課: ANT 日期: 2014/5/28

Page 2: BEEP and Sound

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

MessageBox

Page 3: BEEP and Sound

About BEEP最簡單的警示音,利用 ASCII 裡的基本設定。

#include <stdio.h>#include <stdlib.h>#include <windows.h>int main(){ printf("%c",7);

Sleep(1000); printf("%c", '\a' );

return 0 ;}

Page 4: BEEP and Sound

BEEP 函式C 除了可利用 printf(“%c”, ‘\a’ ); 產生 beep 單純

一聲外,尚可利用 Beep 指令來完成單音的曲子、音階。

運用 windows.h 裡的函式Beep(int dwFreq, int dwDuration);第一個參數 dwFreq 為音階頻率第二個參數 dwDuration 為延遲時間

可依個人需求自訂延遲時間來分別判斷一拍及半拍 . ex : 600 為一拍 => 300 便是半拍 .

Page 5: BEEP and Sound

小範例 ex10-1-1這是一個利用蜂鳴器發出簡易音階的小範例。

切記:請在無人時實作,因為真的很吵。

Page 6: BEEP and Sound

小蜜蜂範例 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;

}

Page 7: BEEP and Sound

播放音樂 use System使用系統預設的播放程式。。

它不是背景音樂,程式想繼續執行必須要關閉播放器。

Page 8: BEEP and Sound

播放音樂 use PlaySoundPlaySound 是用來播放音樂的一個 windows.h 函

式。其函式格式如下:BOOL PlaySound(LPCSTR pszSound,

HMODULE hmod,DWORD fdwSound); 參數意義 –

第一個參數可以是音效檔案名稱或內定的聲音別名或程式資源 。

第二個參數只有當第一個參數是程式資源時才可以用,通常為 NULL 。

第三個參數指定第一個參數是檔案名稱以及同步播放選項 如 PlaySound( "yoursound.wav" , NULL,

SND_FILENAME | SND_SYNC );

Page 9: BEEP and Sound

使用 PlaySound 的事前準備由於此項函式較為特殊,因此必須使用到

winmm.lib ,屬於系統的 LIB 檔。在 codeblocks底下,並沒有此 lib 檔。首先必須下載 winmm.lib ( 在壓縮檔裡有附。 )接著,將此 lib 檔放置到與 .c 檔同一個資料夾底下。在 codeblocks 的” setting” -> “Compiler and debugger settings” -> 左欄“ Global compiler settings” -> “Linker settings”按 add 並將此 lib 檔加入。

Page 10: BEEP and Sound

使用 PlaySound 的事前準備( 續 )做完這動作後,還必須在程式中加入

#pragma comment(lib,“winmm.lib”)#include <windows.h>#include <mmsystem.h>

注意 include 時, window.h 要放在 mmsystem.h 之上不然會有錯誤產生。但是此函式目前只能播放 .wav格式的聲音檔

Page 11: BEEP and Sound

PlaySound此函式的第三個參數為播放標誌,可有下列的選擇:

SND_FILENAME pszSound 參數指定了 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 表示指定了第一個參數為播放

的檔案且做非同步播放。

Page 12: BEEP and Sound

範例 ex10-2注意

音樂檔名在輸入時,請記得要輸入完整的位址

另外參數中的路徑使用兩個連續的反斜杠轉義代表一個反斜杠。

Page 13: BEEP and Sound

簡易 windows.h 使用 - MessageBox我們為了要讓程式看起來有點變化,可用

messagebox 產生一個對話方塊。當然,它會有自己的標題、 文字訊息及按鍵鈕等。

使用很簡單,如下#include<windows.h>int main(){ MessageBox(NULL , “Hello World” , “^ ̂ ",MB_OK|

MB_ICONASTERISK); return 0 ;}

Page 14: BEEP and Sound

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

Page 15: BEEP and Sound

MessageBox( 續 )小範例中第四個參數 MB_OK 及

MB_ICONASTERISK ,分別表示有個 OK 的按鈕及有個 的圖示。

關於 return值,如果 messagebox 有 Cancel按鍵 (ex. MB_OKCANCEL ,表示式窗上有 OK 與Cancel按鍵 ) ,則按下它的回傳值會是IDCANCEL ,另外如果是按鍵盤上的 Esc鍵也會回傳IDCANCEL 。

按鍵類型與圖示類型請參考上頁連結。

Page 16: BEEP and Sound

範例 ex10-3

利用 messagebox 的回傳值,在主程式執行下一步的動作。

對應到按取消鍵,則回傳 IDCANCEL ,而重試則是 IDRETRY 。

Page 17: BEEP and Sound

複習 kbhitKbhit() 的使用在於判斷是否有按按鍵。從系統來看

就是說,此函式在於判斷暫存器 buffer ,是否有資料。

當我們按鍵盤按鍵時,電腦會將按鍵字元存於keyboard buffer 內,而 kbhit 如果判斷 buffer 內有資料則回傳非 0 的值,無資料則回傳 0 。

注意:當使用 kbhit() 後,並未使用 getch() 函式的話, buffer 內的資料會一直存在,再下一次按按鍵時會繼續儲存,直到 buffer滿為止,因此往後的kbhit()持續回傳 1 。

Page 18: BEEP and Sound

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

Page 19: BEEP and Sound

Lab 10用 Beep製作一個電子琴 按下鍵盤上的 ASDFGHJ

便會發出對應的聲音 A-DoS-ReD-MiF-FaG-SoH-LaJ-Si

Page 20: BEEP and Sound

HW 10簡易 wav 播放器透過本程式可讓使用者簡易的播放與更換背景音樂,本程式共有三種音樂讓使用者自行選擇。

流程 – 使用者一開始 (1)試聽 (2)離開在選擇試聽後, 出現現有的歌單, 並選擇。 在選擇某一音樂後,使用者有兩種選項 (a)試聽秒數 (b) 任

意, 在 (a) 中給予試聽的秒數,在 (b) 中則提供歌曲播放不中斷直到按到鍵盤任一按鍵為止。

當歌曲非意外性停止或中斷, 也就是秒數到了或者選 (b) 的人按了鍵盤則回到最初選擇 (1)試聽 (2)離開

Page 21: BEEP and Sound

HW 10解釋首先創建一 txt 文件檔,內含歌曲名稱,為求方便,歌曲名由助教

定義 (歌曲 1: haunted.wav 歌曲 2: blacksky.wav 歌曲 3: rainielove.wav) ,避免作業繳交時上傳檔案過大,作業上傳時不需要上傳音樂檔。

歌單檔名為 song ,檔案型態是 txt ,其中共有三筆資料由於歌曲檔案很大轉檔後每個約為 40MB ,故在程式撰寫時,測試程式時請自行找尋wav 音樂檔,並命名為歌單的名稱,位置放置 C 槽底下,做測試。

另外實驗室提供winmm.lib 檔

繳交作業需要附上 .C 檔及 song.txt 以及書面檔案 (.doc) 將兩個檔案加入壓縮檔上傳 ( 壓縮檔檔名為 “系籍 _學號 _HW09”)

Page 22: BEEP and Sound