使用C语言编写钢琴小程序

网上搜索键盘钢琴,可以搜索到不少小游戏,最常玩的就是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);
      }
    }
  }
}

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

您可能感兴趣的文章:

  • Java swing实现支持录音等功能的钢琴程序
  • 用Python制作简单的钢琴程序的教程
(0)

相关推荐

  • 用Python制作简单的钢琴程序的教程

    录一段音频,把它的音高改变50次并把每一个新的音频匹配到键盘的一个键位,你就能把电脑变成一架钢琴! 一段音频可以被编码为一组数值的数组(或者列表),像这样: 我们可以在数组中每隔一秒拿掉一秒的值来将这段音频的速度变成两倍. 如此我们不仅将音频的长度减半了,而且我们还将它的频率翻倍了,这样使得它拥有比原来更高的音高(pitch). 相反地,假如我们将数组中每个值重复一次,我们将得到一段更慢,周期更长,即音高更低的音频: 这里提供一个可以按任意系数改变音频速度的任意简单的Python函数: impo

  • Java swing实现支持录音等功能的钢琴程序

    今天给大家介绍一下Java实现钢琴的小程序,程序虽小,功能挺多,支持循环播放,录音等功能,首先简单介绍下源码结构: 先看看钢琴界面实现,添加相应滴监听事件: /* * @(#)MidiSynth.java 1.15 99/12/03 * * Copyright (c) 1999 Sun Microsystems, Inc. All Rights Reserved. * * Sun grants you ("Licensee") a non-exclusive, royalty free

  • 使用C语言编写钢琴小程序

    网上搜索键盘钢琴,可以搜索到不少小游戏,最常玩的就是Flash小游戏,26个按键的. 后来想用C语言自己实现一个,没有界面--控制台的. 原理很简单,先在控制台中获取按键事件,在按键事件中,开一个线程,这个线程就是专门用来播放键对应的音效mp3的. 为什么要用线程呢,因为直接按键播放的话,如果不把mp3播放完,就无法再播放同一mp3,用线程就没有这个问题了. 线程函数中,就是使用mciSendString函数,打开然后播放对应的mp3文件. 刚开始写完的时候很哈皮,可以弹奏了,从网上找了一些曲谱

  • C语言编写扫雷小程序

    本文实例为大家分享了C语言实现扫雷小程序的具体代码,供大家参考,具体内容如下 首先创建一个项目,建立一个头文件game.h,两个源文件game.c和test.c game.h代码片: #ifndef  __GAME_H__ #define  __GAME_H__ #include<stdio.h> #include<stdlib.h> #include<string.h> #define ROWS 10//行数 #define COLS 10//列数 #define M

  • 易语言编写登录小程序实例讲解

    我们首先来看下源码内容 .程序集 窗口程序集_启动窗口 .子程序 _按钮1_被单击 .如果真 (编辑框1.内容 = "" 或 编辑框2.内容 = "") 信息框 ("用户名或密码不能为空!", 0, , ) 编辑框1.获取焦点 () 标签3.可视 = 假 标签4.可视 = 假 返回 () .如果真结束 .如果真 (编辑框1.内容 = "123" 且 编辑框2.内容 = "123") 信息框 ("登

  • 易语言编写64位程序的方法

    今天小编给大家带来的是易语言怎么编写64位程序,希望能帮助到大家! 1.如果你同时在运行腾讯的游戏,它会自动屏蔽掉易语言编写的软件. 2.支持库问题,易语言本身的支持库是兼容所有系统的. 3.所以可能调用了其他支持库,这个我们需要留意一下哦! 4.模块问题,模块调用的命令,某些命令调用的DLL是64位不兼容的. 5.建议:优化一下代码,尝试右键以管理员身份运行. 总结:以上就是5个用易语言编写64位程序的步骤,感谢大家对我们的支持.

  • C语言实现关机小程序

    本文实例为大家分享了C语言实现关机小程序,立即关机和定时关机的具体代码,供大家参考,具体内容如下 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<windows.h> int main() { printf(" ===================\n");//菜单界面 printf(" 1.立刻关机\n"); print

  • 利用C语言编写“剪刀石头布”小游戏

    前言 大家好~ 我是一名C语言初学者,学了C语言基础后,我制作了一个小游戏:剪刀石头布. 希望大家能对我的思路和代码提出小Tips(eg.更简便的方法与程序) 我也会虚心接受大家的建议~ 一.游戏原理 "剪刀石头布"这个游戏,想必大家都很熟悉了. 两个人在玩游戏时,事先都不知道对方将要出什么,这中间存在着一种随机性. 而这种随机性相当于C语言里stdlib.h库中rand()函数,rand()函数用来产生随机数,因为rand是根据提供给srand()的种子值返回一个随机数,所以要使每次

  • typescript编写微信小程序创建项目的方法

    创建项目 在微信开发者工具创建项目,在语言中选择 TypeScript 改造项目 编辑 package.json 文件,修改 miniprogram-api-typings 和 typescript 版本 { "name": "miniprogram-ts-quickstart", "version": "1.0.0", "description": "", "scripts&

  • 用C语言实现扫雷小程序

    本文实例为大家分享了C语言实现扫雷小程序的具体代码,供大家参考,具体内容如下 扫雷程序的编写需要有清晰的思路,所以我们先要清楚扫雷的实现有几个功能模块让我们编写,再用主函数将功能结合在一起: //菜单函数//初始化数组函数//布雷函数//统计周围雷的个数//打印玩家棋盘//打印设计者棋盘//扫雷函数//避免第一次被雷炸死的函数//展开函数//判断玩家棋盘剩余未知区域的个数 根据这几点可以写出如下的头文件: #ifndef __GAME_H__ #define __GAME__H__ #inclu

  • 抖音上用记事本编写爱心小程序教程

    本文实例为大家分享了抖音上用记事本编写爱心小程序的具体代码,供大家参考,具体内容如下 先上一波效果图: 一颗旋转的小心心 七夕的前一天晚上,当我满怀期待的把这颗"爱心"展示给我女朋友的时候,我以为她会very..very..happy 但是..她和我说你给我颗大蒜干什么啊.. Why are you giving me a garlic.. 也就是那个时候,我突然觉得这真的像一颗大蒜哎 好啦,不多说了.直接上源代码: <!DOCTYPE html> <html lan

  • 易语言编写截屏程序制作教学

    现如今,各种软件包括Windows系统,都附带了截屏功能:但这一功能是如何实现的呢,接下来,让我们使用易语言编写一个可以截屏的程序吧. 1. 打开易语言,选择 新建: 选择 Windows窗口程序: 点击确认. 2.然后做出如图的程序外形. 3.选中保存钮 : 单击 事件处理子程序集: 选择 被单击,然后进入程序程序编辑窗口. 1.二:编写程序 首先,利用 快照 代码把屏幕上的内容取出: 然后放入图片框中以便查看. 2.然后回到按钮2(保存钮)的编辑窗口. 输入以下代码. 1.三:完成 利用 快

随机推荐