使用Beep 函式發出指定音高 一

2021-07-05 03:23:27 字數 1158 閱讀 8426

c語言裡自帶了函式beep(),

它的宣告如下:

bool beep(dword freq,dword duration);

該函式呼叫機箱喇叭(揚聲器)發出指定音高長度的聲音

freq代表聲音的頻率,單位是赫茲

duration代表聲音的長度,單位是毫秒

如果我們想發出現在**的樂音,該如何做呢?

我們知道音高在**中的最小劃分是半音,我們把一倍音程平均劃分成12個半音,

因此每個音的頻率數列是乙個等比數列

公比r=2^(1/12)=1.05946309411451

現代標準音a4的頻率通常為440hz,實際**會的時候也會定音為442hz或者443hz

知道了這些引數,我們可以寫出求任意音名音高的函式,

首先定義乙個列舉型別 pitch,

enum pitch ;
typedef pitch pitch_t;

這裡面定義了12個半音的名稱,其中s代表sharp,即公升音#

其中x代表空音符,用於以後的擴充套件

求得音高的程式很簡單,如下

首先定義兩個常量,即之前提到的標準音高和公比

#define a4_pitch 440

#define music_ratio 1.05946309411451f

dword getfreqbyname(pitch_t name, char num = 5)

這個函式入口引數 name為列舉音名,num代表音的位置

例如**c為c4, 鋼琴最低音為a0

程式原理如下,為了計算方便,先求出c5的音高,由於c5比a4高3,因此使用當前的音名+3即可

同一音名都是2倍關係,再通過num求出具體音高

以下例子可以發出c5,d5,e5

beep(getfreqbyname(c,5),1000);

beep(getfreqbyname(d,5),1000);

beep(getfreqbyname(e,5),1000);

下一章寫利用這個函式發出指定**,需要加上音長,節拍等

使用函式輸出指定範圍內的Fibonacci數

本題要求實現乙個計算fibonacci數的簡單函式,並利用其實現另乙個函式,輸出兩正整數m和n 0函式介面定義 int fib int n void printfn int m,int n 其中函式fib須返回第n項fibonacci數 函式printfn要在一行中輸出給定範圍 m,n 內的所有fi...

PTA 使用函式統計指定數字的個數

本題要求實現乙個統計整數中指定數字的個數的簡單函式。countdigit number,digit 其中number是整數,digit為 1,9 區間內的整數。函式countdigit應返回number中digit出現的次數。函式介面定義 countdigit number,digit 返回digi...

習題5 5 使用函式統計指定數字的個數

本題要求實現乙個統計整數中指定數字的個數的簡單函式。函式介面定義 int countdigit int number,int digit 其中number是不超過長整型的整數,digit為 0,9 區間內的整數。函式countdigit應返回number中digit出現的次數。裁判測試程式樣例 in...