使用C语言编写钢琴小程序
更新时间:2020年4月25日 17:28 点击:1487
网上搜索键盘钢琴,可以搜索到不少小游戏,最常玩的就是Flash小游戏,26个按键的。
后来想用C语言自己实现一个,没有界面~~控制台的。
原理很简单,先在控制台中获取按键事件,在按键事件中,开一个线程,这个线程就是专门用来播放键对应的音效mp3的。
为什么要用线程呢,因为直接按键播放的话,如果不把mp3播放完,就无法再播放同一mp3,用线程就没有这个问题了。
线程函数中,就是使用mciSendString函数,打开然后播放对应的mp3文件。
刚开始写完的时候很哈皮,可以弹奏了,从网上找了一些曲谱,弹的很开心,后来发现一个问题:
弹了一段时间后,再按键就没有声音了,几经周折,找到了问题的解决办法,在线程函数中,播放mp3后,Sleep一段时间,然后Close它。
因为每个key音都是3秒,所以Sleep时间就定为3000。
下面是代码:
#include <stdio.h> #include <process.h> #include <windows.h> #include <Mmsystem.h> #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); } } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。
下一篇: C++遍历文件夹下所有文件的多种方法
相关文章
- 这篇文章主要为大家详细介绍了C语言实现放烟花的程序,有音乐播放,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-23
- 本篇文章主要介绍C语言中char的知识,并附有代码实例,以便大家在学习的时候更好的理解,有需要的可以看一下...2020-04-25
- 这篇文章主要介绍了详解如何将c语言文件打包成exe可执行程序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-25
- 这篇文章主要介绍了微信小程序 页面传值详解的相关资料,需要的朋友可以参考下...2017-03-13
- 这篇文章主要介绍了uniapp微信小程序:key失效的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-20
- free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
- 这篇文章主要介绍了C语言中计算正弦的相关函数总结,包括正弦和双曲线正弦以及反正弦的函数,需要的朋友可以参考下...2020-04-25
详解C语言中的rename()函数和remove()函数的使用方法
这篇文章主要介绍了详解C语言中的rename()函数和remove()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下...2020-04-25- 本文实例讲述了PHP常用的小程序代码段。分享给大家供大家参考,具体如下:1.计算两个时间的相差几天$startdate=strtotime("2009-12-09");$enddate=strtotime("2009-12-05");上面的php时间日期函数strtotime已经把字符串...2015-11-24
- 这篇文章主要为大家详细介绍了微信小程序自定义tabbar组件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-03-14
- 这篇文章主要介绍了微信小程序 二维码生成工具 weapp-qrcode详解,教大家如何在项目中引入weapp-qrcode.js文件,通过实例代码给大家介绍的非常详细,需要的朋友可以参考下...2021-10-23
- 这篇文章主要介绍了微信小程序 网络请求(GET请求)详解的相关资料,需要的朋友可以参考下...2016-11-22
- 这篇文章主要给大家介绍了关于微信小程序如何获取图片宽度与高度的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-10
- 这篇文章主要介绍了C语言中求和、计算平均值、方差和标准差的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-10
- 这篇文章主要介绍了Python爬取微信小程序通用方法代码实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-29
- 这篇文章主要介绍了微信小程序(应用号)开发新闻客户端实例的相关资料,需要的朋友可以参考下...2016-10-25
- 本篇文章主要讲解C语言 基本语法,这里提供简单的示例和代码来详细讲解C语言的基本语法,开始学习C语言的朋友可以看一下,希望能够给你带来帮助...2021-09-18
- 这篇文章主要介绍了微信小程序手势操作之单触摸点与多触摸点的相关资料,需要的朋友可以参考下...2017-03-13
- 这篇文章主要介绍了微信小程序 页面跳转传递值几种方法详解的相关资料,需要的朋友可以参考下...2017-01-16
- 这篇文章主要为大家详细介绍了微信小程序实现canvas分享朋友圈海报,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-21