`
poower
  • 浏览: 18583 次
  • 性别: 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小钢琴

    《MyPiano小钢琴》是一款基于编程开发的简易电子钢琴应用,主要面向对音乐有兴趣同时对编程有一定了解的用户。这个项目通常会涉及到以下几个重要的IT知识点: 1. **编程语言**:MyPiano的实现可能使用了某种编程...

    Mypiano.rar

    标题"Mypiano.rar"指的是一个压缩包文件,其中包含了名为"Mypiano"的电子琴程序。这个程序允许用户通过鼠标点击或键盘输入来模拟弹奏钢琴曲目。从描述来看,它内置了三首简单的儿童歌曲,分别是"小星星"、"粉刷匠"和...

    MyPiano--小鸟呆呆作品

    《MyPiano——小鸟呆呆作品》是一款基于Flash技术打造的简单易用的虚拟钢琴软件。这款应用利用了Adobe Flash的交互性和多媒体处理能力,为用户提供了一个轻巧且直观的平台,让他们能够在电脑上模拟弹奏钢琴。 在...

    mypiano.rar

    "mypiano.rar"这个压缩包就包含了一个初学者使用AS3尝试实现电子琴功能的代码项目。 AS3是Adobe Flash Professional和Flash Player支持的编程语言,它以其强大的性能和丰富的多媒体功能被广泛应用于游戏开发、动画...

    MyPiano_java_钢琴_

    【标题】"MyPiano_java_钢琴_"是一个基于Java编程语言开发的安卓应用程序,它允许用户在手机上模拟演奏钢琴。这个项目的核心是为安卓设备提供一个轻便、易用的钢琴模拟器,使用户能够体验到弹奏钢琴的乐趣。 【描述...

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

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

    piano.zip_piano

    本文将深入探讨名为"piano.zip_piano"的压缩包文件,其中包含了名为"My Piano 3.0"的源代码,这是一款钢琴游戏的核心组成部分。通过分析这款游戏的源代码,我们可以了解到开发一个钢琴模拟游戏的基本流程和技术要点...

    电子钢琴源码

    在这个项目中,我们讨论的是"MyPiano",一个开源的Android应用程序,由Android Studio进行开发。开源意味着源代码对公众开放,开发者可以查看、学习、修改和分发代码,这对于学习Android编程和音乐应用开发的初学者...

    Android钢琴游戏源码

    本篇将详细解析一款名为"MyPiano"的钢琴游戏源码,帮助读者深入理解Android游戏开发的核心技术和原理。 首先,Android钢琴游戏的核心在于音效处理和用户交互。在"MyPiano"源码中,我们可以看到开发者是如何通过...

    PIMPS Is My Piano Superstar-开源

    《PIMPS:让钢琴学习变得超级有趣》 在当今数字化的世界里,学习乐器的方式也逐渐创新,"PIMPS是我的钢琴Superstar"就是这样一款利用开源技术改变传统钢琴学习模式的创新应用。这款由Java语言编写的软件,将你的PC...

    基于matlab GUI的可编程电音合成器,有键盘,可以弹奏,还可以生成相应的曲谱,波形频谱都有

    在这个项目中,`MyPiano.fig`和`mymidi.fig`就是两个GUI界面的设计文件,它们定义了窗口布局、控件等元素。 2. **电音合成**: 电音合成是通过电子方式创建音乐的过程。MATLAB作为一个强大的计算平台,也支持音频...

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

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

    多媒体软件技术-电子琴.zip

    首先,我们看到的是一个名为"My Piano.exe"的可执行文件,这很可能就是我们所说的电子琴软件。在Windows操作系统中,.exe文件是程序的入口,用户可以通过双击运行它来体验电子琴的功能。这款软件可能具有模拟不同...

    【信号处理】模拟简易电子琴(英文版)含Matlab源码.zip

    3. **MyPiano.fig**: - 这个文件是Matlab的图形用户界面(GUI)文件,可能包含电子琴的用户界面设计,如按键布局、音量控制、音调选择等功能的界面元素。 4. **smile1.jpg**: - 可能是一个与项目相关的图片文件...

    android钢琴

    在项目实践中,"MyPiano1"可能是这个钢琴应用的初始版本,包含了应用的基础架构和部分功能实现。随着开发的深入,这个项目会逐渐完善,增加更多特色功能,如多音轨、录音、音乐分享等。 总的来说,“安卓钢琴”的...

Global site tag (gtag.js) - Google Analytics