钢琴软件c语言源代码,使用C语言编写钢琴小程序

网上搜索键盘钢琴,可以搜索到不少小游戏,最常玩的就是Flash小游戏,26个按键的。

后来想用C语言自己实现一个,没有界面~~控制台的。

原理很简单,先在控制台中获取按键事件,在按键事件中,开一个线程,这个线程就是专门用来播放键对应的音效mp3的。

为什么要用线程呢,因为直接按键播放的话,如果不把mp3播放完,就无法再播放同一mp3,用线程就没有这个问题了。

线程函数中,就是使用mciSendString函数,打开然后播放对应的mp3文件。

刚开始写完的时候很哈皮,可以弹奏了,从网上找了一些曲谱,弹的很开心,后来发现一个问题:

弹了一段时间后,再按键就没有声音了,几经周折,找到了问题的解决办法,在线程函数中,播放mp3后,Sleep一段时间,然后Close它。

因为每个key音都是3秒,所以Sleep时间就定为3000。

下面是代码:

#include

#include

#include

#include

#pragma comment ( lib, "Winmm.lib" )

/*

* 隐藏控制台光标

*/

void HideTheCursor()

{

CONSOLE_CURSOR_INFO cciCursor;

HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {

cciCursor.bVisible = FALSE;

SetConsoleCursorInfo(hStdOut, &cciCursor);

}

}

/*

* 播放线程

*/

unsigned _stdcall thread_play(LPVOID lpParam)

{

char sz_command[126] = {0};

char sz_cur_play[32] = {0};

/*打开mp3文件*/

sprintf(sz_command, "open \"key\\%c.mp3\" alias key_%c", (WORD)lpParam, (WORD)lpParam);

mciSendString(sz_command, 0, 0, 0 );

sprintf(sz_cur_play, "key_%c", (WORD)lpParam);

/*播放*/

sprintf(sz_command, "play %s", sz_cur_play);

mciSendString(sz_command, 0, 0, 0 );

/*3秒后关闭*/

Sleep(3000);

sprintf(sz_command, "close %s", sz_cur_play);

mciSendString(sz_command, 0, 0, 0);

return 0;

}

main()

