MIDI 音乐程序设计 (可以自己编曲的快乐)

2023-11-16

乐器数字接口(MIDI)简介

乐器数字接口(Musical Instrument Digital Interface,MIDI),是20世纪80年代初为解决电声乐器之间的通信问题而提出的,是电子乐器制造商们建立的通信标准,是电子乐器之间以及电子乐器与电脑之间的统一交流协议。从一个MIDI设备转送到另一个MIDI设备上去的数据就是MIDI消息(MIDI Message)。
例如,在电子钢琴上按下某个音符对应的键(称为开音),则产生一个MIDI消息,该消息记录了所按的键、力度;当松开所按的键时(称为关音),便产生另一个MIDI消息用以表示所松开的键及松开的速度。当然这些信息都是易编辑的。
显然,MIDI消息不是音频波形的数字化,而是一种电子乐谱。MIDI已成为编曲界最广泛的音乐标准格式,可称其为“计算机能理解的乐谱”。

MIDI音符编码

在这里插入图片描述
是不是看晕了,没关系,我在下面给出了简易版本,还容易编曲哦~(求赞赞)

enum枚举音符参数

enum Scale  //音阶参数
{
	Rest = 0, C8 = 108, B7 = 107, A7s = 106, A7 = 105, G7s = 104, G7 = 103, F7s = 102, F7 = 101, E7 = 100,
	D7s = 99, D7 = 98, C7s = 97, C7 = 96, B6 = 95, A6s = 94, A6 = 93, G6s = 92, G6 = 91, F6s = 90, F6 = 89,
	E6 = 88, D6s = 87, D6 = 86, C6s = 85, C6 = 84, B5 = 83, A5s = 82, A5 = 81, G5s = 80, G5 = 79, F5s = 78,
	F5 = 77, E5 = 76, D5s = 75, D5 = 74, C5s = 73, C5 = 72, B4 = 71, A4s = 70, A4 = 69, G4s = 68, G4 = 67,
	F4s = 66, F4 = 65, E4 = 64, D4s = 63, D4 = 62, C4s = 61, C4 = 60, B3 = 59, A3s = 58, A3 = 57, G3s = 56,
	G3 = 55, F3s = 54, F3 = 53, E3 = 52, D3s = 51, D3 = 50, C3s = 49, C3 = 48, B2 = 47, A2s = 46, A2 = 45,
	G2s = 44, G2 = 43, F2s = 42, F2 = 41, E2 = 40, D2s = 39, D2 = 38, C2s = 37, C2 = 36, B1 = 35, A1s = 34,
	A1 = 33, G1s = 32, G1 = 31, F1s = 30, F1 = 29, E1 = 28, D1s = 27, D1 = 26, C1s = 25, C1 = 24, B0 = 23,
	A0s = 22, A0 = 21
};
enum Voice //声调
{
	L1 = C3, L2 = D3, L3 = E3, L4 = F3, L5 = G3, L6 = A3, L7 = B3,
	M1 = C4, M2 = D4, M3 = E4, M4 = F4, M5 = G4, M6 = A4, M7 = B4,
	H1 = C5, H2 = D5, H3 = E5, H4 = F5, H5 = G5, H6 = A5, H7 = B5,
	LOW_SPEED = 500, MIDDLE_SPEED = 400, HIGH_SPEED = 300,
	_ = 0XFF
};

凭借上面的代码,你就可以调用来谱曲啦,还可以自己修改speed,以及_的数量得到节奏不同的音乐。

我们一起学猫叫

void Cats()
{
	HMIDIOUT handle;
	cout << "我们一起学猫叫~~~" << endl;
	cout << "\n\n我们一起学猫叫\n\n一起喵喵喵喵喵\n\n在你面前撒个娇\n\n哎呦喵喵喵喵喵\n\n我的心脏砰砰跳\n\n迷恋上你的坏笑\n\n你不说爱我我就喵喵喵\n\n";
	midiOutOpen(&handle, 0, 0, 0, 0);

	int volume = 0x7f;
	int voice = 0x0;
	int sleep = 150;
	int helloworld[] = {  // 声调
	 M1,_,M2,_,M3,_,L5,_,M1,_,M3,_,M3,_,_,_,
	 M2,_,M1,_,M2,_,M5,_,M5,_,M5,_,M5,_,_,_,
	 M1,_,L7,_,M1,_,M1,_,M1,_,M1,_,M1,_,_,_,
	 L7,_,M1,_,L7,_,M1,_,L7,_,L6,_,L5,_,_,_,
	 L5,_,L5,_,L6,_,L1,_,L4,_,L6,_,L6,_,_,_,
	 L5,_,L3,_,L5,_,L3,_,L5,_,M2,_,M1,_,_,_,
	 L5,_,M3,_,M3,_,M3,_,M4,_,M5,_,M1,_,M1,_,M2,M3,M2,_,_,_,_,_,_,_,
	};

	for (auto i : helloworld)
	{
		if (i == LOW_SPEED || i == HIGH_SPEED || i == MIDDLE_SPEED)
		{
			sleep = i;
			continue;
		}
		if (i == _)
		{
			Sleep(150);
			continue;
		}

		voice = (volume << 16) + (i << 8) + 0x90;
	
		midiOutShortMsg(handle, voice);
		Sleep(sleep);
	}

	midiOutClose(handle);

}

