标题:书上的钢琴例子,但运行结果不对
只看楼主
jdxhyuan
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2007-12-20
 问题点数:0 回复次数:1 
书上的钢琴例子,但运行结果不对
程序代码:
#include "stdio.h"
#include "dos.h"
#include "bios.h"
#include "graphics.h"
int ioport=0x388;                       /*FM端口*/
void writeFM(char reg,char data);                 /*写FM端口函数*/
char readFM();                                     /*读FM端口函数*/
void FMsound(int frequency,int block); /*用FM发声,frequency:频率,block:音阶*/
void delayFM(int time);
void FMdelay(int time);
void FMsoundoff(int frequency,int block);         /*关闭声音*/
void bar3Dpress(int left,int top,int right,int bottom); /*3D窗口函数*/
void bar3D(int left,int top,int right,int bottom);
void initpiano();                      /*初始化钢琴音色,C程序员可以改变音色*/
int key[21][2]={131,0x7a,147,0x78,165,0x63,175,
                0x76,196,0x62,220,0x6e,247,0x6d,
                262,0x61,294,0x73,330,0x64,349,0x66,
                392,0x67,440,0x68,494,0x6a,524,0x71,
                587,0x77,659,0x65,698,0x72,784,
                0x74,880,0x79,998,0x75};     /*为Z~M,A~J,Q~U这21个键定义音高*/
void main()
{

 int gd=DETECT,gm,cursound=0,i;

 char input;                                 /*按下的键的键码*/

 char * mask;                                 /*图像缓冲*/


 /*初始化BGI图形模式*/

 initgraph(&gd,&gm,"");

 cleardevice();

 /*绘制背景以及电子钢琴*/

 setfillstyle(XHATCH_FILL,BLUE);

 bar(0,0,639,479);

 mask=(char *)malloc(imagesize(0,0,28,200));

 getimage(0,0,28,200,mask);

 bar3D(0,90,639,320);

 for(i=0;i<21;i++)

 {
  bar3D(i*30+5,200,i*30+32,300);

 }

 bar3D(5,100,630,190);

 settextstyle(0,0,3);      /*绘制版权说明和作者介绍*/

 setcolor(BLUE);

 outtextxy(172,122,"FM PIANO DELUX");

 setcolor(LIGHTBLUE);

 outtextxy(170,120,"FM PIANO DELUX");

 settextstyle(0,0,1);

 setcolor(BLACK);

 outtextxy(220,150,"Produced by suprman  99.9.6");

 outtextxy(220,165,"  Copyleft  Software");



 /*初始化声卡上的FM合成器,并定义为钢琴音色*/

 initpiano();

 do

 {
  input=getch();
  for(i=0;i<21;i++)
  { if(key[i][1]==input)
    { /*putimage(i*30+5,200,mask,XOR_PUT);*/
      bar3Dpress(i*30+5,200,i*30+32,300);
      FMsoundoff(cursound,4);
      FMsound(key[i][0],4);
      cursound=key[i][0];
      FMdelay(4);
      bar3D(i*30+5,200,i*30+32,300);
      /*putimage(i*30+5,200,mask,XOR_PUT);*/
    }
  }

 }while(input!=27);     /*按Esc键退出*/

 closegraph();           /*关闭图形模式*/

 free(mask);             /*清除缓冲*/

 }

 void writeFM(char reg,char data)

 { outportb(ioport,reg);
   delay(1000);
   outportb(ioport+1,data);
   delay(2000);

 }

 char readFM()

 { char data;

 data=inportb(ioport);

 return(data);

 }

 void FMsound(int frequency,int block)

 {int fnh,fnl,block2,blfnh,kblfnh,key;
  fnl=frequency&0x00ff;
  fnh=frequency&0xff00;
  fnh=fnh>>8;
  block2=block<<2;
  blfnh=fnh|block2;
  key=0x20;
  kblfnh=blfnh|key;
  writeFM(0xa0,fnl);
  writeFM(0xb0,kblfnh);

 }

 void delayFM(int time)

 { unsigned char sl,i;
   writeFM(0x04,0x80);
   writeFM(0x03,216);
   writeFM(0x04,0x42);
   for(i=1;i<time;i++)
   { do {sl=readFM();
         sl=sl&0x00e0;
     }while(sl<0xa0);
     writeFM(0x04,0x82);
     }

 }

 void FMdelay(int time)

 { int i;
   for(i=time;i>=0;i--)
   delayFM(5);
  }

 void FMsoundoff(int frequency,int block)

 {int fnh,fnl,block2,blfnh,kblfnh,key;
  fnh=frequency&0x00ff;
  fnh=fnh>>8;
  block2=block<<2;
  blfnh=fnh|block2;
  key=0x00;
  kblfnh=blfnh|key;
  writeFM(0xb0,kblfnh);
}

 void bar3Dpress(int left,int top,int right,int bottom)
{setfillstyle(SOLID_FILL,LIGHTGRAY);

 bar(left,top,right,bottom);

 setcolor(BLACK);

 line(left,top,left,bottom);

 line(left,top,right,top);

 setcolor(WHITE);

 line(right,top,right,bottom);

 line(left,bottom,right,bottom);

 }


 void bar3D(int left,int top,int right,int bottom)
{setfillstyle(SOLID_FILL,LIGHTGRAY);

 bar(left,top,right,bottom);

 setcolor(WHITE);

 line(left,top,left,bottom);

 line(left,top,right,top);

 setcolor(BLACK);

 line(right,top,right,bottom);

 line(left,bottom,right,bottom);

 }

 void initpiano()

 { writeFM(1,0);
   writeFM(8,0);
   writeFM(0xbd,0x00);
   writeFM(0x20+0,0x21);
   writeFM(0x20+3,0x11);
   writeFM(0x40+0,0x4c);
   writeFM(0x40+3,0x00);
   writeFM(0x60+0,0xd2);
   writeFM(0x60+3,0xd2);
   writeFM(0x80+0,0x32);
   writeFM(0x80+3,0x11);
   writeFM(0xe0+0,0x00);
   writeFM(0xe0+3,0x00);
   writeFM(0xc0+0,0x04);
  }
运行出来的没有声音哦,不知道是哪里不对,大大们帮我看看。
搜索更多相关主题的帖子: int 钢琴 void 例子 
2008-04-08 16:04
jdxhyuan
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2007-12-20
得分:0 
难道就没人知道?大侠们帮帮忙啊
2008-04-08 17:40



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-207813-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.201126 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved