基于键盘与扬声器的电子琴设计

2023-05-16

1.功能需求

开发一个基于键盘和主机扬声器(小喇叭)的简易电子琴工具,同时它也可以自动的演奏指定的简谱文件。

 

通过调用计算机系统的API接口,导入kernel32.dll,调用相关的方法,开发基于键盘和扬声器的一个简易电子琴工具。主要是为了了解计算机操作系统中的相关API的知识,学会对API基本应用。

 

 

2.实验原理

引入[DllImport("kernel32.dll")]和[DllImport("winmm.dll")]。通过设置音频和时间间隔来播放声音。

[DllImport("kernel32.dll")]:是Windows 9x/Me中非常重要的32位动态链接库文件,属于内核级文件。它控制着系统的内存管理、数据的输入输出操作和中断处理,当Windows启动时,kernel32.dll就驻留在内存中特定的写保护区域,使别的程序无法占用这个内存区域。

[DllImport("winmm.dll")]:是Windows多媒体相关应用程序接口,用于低档的音频和游戏手柄。

 

3、实现代码

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

using System.Runtime.InteropServices;

namespace test1

{

    public partial class Form1 : Form

    {

        [DllImport("kernel32.dll")]

        public static extern bool Beep(int freq, int duration);        

        [DllImport("winmm.dll")]

        public static extern bool PlaySound(string pszSound, int hmod, int fdwSound);//播放windows音乐,重载

        //进入系统播放音乐  

        private void m_SystemPlayWav(string strPlayFile)

        {

            try

            {

                if (strPlayFile.Trim() == "")

                {

                    return;

                }

                int SND_FILENAME = 0x00020000;

                int SND_ASYNC = 0x0001;

                string strPath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;

                strPath = strPath + strPlayFile;

                PlaySound(strPath, 0, SND_ASYNC | SND_FILENAME);//播放音乐

            }

            catch (Exception ex)

            {

                MessageBox.Show("播放失败","提示");

            }

        }

        private void m_SystemStopPlayWav()

        {

            try

            {

                PlaySound(null, 0, 0x40 | 0x04 | 0x02);

            }

            catch (Exception ex)

            {

                MessageBox.Show("停止失败", "提示");

            }

        }   

        public Form1()

        {

            InitializeComponent();

        }  

        private void button2_Click(object sender, EventArgs e)

        {

            m_SystemPlayWav(comboBox1.SelectedItem.ToString());

        }

        private void button3_Click(object sender, EventArgs e)

        {

            m_SystemStopPlayWav();

        }

        private void button4_Click(object sender, EventArgs e)

        {

            Beep(400, 300);

        }

 

        private void button5_Click(object sender, EventArgs e)

        {

            Beep(500, 300); 

        }

        private void button6_Click(object sender, EventArgs e)

        {

            Beep(600, 300); 

        }

        private void button7_Click(object sender, EventArgs e)

        {

            Beep(700, 300); 

        }

        private void button8_Click(object sender, EventArgs e)

        {

            Beep(800, 300); 

        }

        private void button9_Click(object sender, EventArgs e)

        {

            Beep(900, 300); 

        }

        private void button10_Click(object sender, EventArgs e)

        {

            Beep(1000, 300); 

        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)