具体的音乐程序已经封装好放这里啦
MIDI音乐程序设计

可以看看效果
在这里插入图片描述

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

MIDI 音乐程序设计 (可以自己编曲的快乐) 的相关文章

  • 读取 MIDI 文件

    读取具有多个轨道的 MIDI 文件 按时间顺序 的最佳方法是什么 爪哇 注意 我不想播放 MIDI 文件 只想读取消息 情侣想法 是否可以安全地假设没有比 1 64 音符短的音符事件 或者我应该访问每个轨道并仅在所有其他刻度线之后移动到下一
  • 在 Flash 中播放 MIDI 文件

    有没有办法在Flash中播放MIDI文件 使用动作脚本 3 None
  • Python 中的节拍器脚本中的计时问题(使用 Pygame)[重复]

    这个问题在这里已经有答案了 我正在尝试编写一个节拍器脚本 它可以为我提供音频反馈并将 MIDI 消息发送到合成器 我用Python 2 7 5 and Pygame 1 9 1 release在 Linux Mint 16 上 我对 MID
  • ios - 混合 MIDI 文件,每个文件都有自己的声音字体

    我正在寻找一种方法来混合 2 个或更多 MIDI 文件 每个文件都有自己的声音字体文件 我找到了一个文件的以下代码 并尝试做多个音乐播放器 但我想这不应该是正确的方法 而且我每秒都会听到一些奇怪的流行声音 那么有没有其他方法 也许没有音乐播
  • Android 6.0+:使用新的 MIDI API 没有声音

    我正在使用新的 MIDI API为了播放一些 MIDI 音符 但是 我听不到任何声音 也没有抛出任何异常 其代码如下 initialising the MidiReceiver private MidiReceiver midiReceiv
  • Java停止MIDI播放

    您好 我有一个 Java 应用程序 它可以从序列中播放 MIDI 消息 我正在使用 jfugue 库执行此操作 问题是当我尝试使用停止按钮 调用sequencer stop 和sequencer close 停止播放时 最后播放的音符在整个
  • 无法使用partitionByInstrument将文件分成多个部分

    使用music21无法将文件分成使用partitionByInstrument from music21 import song converter parse Nottingham train ashover simple chords
  • 使用新创建的声音字体播放 MIDI 时,在通道 9 上找不到预设

    我用 Polyphone 创建了一个声音字体来创建一个新的乐器 bagana 它只有 1 件乐器 Bagana 以及 1 件礼物 Bagana 我尝试用 FluidSynth 播放 midi 文件 只是一首钢琴曲 它成功了 当我通过新的音前
  • 较新版本的 JRE 不会加载音库,但较旧版本会加载

    我有以下代码尝试加载音库 我已经使用 JRE 1 6 03 和 1 6 43 在 Windows 7 上测试了代码 旧版本的 JRE 1 6 03 工作正常 但新版本会引发异常 这是怎么回事 public Main try Synthesi
  • MidiSystem.getSequencer() 返回音频设备不可用

    我不断地抛出异常 当我尝试创建新的 Sequencer 对象时 我不断收到 javax sound midi MidiUnavailableException Audio Device Unavailable 异常 所以 这是代码 impo
  • music21:解析每首曲目的音符和持续时间

    我正在尝试使用 music21 将多轨 MIDI 文件转换为每个轨道的音符和持续时间数组 例如 给定一个包含 16 首曲目的 MIDI 文件 test mid 我想要获得 16 个元组数组 其中包含 音高 持续时间 加上音符的位置 musi
  • midi 文件解析,无法识别的事件类型

    我在尝试解析 MIDI 文件时遇到问题 我正在尝试解析 frets on fire 游戏使用的注释文件 它只使用 midi 文件 所以我认为这无关紧要 如果你们中的任何人熟悉它 我遇到的问题是一般的 midi 问题 我有一个文件 其中有一个
  • 2013 年的浏览器支持 Web MIDI API?

    有谁知道是否有支持 Web MIDI 的浏览器 我已经尝试过样品http webaudio github io web midi api http webaudio github io web midi api 但他们向我抛出一个错误 说我
  • Java 中的 MidiUnavailableException?

    我在 Java 中播放 MIDI 文件时遇到一些问题 我得到的是一个MidiUnavailableException MIDI OUT transmitter not available 当我尝试玩它时 我的代码是标准的 try midis
  • Java从MIDI键盘获取输入

    我用 java 设计了自己的合成器 现在想将它与 midi 键盘连接 我的下面的课程搜索所有具有发射器的 MIDI 设备 它成功找到了我的 MIDI 键盘 我将自己的接收器添加到每个设备的每个发射器中 以便它能够接收所有可能的信号 通过阅读
  • 确定 MIDI 文件的时间划分

    我正在用Python编写一个脚本来解析MIDI文件 是的 我知道Python存在MIDI解析库 但对于我的用例来说 如果我从头开始制作它是最简单的 我遇到的问题之一是时间划分 标头的最后两个字节指定时间划分 但我无法确定文件的时间划分是否以
  • 如何从我的 iOS 应用程序向 Mac 应用程序发送 MIDI 或 OSC 信号?

    我正在考虑编写一个 iPhone iPad 应用程序来模拟 MIDI 控制器 我知道已经有很多可用的 但我仍然想自己做 我对此有几个问题 我对 MIDI 了解一点 但最近听说了 OSC 显然 几乎所有 DJ 软件应用程序都支持 MIDI 但
  • 如何获取 MIDI 设备的当前状态?

    如何查询 MIDI 设备当前的程序状态 音量等 我试图在 Midi 规格中找到它 但没有成功 我基本上需要从通过 USB midi 连接的数码钢琴获取当前乐器 钢琴等 Java似乎可以做到 http docs oracle com java
  • 使用 javax.sound.midi 包设置乐器通道

    我在 javax sound midi 包中设置乐器时遇到问题 Synthesizer synthesizer MidiSystem getSynthesizer MidiChannel channels synthesizer getCh
  • AudioTrack 可以播放 MIDI 文件吗?

    我想知道AudioTrack Android可以播放MIDI文件吗 如果没有的话哪个库可以 因为我想要 Android 库 可以为我的应用程序播放和控制 MIDI 文件的速度 从这里检查 Android 支持的媒体格式Android 媒体支

