`
poower
  • 浏览: 18032 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

MyPiano

DOS 
阅读更多
#include "stdio.h"
#include "conio.h"
#include <dos.h>
#include<graphics.h>
/*****
Key struct:
    position:x1,y1,x2,y2
    State:isdown
    white or black key:iswhite
    nearby key:lwbk,rwbk
*******/

typedef struct _Key{
    int x1;
    int y1;
    int x2;
    int y2;
    int isdown;
    int iswhite;
    int lwbk;
    int rwbk;
} Key;

/*****
static grobal Variables statement:
    7 white keys:wk[7]
    5 black keys:bk[5]
    width,height:kw,kh
    frequant:frequ[8]
    pcfrequant:pcfre
    keynum
    count
*******/
static wknum=14;
static Key wk[14];
static bknum=10;
static Key bk[10];
static int kw=32,kh=160;
static int leftwidth=2*32;
int frequ[8]={262, 294, 330, 349, 392, 440, 494, 524};
static long int pcfre=1190000;
static int keyindex;
static int count;

/*****
function statement:
    makesound():
    initkey();
    change key state:setup(),setdown()
    initdrawkey();
*******/


void makesound();
Key set(int x1,int w,int h);
void setup(Key *k);
void setdown(Key *k);
void keyinit();
void initdrawkey();

/*initkey*/
Key initset(int x1,int w,int h,int isw,int lwbk,int rwbk){
    Key k;
    k.x1=x1;
    k.y1=0;
    k.x2=x1+w;
    k.y2=h;
    k.isdown=0;
    k.iswhite=isw;
    k.lwbk=lwbk;
    k.rwbk=rwbk;

    return k;
}
/*keyinit()*/
void keyinit(){

    wk[0]=initset(leftwidth+0*kw,kw,kh,1,-1,0);
    wk[1]=initset(leftwidth+1*kw,kw,kh,1,0,1);
    wk[2]=initset(leftwidth+2*kw,kw,kh,1,1,-1);
    wk[3]=initset(leftwidth+3*kw,kw,kh,1,-1,2);
    wk[4]=initset(leftwidth+4*kw,kw,kh,1,2,3);
    wk[5]=initset(leftwidth+5*kw,kw,kh,1,3,4);
    wk[6]=initset(leftwidth+6*kw,kw,kh,1,4,-1);
    wk[7]=initset(leftwidth+7*kw,kw,kh,1,-1,6);
    wk[8]=initset(leftwidth+8*kw,kw,kh,1,6,7);
    wk[9]=initset(leftwidth+9*kw,kw,kh,1,7,-1);
    wk[10]=initset(leftwidth+10*kw,kw,kh,1,-1,8);
    wk[11]=initset(leftwidth+11*kw,kw,kh,1,8,9);
    wk[12]=initset(leftwidth+12*kw,kw,kh,1,9,10);
    wk[13]=initset(leftwidth+13*kw,kw,kh,1,10,-1);


    bk[0]= initset(leftwidth+kw-kw/4,kw/2,kh/2,0,0,1);
    bk[1]= initset(leftwidth+kw*2-kw/4,kw/2,kh/2,0,1,2);
    bk[2]= initset(leftwidth+kw*4-kw/4,kw/2,kh/2,0,3,4);
    bk[3]= initset(leftwidth+kw*5-kw/4,kw/2,kh/2,0,4,5);
    bk[4]= initset(leftwidth+kw*6-kw/4,kw/2,kh/2,0,5,6);

    bk[5]= initset(leftwidth+kw*8-kw/4,kw/2,kh/2,0,7,8);
    bk[6]= initset(leftwidth+kw*9-kw/4,kw/2,kh/2,0,8,9);
    bk[7]= initset(leftwidth+kw*11-kw/4,kw/2,kh/2,0,10,11);
    bk[8]= initset(leftwidth+kw*12-kw/4,kw/2,kh/2,0,11,12);
    bk[9]= initset(leftwidth+kw*13-kw/4,kw/2,kh/2,0,12,13);
}

/*draw black key*/
void drawblackkey(Key *k){
     if(!(*k).isdown){
        setfillstyle(SOLID_FILL,DARKGRAY);
        bar((*k).x1,(*k).y1,(*k).x2,(*k).y2);

    }
    else{
        setfillstyle(SOLID_FILL,LIGHTBLUE);
        bar((*k).x1,(*k).y1,(*k).x2,(*k).y2);

    }
   
}
/*draw white key*/
void drawwhitekey(Key *k){
    if(!(*k).isdown){
        setfillstyle(SOLID_FILL,WHITE);
        bar((*k).x1,(*k).y1,(*k).x2,(*k).y2);
        setcolor(DARKGRAY);
        rectangle((*k).x1,(*k).y1,(*k).x2,(*k).y2);
        /*draw nearby key*/
        if(!(*k).lwbk>-1){
           drawblackkey(&bk[(*k).lwbk]);
        }
        if(!(*k).rwbk>-1){
           drawblackkey(&bk[(*k).rwbk]);
        }
    }
    else{
        setfillstyle(SOLID_FILL,LIGHTBLUE);
        bar((*k).x1,(*k).y1,(*k).x2,(*k).y2);
        setcolor(DARKGRAY);
        rectangle((*k).x1,(*k).y1,(*k).x2,(*k).y2);
        /*draw nearby key*/
        if(!(*k).lwbk>-1){
           drawblackkey(&bk[(*k).lwbk]);
        }
        if(!(*k).rwbk>-1){
           drawblackkey(&bk[(*k).rwbk]);
        }
    }
}
/*setdown() and setup()*/
void setdown(Key *k){
    (*k).isdown=1;
    if((*k).iswhite)
        drawwhitekey(k);
    else
        drawblackkey(k);
}
void setup(Key *k){
   (*k).isdown=0;
   if((*k).iswhite)
        drawwhitekey(k);
    else
        drawblackkey(k);
}

 /*initdrawkey()*/
void initdrawkey(){
    int gdriver,gmode,i;

    gdriver=DETECT;
    initgraph(&gdriver,&gmode,"c:\\tc");
    setbkcolor(YELLOW);
    cleardevice();

    for(i=0;i<wknum;i++){
        setfillstyle(SOLID_FILL,WHITE);
        bar(wk[i].x1,wk[i].y1,wk[i].x2,wk[i].y2);
        setcolor(DARKGRAY);
        rectangle(wk[i].x1,wk[i].y1,wk[i].x2,wk[i].y2);

    }
    for(i=0;i<bknum;i++){
        setfillstyle(SOLID_FILL,DARKGRAY);
        bar(bk[i].x1,bk[i].y1,bk[i].x2,bk[i].y2);
    }
}
 /*makesound()*/
void makesound(){
    count=(int)(pcfre/frequ[keyindex]);
    asm mov al, 10110110b
    asm out 43h, al

    asm mov ax,count

    asm out 42h, al
    asm mov al, ah
    asm out 42h, al

    asm in  al, 61h
    asm or  al, 03h
    asm out 61h, al

    delay(0xfffff000);
   
    asm in  al, 61h
    asm and al, 11111100b
    asm out 61h, al
}


void main(){
    keyinit();
    initdrawkey();

    settextstyle(4, 0, 10);
    outtextxy(200, 230, "Interface Principle Course Design");
    outtextxy(200, 250, "------------Piano----------------");
    outtextxy(200, 270, "-------Input 1...7 Play----------");
    outtextxy(200, 290, "-------Input CTRL+C Exit---------");
    outtextxy(200, 310, "-------Auther:Ying Wenjie--------");
    outtextxy(200, 340, "---------Date:2008-7-3-----------");
    while(1){
        keyindex=getch();
        if(keyindex==3)
            break;

        keyindex=keyindex-0x30;
        if(keyindex<1||keyindex>8)
            continue;
        keyindex--;
        setdown(&wk[keyindex]);

        makesound();
        setup(&wk[keyindex]);
    }
}
分享到:
评论

相关推荐

    MyPiano小钢琴

    NULL 博文链接:https://603533091.iteye.com/blog/2252616

    Mypiano.rar

    电子琴Mypiano电子琴程序,可鼠标点击弹奏,亦可键盘弹奏,里边已经提供了3个小曲子:小星星、粉刷匠和外婆的澎湖湾。可以根据音调和音的长短写代码编曲

    mypiano.rar

    初学的as3代码编写,效果不太理想,请与批评指正

    MyPiano_java_钢琴_

    安卓手机演奏钢琴曲的小应用源码,内置四首歌曲的琴谱,从A到M都能发出不同的钢琴键音

    MyPiano--小鸟呆呆作品

    很简单的一个应用现成Flash做的 弹钢琴小软件

    mypiano_chung:使用bass.dll的虚拟原声钢琴-开源

    mypiano chung 是一款免费的开源小型高品质 MIDI 虚拟原声钢琴,使用 bassdll bass.dll 和 gui_chung。 它是用 freebasic 编写的,作为一个独立的应用程序运行。 它是用智能手机在 Isabelle 的真正立式钢琴上录制的...

    PIMPS Is My Piano Superstar-开源

    PIMPS是我的钢琴Superstar是一款用Java开发的游戏,用于通过与您的PC或Mac连接的MIDI键盘学习钢琴。 任何Midi文件都可以与它一起使用,使您可以学习和单独播放每个音轨或一起播放。

    汇编课设!绝对能用!!!!!

    A my piano B my music X exit 选择X键结束程序运行。 选择A进入八度音程的钢琴程序,按数字键‘1’——‘8’演奏八度音,按esc键清屏返回上级菜单。 选择B进入音乐程序,出现界面如下: A Mary had a little ...

    电子钢琴源码

    MyPiano,开源, android studio 开发的, 导入就可以修改。

    pianoscore_chung:midiscore_chung 的低音虚拟钢琴版本-开源

    pianoscore chung 是一款免费的低音虚拟钢琴 mypiano,它是 midiout 版本的 midiscore_chung 一步一步的 midi 作曲程序。 它在伊莎贝尔的真正立式钢琴上用智能手机录制的小型简单 mypiano_chung 虚拟原声钢琴中使用 ...

    pianoscore_chung:低音虚拟钢琴版midiscore_chung-开源

    pianoscore chung是一款免费的低音虚拟钢琴mypiano,它是midiscore_chung的midiout版本,可逐步进行midi合成程序。 它使用智能手机在Isabelle的真正立式钢琴上录制的小型简单mypiano_chung虚拟原声钢琴中使用bassdll...

    minimidi_chung , 2 & DLL-开源

    minimidi2_chung是mypiano_chung的bass dll bass.dll版本,带有使用智能手机在Isabelle立式钢琴上录制的虚拟原声钢琴。 混响,合唱和音量的大小会随着所弹奏音符的数量和延音开关的变化而变化,就像真正的钢琴一样...

    贺兰_电子钢琴 2.0.0(简单发布)

    我心永恒-My Heart Will Go On.piano2 星月神话.piano2 李煜《虞美人》词.piano2 梦中的婚礼.piano2 欢乐颂.piano2 此情可待-Right Here Waiting.piano2 水边的阿狄丽娜-Ballade for Adeline.piano2 秋日私语-A ...

    piano-keyboard:钢琴可读流组件

    querySelector ( '.my-piano' ) , //if omitted, element is createdrange : [ 'c4' , 'c#6' ] , //notes range, numbers or namesa11y : false //focusable & keyboard interactions} ) ;//eventskeyboard. on ( '...

    贺兰_电子钢琴 2.0.1(简单发布)

    我心永恒-My Heart Will Go On.piano2 星月神话.piano2 李煜《虞美人》词.piano2 梦中的婚礼.piano2 梦醒时分.piano2 欢乐颂.piano2 此情可待-Right Here Waiting.piano2 水边的阿狄丽娜-Ballade for Adeline.piano2...

Global site tag (gtag.js) - Google Analytics