        {

            if (e.KeyCode == Keys.D1)

            {

                button4.BackColor = System.Drawing.Color.LightGreen; ;

                button4.PerformClick();

                button4.BackColor = System.Drawing.Color.Black;

            }

            if (e.KeyCode == Keys.D2)

            {

                button5.BackColor = System.Drawing.Color.LightGreen;

                button5.PerformClick();

                button5.BackColor = System.Drawing.Color.White;

            }

            if (e.KeyCode == Keys.D3)

            {

                button6.BackColor = System.Drawing.Color.LightGreen;

                button6.PerformClick();

                button6.BackColor = System.Drawing.Color.Black;

            }

            if (e.KeyCode == Keys.D4)

            {

                button7.BackColor = System.Drawing.Color.LightGreen;

                button7.PerformClick();

                button7.BackColor = System.Drawing.Color.White;

            }

            if (e.KeyCode == Keys.D5)

            {

                button8.BackColor = System.Drawing.Color.LightGreen;

                button8.PerformClick();

                button8.BackColor = System.Drawing.Color.Black;

            }

            if (e.KeyCode == Keys.D6)

            {

                button9.BackColor = System.Drawing.Color.LightGreen;

                button9.PerformClick();

                button9.BackColor = System.Drawing.Color.White;

            }

            if (e.KeyCode == Keys.D7)

            {

                button10.BackColor = System.Drawing.Color.LightGreen;

                button10.PerformClick();

                button10.BackColor = System.Drawing.Color.Black;

            }

            if (e.KeyCode == Keys.Enter)

            {

                button2.PerformClick();//enter键播放

            }

            if (e.KeyCode == Keys.Space)

            {

                button3.PerformClick();//space键停止

            }

        }   

    }

}

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于键盘与扬声器的电子琴设计 的相关文章

  • 阻塞队列-BlockingQueue

    对于Queue而言 xff0c BlockingQueue是主要的线程安全的版本 xff0c 具有阻塞功能 xff0c 可以允许添加 删除元素被阻塞 xff0c 直到成功为止 xff0c blockingqueue相对于Queue而言增加了
  • 线程池-ThreadPoolExecutor

    如果并发的线程数量很多 xff0c 并且每个线程都是执行一个时间很短的任务就结束了 xff0c 这样频繁创建线程就会大大降低系统的效率 xff0c 因为频繁创建线程和销毁线程需要时间 那么有没有一种办法使得线程可以复用 xff0c 就是执行
  • MySQL索引

    基础知识 索引是创建在表上的 xff0c 对数据库表中一列或多列的值进行排序的一种结构 xff0c 可以提高查询的速度 通俗的来说 xff0c 数据库中存储的数据比作字典的话 xff0c 索引就相当于是字典中的目录 如果没有索引 xff0c
  • ThreadPoolExecutor任务提交与停止流程及底层实现

    ThreadPoolExecutor任务提交 executor任务提交流程 通过查看源码可知 xff0c JUC下的Excutor接口仅提供了一个可执行方法executor public interface Executor Execute
  • RoboMaster步兵机器人简介

    RoboMaster步兵机器人简介 湖北工业大学 蔡饶 如下图所示 xff0c 设计的是一个基于麦克纳姆轮的四轮全向越障平台 xff0c 纵臂式独立悬挂 xff0c 搭载两轴云台和弹丸发射机构 xff0c 是大疆承办的RoboMaster机
  • makefile 完美教程

    简介 Makefile 是和 make 命令一起配合使用的 xff0c 很多大型项目的编译都是通过 Makefile 来组织的 我建立工程的方法有以下三点 xff1a 1 makefile xff1a 优点 xff1a 使用非常广泛 xff
  • Arrays与Collection中自定义Comparator接口配合lambda实现自定义sort

    问题 刷到一个算法题需要拼接数字组成一个最大数 xff0c 基本思想是高位比较 xff0c 相等比较下一位 xff0c 然后根据大小先拼接大的 xff0c 再拼接小的 xff0c 但是发现当存在多个数字高位相同时面临一个问题 xff0c 比
  • SpringBoot2常见问题总结帖

    1 启动Springboot主程序类后报错This application has no explicit mapping for error so you are seeing this as a fallback 解决办法 xff1a
  • 设计模式-五大创建型模式概念与实现

    设计模式 xff08 Design pattern xff09 代表了最佳的实践方案 xff0c 可以说它是一套被反复使用的 多数人知晓的 经过分类编目的 代码设计经验的总结 xff0c 通常被有经验的面向对象的软件开发人员所采用 Desi
  • 雪花算法原理及实现

    背景 分布式高并发的环境下 xff0c 最常见的就是每年双十一的十二点 xff0c 大量用户同时抢购同一商品 xff0c 毫秒级的时间下可能生成数万个订单 xff0c 此时确保生成订单ID的唯一性变得至关重要 此外 xff0c 在秒杀环境下
  • Nacos注册中心-服务注册、分级存储与配置管理

    项目代码 xff1a resumebb springcloud nacos 码云 开源中国 gitee com Nacos注册中心 SpringCloudAlibaba 推出了一个名为 Nacos 的注册中心 xff0c 在国外也有大量的使
  • Feign远程调用-自定义配置与性能优化

    介绍 利用RestTemplate发起远程调用的代码 xff1a String url 61 34 http userservice user 34 43 order getUserId User user 61 restTemplate
  • Ribbon负载均衡

    Ribbon介绍 Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具 xff0c 它基于Netflix Ribbon实现 通过Spring Cloud的封装 xff0c 可以让我们轻松地将面向服务的REST
  • RabbitMQ消息队列

    同步异步通讯 微服务间通讯有同步和异步两种方式 同步通讯 xff1a 就像打电话 xff0c 需要实时响应 异步通讯 xff1a 就像发邮件 xff0c 不需要马上回复 两种方式各有优劣 xff0c 打电话可以立即得到响应 xff0c 但是
  • Spring Boot集成Spring Security

    Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架 它提供了一组可以在Spring应用上下文中配置的Bean xff0c 充分利用了Spring IoC xff0c DI xf
  • 超分辨重建-Bicubic双三次线性插值opencv实现

    论文实验中经典方法Bicubic的Python实现 使用时更改文件夹 保存路径 重建倍数即可 import os import argparse import cv2 parse args parser 61 argparse Argume
  • opencv_contrib aruco源码

    https github com opencv opencv contrib tree master modules 最近使用了aruco模块 想看看aruco的源码是怎样实现的 在opencv源码中一直没找到aruco 原来 他隐藏在op
  • HTTP/WEB中常见的状态码大全

    HTTP 状态码分类 HTTP 状态码由三个十进制数字组成 xff0c 第一个十进制数字定义了状态码的类型 响应分为五类 xff1a 信息响应 100 199 成功响应 200 299 重定向 300 399 客户端错误 400 499 服
  • 低质量图像超分算法 SwinIR: Image Restoration Using Swin Transformer

    论文名称 xff1a SwinIR Image Restoration Using Swin Transformer 论文地址 xff1a https arxiv org abs 2108 10257 代码仓库 xff1a https gi
  • volatile关键字详解

    volatile的作用 volatile是一个轻量级的synchronized xff0c 一般作用于变量 xff0c 在多线程开发中保证了内存的可见性 相比于synchronized关键字 xff0c volatile关键字的执行成本更低

