當前位置:編程學習大全網 - 編程語言 - 如何用c語言編寫歌曲

如何用c語言編寫歌曲

我們知道,音樂是音高和音長的有序組合,設計微機音樂最重要的就是如何定義音高和音長,以及如何讓揚聲器發出指定的音符。下面給出音符與頻率的關系表。C語言提供的三個函數sound( )、nosound( )和clock( )可以很方便地解決上述的問題。sound( )函數可以用指定頻率打開PC機揚聲器直到用nosound( )函數來關閉它; clock( )函數正好用來控制發聲時間,而且它不受PC機主頻高低的影響。下面這段程序可使微機發出c調1的聲音。

音符與頻率關系表

音符 c d e f g a b

1 2 3 4 5 6 7

頻率 262 294 330 349 392 440 494

音符 c d e f g a b

1 2 3 4 5 6 7

頻率 523 587 659 698 784 880 988

音符 c d e f g a b

1 2 3 4 5 6 7

頻率 1047 1175 1319 1397 2568 1760 1976

#include<stdio.h>

#include<dos.h>

void pause(int);

void sound1(int,int);

void main(void)

{

int i,freq,speed=5;

int time=4*speed;

char *qm="iddgwwwQQgfff dddfghhhggg ddgwwwqqgfff\

ddffhjqqqqq wpggjhgddgqq hhqwwqjjjggg\

ddgwwwqqqgfff ddffhjqqqqqq";/*定義歌曲*/

while (*qm++ !='\0'){

i=1;

switch(*qm){

case 'k':

time=1*speed; i=0;

break;

case 'i':

time=6*speed; i=0;

break;

case 'o':

time=10*speed; i=0;

break;

case 'p':

pause(time); i=0;

break;

case 'a':

freq=523;

break;

case 's':

freq=587;

break;

case 'd':

freq=659;

break;

case 'f':

freq=698;

break;

case 'g':

freq=784;

break;

case 'h':

freq=880;

break;

case 'j':

freq=988;

break;

case 'z':

freq=262;

break;

case 'X':

freq=294;

break;

case 'c':

freq=330;

break;

case 'v':

freq=349;

break;

case 'b':

freq=392;

break;

case 'n':

freq=440;

break;

case 'm':

freq=494;

break;

case 'q':

freq=1047;

break;

case 'w':

freq=1175;

break;

case 'e':

freq=1319;

break;

case 'r':

freq=1397;

break;

case 't':

freq=2568;

break;

case 'y':

freq=1760;

break;

case 'u':

freq=1976;

break;

default:

i=0;

break;

}

if(i)

sound1(freq,time);

}

}

void sound1(int freq,int time) /*freq為頻率,time為持續時間*/

{

union{

long divisor;

unsigned char c[2];

}count;

unsigned char ch;

count.divisor=1193280/freq; /* 1193280 是系統時鐘速率*/

outp(67,182);

outp(66,count.c[0]);

outp(66,count.c[1]);

ch=inp(97);

outp(97,ch|3);

pause(time);

outp(97,ch);

}

void pause(int time)

{

int t1,t2;

union REGS in,out;

in.h.ah=0X2c;

int86(0X21,&in,&out); /* 取當前時間*/

t1=t2=100*out.h.dh+out.h.dl; /*out.h.dh 為秒值,out.h.dl 為1/100 秒值*/

while(t2-t1<time)

{

int86(0X21,&in,&out);

t2=100*out.h.dh+out.h.dl;

if (t2<t1)t2+=6000; /* 增加壹分鐘*/

}

}

  • 上一篇:Abcdef編程
  • 下一篇:格力空調h4的故障原因是什麽?
  • copyright 2024編程學習大全網