{

/*标准输入句柄*/

HWND h_console_in;

/*输入记录*/

INPUT_RECORD input_rec;

DWORD res;

/*线程句柄*/

HANDLE h_thread_play = INVALID_HANDLE_VALUE;

unsigned id_thread_play;

printf("欢迎来到键盘钢琴!!\n\n");

HideTheCursor();

/*获取标准输入句柄,并设置为接受输入*/

h_console_in = GetStdHandle(STD_INPUT_HANDLE);

SetConsoleMode(h_console_in, ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT);

while (1)

{

/*读取一个输入*/

ReadConsoleInput(h_console_in, &input_rec, 1, &res);

/*刷新输入缓冲区*/

FlushConsoleInputBuffer(h_console_in);

/*输入事件为按键输入,且按键按下时*/

if (input_rec.EventType == KEY_EVENT && input_rec.Event.KeyEvent.bKeyDown == TRUE)

{

/*输入的是A-Z之间的按键*/

if (input_rec.Event.KeyEvent.wVirtualKeyCode >= 'A'

&& input_rec.Event.KeyEvent.wVirtualKeyCode <= 'Z')

{

/*将当前按键作为参数,开线程*/

h_thread_play = (HANDLE)_beginthreadex(NULL, 0, &thread_play,

(void *)input_rec.Event.KeyEvent.wVirtualKeyCode, 0, &id_thread_play);

}

}

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
软件简介』 "鹤望兰·流 - 电子钢琴" 是由鹤望兰·流开发的用电脑的声卡、键盘、鼠标来模拟电子钢琴的绿色免费软件。本软件能够在电脑上全面模拟电子钢琴的弹奏效果,其界面逼真,操作简单,使用方便。 本软件主要有三个功能:手动弹奏、自动弹奏、录制和回放。您可以自由弹奏乐曲,也可以将曲谱按规则编辑成文件,再用本软件打开文件,让本程序自动为您弹奏,还可以将弹奏过程录制下来,即时回放弹奏过程,或保存为录制乐谱文件(.pianoR 文件),再打开此类文件进行播放,可以让您更好的了解您的弹奏情况改进弹奏技巧。自动弹奏专用的文件格式为——.piano2 文件,您可以方便的把乐曲乐谱翻译成此格式的文件,让本软件自动为您弹奏,您还可以在文件中为乐谱添加歌词,弹奏时可以同步显示歌词。 此外,程序还自带了多个乐谱文件,如: Beyond The Sea(拉梅尔).piano2 C大调卡农.piano2 C大调卡农2.piano2 Endless Love.piano2 Kiss the Rain.piano2 Kiss the Rain2.piano2 《卡农变奏曲》.piano2 《童话》钢琴简谱.piano2 一千零一夜.piano2 不是因为寂寞才想你.piano2 化蝶.piano2 午后的出发-午后的旅行.piano2 卡农-Canon.piano2 后来.piano2 夜的钢琴曲(五).piano2 天空之城完美简单版.piano2 天空之城完美简单版2.piano2 婚礼进行曲.piano2 我心永恒-My Heart Will Go On.piano2 星月神话.piano2 李煜《虞美人》词.piano2 梦中的婚礼.piano2 梦中的婚礼2.piano2 梦醒时分.piano2 欢乐颂.piano2 此情可待-Right Here Waiting.piano2 水边的阿狄丽娜-Ballade for Adeline.piano2 秋日私语-A Comme Amour.piano2 童话.piano2 第一次.piano2 美丽的神话.piano2 致爱丽丝.piano2 荷塘月色.piano2 调试计时器中的信息《卡农变奏曲》.piano2 追梦人.piano2 追梦人(无歌词,带和弦).piano2 雪中情.piano2 她非常小巧,只有一个可执行文件,不需要安装,功能非常强大,界面简洁、美观大方,完全免费,开放源代码。 『主要功能』 1、用电脑的声卡、键盘、鼠标来模拟电子钢琴支持鼠标、键盘操作,操作与声音同步,没有延迟。 2、支持手动弹奏、自动弹奏、录制和回放,支持和弦。 3、支持一百多种不同音色选择。 4、开发了一种专用的文件格式——.piano2 文件(电子钢琴乐谱文件)。 5、编辑乐谱文件,可自动为您弹奏,支持左右手谱子同步弹奏,且弹奏时可以同步显示歌词。 6、自带了多个乐谱文件。 7、完全免费使用,开放源代码。 8、更多,期待您的发现…… 『联系方式』 如果大家有什么好的歌曲请回复到我的空间,我会不定期更新乐谱, 对于支持喜欢本软件和提供歌曲的朋友表示真挚的感谢! 对于提出建议的朋友,我只能说我会尽力的完善和更新软件 谢谢大家。。。。。。。。。谢谢! QQ:252461539 E-Mail:[email protected] 主页:http://hewanglan.ys168.com 『更新历史』 ------------------------------------------------------------------------- 2.0.5 2013-11-08~12 ------------------------------------------------------------------------- 1、修正暂停时拖动进度条导致后续无法暂停或停止的问题!(2013-11-08) 2、暂停时,增加进度条微调功能,可以一次调节一行!(2013-11-08) 3、增加对黑键上的音符的表示方法。 如:.b2 / .#1;.b2;.#1。它们对应于同一个音。 在编辑乐谱文件时,可以选用任意一个,减少了乐谱编辑的麻烦。 但录制乐谱时,程序只会使用第一个表示方法。(2013-11-08) 4、增加钢琴键盘按键按下、弹起的事件响应。(2013-11-12) ------------------------------------------------------------------------- 2.0.4 2013-11-06 ------------------------------------------------------------------------- 1、优化代码,修正小问题!(2013-11-06) 2、改用高精度计时器(1毫秒级别的,修正了原计时器控件问题。)播放。 若传入命令行参数设置计时器间隔为1毫秒,左右手谱同步问题已基本解决! 一般自动识别,若是左右手谱,自动设置为1毫秒!(2013-11-06) 3、增加全部命令行参数演示批处理文件。(2013-11-06) 未完成: 3、录制过程也可改用计时器,可记入休止符?! 4、增加自定义键盘按键设置!电脑键盘图片资源已准备好。(工作量似乎不小!) ------------------------------------------------------------------------- 2.0.3 2013-11-04~05 ------------------------------------------------------------------------- 1、优化代码!(2013-11-04) 2、修正暂停播放时手动弹奏无法发声的问题。(2013-11-05) 3、特别注意:播放乐谱采用全新的机制! 左右手谱基本能同步播放了! 正在播放时无法退出程序的问题也解决了。 同步问题,采用高精度计时器(1毫秒级别的)可能会有所改善!(2013-11-05) ------------------------------------------------------------------------- 2.0.2 2013-11-02~ ------------------------------------------------------------------------- 1、修正录制过程中改变乐器(声音)无效的问题!(2013-11-02) 2、左右手谱的一次播放,但是,程序占用系统资源高, 而且,左右手谱子的同步有点问题!左手谱子没有进度条显示,进度条也不能拖动! 通过打开文件对话框打开的谱子,也无法播放左手谱内容!(2013-11-02) ------------------------------------------------------------------------- 2.0.1 2013-10-31, 2013-11-01~02 ------------------------------------------------------------------------- 1、再增加调试信息,播放、录制时显示按键时间。(2013-10-31) 2、添加几个乐谱。(2013-10-31) 3、特别:增加钢琴白键、黑键按下时的颜色设置属性!!!(2013-10-31) 4、支持将钢琴上88个键分成左右手的,左右手的键按下时颜色可分别设置。(2013-11-01) 5、完善录制过程,支持录制过程即时回放!(2013-11-02) 6、左右手谱的一次同步播放?未完成!!! ------------------------------------------------------------------------- 2.0.0 2013-10-29~30 ------------------------------------------------------------------------- 1、优化乐谱弹奏过程(按键弹起)。(2013-10-29) 2、补充对.piano2文件格式的说明。(2013-10-29) 3、尝试改用高精度计时器,想解决左右手谱子同步问题,依然不行! 看来问题在延时函数,不在计时器?!(2013-10-29) 4、增加录制功能,可将手动弹奏过程录制成文件(.pianoR),供下次回放。 注意:录制只考虑键按下弹起之间的时间间隔,中间的停顿不计入录制文件。 录制某些时候可能因按键时间太短,有一些失真(播放时速度很快)。 (2013-10-29~30) ------------------------------------------------------------------------- 1.0.5 2013-10-27~ ------------------------------------------------------------------------- 1、增加调试模式显示信息量(拍子,速度)。(2013-10-27) 2、增加乐谱编辑说明(拍子强弱,和弦)。(2013-10-27) ------------------------------------------------------------------------- 1.0.4 2013-10-24~25 ------------------------------------------------------------------------- 1、修正正在播放时拖入新乐谱文件乐器、曲调可能不正确的问题!(2013-10-24~25) 2、修正暂停标签显示问题!(2013-10-24) 3、增加在窗体其他位置按下鼠标可拖动窗体移动功能。(2013-10-25) 4、增加命令行参数:-Top 让程序在前段显示。(2013-10-25) 5、增加调试模式,可显示一些信息。(2013-10-25) 6、修正进度百分比显示的小问题。(2013-10-25) ------------------------------------------------------------------------- 1.0.3 2013-10-24 ------------------------------------------------------------------------- 1、整理代码,程序改名,恢复命令行参数:/T t 。 正在播放时,无法关闭程序!播放线程问题!!!(2013-10-24) 2、重新用 Timer 控件播放!(2013-10-24) ------------------------------------------------------------------------- 1.0.2 2013-10-23~24 ------------------------------------------------------------------------- 1、不用 Timer 控件播放,改用循环播放!解决左右手谱不同步问题? 还是无法解决,计时误差?!且现在窗体某些动作事件会打断播放?! 正在播放时,无法关闭程序!!!(2013-10-23) 2、修正音符行数问题。(2013-10-23) 3、整理代码,去掉命令行参数:/T t 。(2013-10-23) 4、添加几个乐谱。(2013-10-24) ------------------------------------------------------------------------- 1.0.1 2013-10-21~23 ------------------------------------------------------------------------- 1、添加乐谱编辑说明和几个乐谱。(2013-10-21) 音符强弱定义.txt 后来.piano2 致爱丽丝.piano2 童话.piano2 2、一曲完毕后,自动从头再来。(2013-10-22) 3、打开 .piano2 文件出错(编谱有误),显示错误的行号,行的文字内容, 方便查找改正!(2013-10-22) 4、修正拖动进度条时当前播放时间显示不正确的问题。(2013-10-22) 5、增加命令行参数的处理,为了同时启动多个进程弹奏左右手都有的谱子? 弹奏还是不同步!!!(2013-10-22) 命令行参数: -debug (调试模式) /F ".piano2文件完整路径" /C n /X x /Y y /T t n:频道值,0~15;x,y:窗体左上角坐标(x,y); t:最小时间间隔,毫秒。与其他参数不同,在程序运行中会一直使用此值! 各个参数可以单独出现,顺序不限! 6、修改音符时值计算,支持直接输入多少拍(用(b)表示,b代表多少拍。) 主要用于简谱弧线下的音符相同时,人工计算需要弹多少拍。(2013-10-23) 7、增加进度显示,可显示播放多少行,百分比。(2013-10-23) ------------------------------------------------------------------------- 1.0.0 2013-10-06~2013-10-20 ------------------------------------------------------------------------- 相比 电子钢琴 Ver 1.0.3 钢琴键盘,更加美观,做成控件,控件大小布局更方便; 乐谱模型,更加准确,音符时值计算更好,支持几个音同时弹奏(几个键同时按下),每个音符的强弱也能体现; 音调变化,12个大调,变调时,键位更加生动具体; 乐谱编辑说明,更有调理,并附实例。 频道数,变为16个(0~15)。 参考资料:MIDI音乐知识,2个VB MIDI钢琴代码,读取乐谱文件功能源码,虞美人简线对照谱。 附:电脑键盘按键不能改变设置,默认使用 电子钢琴 Ver 1.0.3 的默认按键设置。 乐谱播放控制功能不完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值