随机推荐

  • 程设课终章:c++使用socket实现bmp图片的传输

    特别鸣谢 44条消息 C UDP发送接收文件 BMP 我不在你不在的博客 CSDN博客 里面一些概念 ip地址 电脑门牌号 端口号 做这件事的行动代号 协议 接收方和发送方都必须遵守的一种规则 socket是基于tcp ip协议发送数据技术
  • 【vue其他相关】欢迎讨论!异步请求放在生命周期中的created还是mounted,已填坑

    文章目录 前言 两个生命周期 场景1 场景2 场景3 结论 如何处理场景一和场景二的问题 最后 前言 曾经在百度上搜这个问题 看到的答案都是相互复制粘贴的 而且个人觉得并没具体场景举例说明 并没有好的答案 于是自己立贴 留下这个坑 等日后遇
  • vue循环生成div

    遇到了一个需求 需要展示一年12个月的日历 然后一行为一个div 需要循环生成4个div 刚开始我查了一下 不知道怎么入手 然后问了我一个做前端的同学 一分钟就解决了 代码如下 div div div style width 500px b
  • pb 判断timer是否在执行_FreeRTOS 之 Timer

    在 FreeRTOS 之任务调度 一文中提到 硬件定时器是和硬件设计相关的 不同的芯片有不同的配置方法 通过中断方式触发执行 精确度高 相对于硬件定时器 FreeRTOS 中还提供了软件定时器 本文就来聊聊软件定时器是如何实现的 以及它的精
  • 类加载器的父委托机制

    类加载器 类加载器用来把类加载到Java虚拟机中 类加载器的类型 有两种类型的类加载器 1 JVM自带的加载器 根类加载器 Bootstrap 扩展类加载器 Extension 系统类加载器 System 2 用户自定义的类加载器 java
  • spring异常Unsatisfied dependency expressed through constructor parameter 0

    异常信息 org springframework beans factory UnsatisfiedDependencyException Error creating bean with name xxx defined in file
  • 程序员如何在浏览器上面去做p图软件的事

    在浏览器中更改内容除了箭头点击元素进行更改还有另一种更快捷的方法 首先随便打开一个浏览器 按f12 打开控制台 在控制台内输入一下代码回车 document designMode on 开启这个网站修改模式之后你就可以随心所欲地去更改网站的
  • 深度、广度优先搜索

    文章目录 二 图的遍历 2 1 深度优先搜索 DFS DFS森林 应用 2 2 广度优先搜索 BFS 基本操作 应用 二 图的遍历 2 1 深度优先搜索 DFS DFS森林 Vertextype GetVex ALGraph G int v
  • ewiews面板回归模型操作_【视频教程】Eviews系列25

    点击上方关注我们 本期我们学习Eviews统计建模最后一部分 面板数据回归分析Hausman检验及本章常见问题解答 实操 Hausman检验判断是固定效应模型还是随机效应模型 上期我们讲到模型判断若选择模型2 需进一步通过Hausman检验
  • Qt: 信号与槽机制

    一 信号和槽机制是什么 1 Qt信号槽机制 是Qt的核心机制 它是Qt定义的一种对象间的通讯机制 且独立于标准C C 语言 2 信号 signals 当某个类对象发生内部改变时 发射 信号 随后与关联的 槽函数 被立即执行 信号槽机制 完全
  • Node快速切换版本、版本回退(降级)、版本更新(升级)

    场景 最近遇到一些node的坑 比如6 3 0版的node用不了公司最新的工作流 升级到10 x版的node后 又用不了另一套工作流 问题 怎么实现node版本降级 升级 是否可以安装多个版本按需要进行切换 解决方案 1 安装node版本管
  • 【FPGA项目】进阶版沙盘演练——报文收发(报文处理、CDC、CRC)

    前言 书接上文 FPGA项目 沙盘演练 基础版报文收发 子墨祭的博客 CSDN博客 前面我们做了基础版的报文收发 相信对逻辑设计有了一定的认知 在此基础上 继续完善一个实际报文收发可能会遇到的一些处理 报文处理 握手与反压 跨时钟域处理CD
  • 金币(代码)

    今天 先更一道题的代码 目录 题目描述 输入输出格式 输入格式 输出格式 样例 输入输出样例 1 输入 输出 输入输出样例 2 输入 输出 数据范围与提示 AC 代码 题目描述 国王将金币作为工资 发放给忠诚的骑士 第一天 骑士收到一枚金币
  • 什么是软连接,以及软连接在linux系统中的用法

    软连接是linux中一个常用命令 它的功能是为某一个文件在另外一个位置建立一个同步的链接 软连接类似与c语言中的指针 传递的是文件的地址 更形象一些 软连接类似于WINDOWS系统中的快捷方式 例如 在a文件夹下存在一个文件hello 如果
  • 微信小程序反编译微信小程序

    微信小程序反编译跳一跳 项目地址 https github com shunyue1320 decompile wx 反编译 wxapkg 文件 微信开发者工具打开
  • 【python】详解threading模块:Event类的使用

    测试代码 import threading import time event threading Event event set def func 1 print t1线程开启等待状态 event wait print t1线程并没有处于
  • 计算机网络-应用层

    1 概述 定义 为应用进程的通信提供服务 主要功能 文件传输 访问和管理 电子邮件 虚拟终端 查询服务和远程作业登录 重要协议 FTP SMTP POP3 HTTP DNS 应用层的两种模型 客户服务器模型 C S P2P模型 Peer t
  • 为什么使用Lambda表达式

    视频地址 https b23 tv gfH0PjR 在使用Lambda表达式之前 先看一下 匿名内部类的一个使用 匿名内部类详情 http t csdn cn nMZpB 匿名内部类 就是没有名字的一种嵌套类 它是Java对类的定义方式之一
  • java倒叙遍历list

    for int i list size 1 i gt 0 i System out println list get i
  • MIDI 音乐程序设计 (可以自己编曲的快乐)

    乐器数字接口 MIDI 简介 乐器数字接口 Musical Instrument Digital Interface MIDI 是20世纪80年代初为解决电声乐器之间的通信问题而提出的 是电子乐器制造商们建立的通信标准 是电子乐器之间以及电