随机推荐

  • 矩阵连乘-动态规划

    xfeff xfeff 问题 xff1a 给定n个矩阵 xff1a A1 A2 An xff0c 其中Ai与Ai 43 1是可乘的 xff0c i 61 1 xff0c 2 xff0c n 1 确定计算矩阵连乘积的计算次序 xff0c 使得
  • 流水作业调度-算法设计

    问题描述 xff1a 算法描述 xff1a 具体代码 xff1a include lt stdio h gt include lt iostream gt using namespace std class Jobtype public i
  • 动态规划解决01背包问题

    问题描述 xff1a 简单的说就是容量为c的背包 xff0c 有n个物品 xff0c 物品i的重量为wi xff0c 其价值为vi xff0c 问要如何选择装入物品使得背包中物品总价值最大 xff1f xff08 在选择装入背包的物品时 x
  • 石子合并问题

    问题描述 xff1a 在一个圆形操场的四周摆放着n堆石子 xff0c 现在要将石子有次序的合并成一堆 xff0c 规定每次只能选取相邻的两堆石子合并成一堆新的一堆 xff0c 并将新的一堆石子数记为此次合并的得分 xff0c 要求设计一个算
  • 类与对象

    1 编写一个代表三角形的类 xff0c 其中三条边为三角形的属性 xff0c 并且封装有求三角形的面积和周长的方法 分别针对三条边为3 4 5 和7 8 9的两个三角形进行测试 程序代码 xff1a package ex5 public c
  • 抽象类与接口

    1 定义一个接口 xff0c 其中包含一个displa 方法用于显示信息 xff1a 通知类 xff0c 汽车类 xff0c 广告类 xff0c 均要实现该接口显示 通知内容 xff0c 汽车油量 和 广告信息 程序代码 xff1a pub
  • ArduSub SITL Ubuntu mavros环境搭建

    第一章 ArduSub SITL Ubuntu环境搭建 作者 xff1a 张玉梅 zhangym 64 pcl ac cn 1 1 安装过程 第一步 xff1a http ardupilot org dev docs building se
  • 继承与多态

    1 给Point类添加一下几个求两点间距离的多态方法 xff1a public double distance Point p public double distance int x int y public static double
  • css+js制作一个简易的播放器

    lt doctype html gt lt html gt lt head gt lt meta charset 61 34 UTF 8 34 gt lt meta name 61 34 Keywords 34 content 61 34
  • 图片轮播

    lt DOCTYPE HTML gt lt HTML gt lt HEAD gt lt META name 61 34 Generator 34 content 61 34 EditPlus 34 gt lt META name 61 34
  • 3d盒子

    lt DOCTYPE HTML gt lt HTML gt lt HEAD gt lt TITLE gt 旋转盒 lt TITLE gt lt meta charset 61 34 UTF 8 34 gt lt META name 61 3
  • 基于JavaScript之碰撞的小球

    lt DOCTYPE HTML gt lt HTML gt lt HEAD gt lt META name 61 34 Generator 34 content 61 34 EditPlus 34 gt lt META name 61 34
  • 排序、查找、链表、栈、队列等常见数据结构算法代码实现(C语言版)

    列举了一些数据结构常用算法的代码实现及注释讲解 xff0c 所有代码都自己进行过测试 xff0c 如有疑问请留言 插入排序 include lt stdio h gt typedef struct int key datatype void
  • Java分治法实现日程表

    算法描述 xff1a 设有n 61 2的k次个运动员要进行网球比赛 xff0c 现在要设计一个满足一下要求的比赛日程表 xff1a 每个选手必须要与其他n 1个选手各赛一次每个选手一天只能赛一次循环赛一共进行n 1天 日程表 1234567
  • Struts-标签使用

    1 form标签 表格标签 xff0c f可以用于提交数据 示例 xff1a lt 64 taglib prefix 61 34 s 34 uri 61 34 struts tags 34 gt lt html gt lt body gt
  • Struts-拦截器+通配符+客户端跳转

    1 通配符匹配 Product 表示所有以Product结尾的路径 xff0c 都会匹配在这个Action上 method 61 1 表示第一个通配符 如果访问的是addProduct就会调用add方法 如果访问的是listProduct就
  • Hibernate-基本操作

    1 数据插入 Hibernate可以使用for循环插入多个数据到数据库 示例 xff1a public class TestHibernate public static void main String args SessionFacto
  • 将视觉信息转换为mavros

    https github com thien94 vision to mavros blob master src vision to mavros cpp rosmsg show mavros msgs LandingTarget MAV
  • 分蛋糕+中间数

    问题描述 小明今天生日 xff0c 他有n块蛋糕要分给朋友们吃 xff0c 这n块蛋糕 xff08 编号为1到n xff09 的重量分别为a1 a2 an 小明想分给每个朋友至少重量为k的蛋糕 小明的朋友们已经排好队准备领蛋糕 xff0c
  • 基于键盘与扬声器的电子琴设计

    1 功能需求 开发一个基于键盘和主机扬声器 xff08 小喇叭 xff09 的简易电子琴工具 xff0c 同时它也可以自动的演奏指定的简谱文件 通过调用计算机系统的API接口 xff0c 导入kernel32 dll xff0c 调用相关的