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...