用 Lua 控制 MIDI 合成器来播放自定义格式乐谱
用 Lua 控制 MIDI 合成器来播放自定义格式乐谱
- 作者: FreeBlues
- 最新: https://www.cnblogs.com/freeblues/p/9936844.html
说明: 本文是根据 七周七语言(卷2) 中的一个
Lua示例项目略加修改而来.
目录
项目介绍
这个项目通过 Lua 调用一个用 C++ 实现的 MIDI 接口库 RtMidi 来控制一个 MIDI合成器 播放自定义格式的乐谱, 来演示 Lua 跟 C 之间的代码交互.
首先用 C++ 作为宿主程序, 把 Lua 解释器嵌入其中, 接着用 C++ 封装了一个可供 Lua 脚本调用的 C++ 函数 midi_send, 这个函数通过调用 RtMidi 库中的 API 向 MIDI合成器 发送控制命令来播放音乐, 而音乐的来源则是我们用 Lua 自定义格式的乐谱, 由 Lua 将其解析转换为 MIDI 合成器 能够识别的格式.
环境准备
这个项目是跨平台的, 可以同时支持 Windows/macOS/Linux 平台, 本文只提供 macOS 上的实现, 其他两个平台也很简单, 其中 Lua 部分的代码不需要改变.
需要安装以下环境
- 包管理器
brew; - 编译工具
XCode或gcc; C sound项目的源码跟RtMidi;Lua和CMake;macOS下的MIDI合成器:SimpleSynth
我的环境上只缺 C sound 项目, RtMidi 以及 SimpleSynth, 前两个用 brew 安装, 命令如下:
- 添加
C sound项目的源代码
Air:midi admin$ brew tap kunstmusik/csound
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 2 taps (homebrew/core and homebrew/cask).
==> New Formulae
azure-storage-cpp i386-elf-binutils maven@3.5 node@10 shellz um
fluxctl i386-elf-gcc mesa ruby@2.4 sourcedocs
==> Updated Formulae
bdw-gc ✔ dartsim hebcal mitie sec
c-ares ✔
......
==> Deleted Formulae
corebird kibana@4.4 maven@3.0 maven@3.1 nethack4 ruby@2.2 taylor tcptrack
Error: Failed to import: /usr/local/Homebrew/Library/Taps/benswift/homebrew-extempore/extempore-llvm341.rb
extempore-llvm341: undefined method `sha1' for #<Class:0x000000011189d728>
==> Tapping kunstmusik/csound
Cloning into '/usr/local/Homebrew/Library/Taps/kunstmusik/homebrew-csound'...
remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 7 (delta 0), reused 3 (delta 0), pack-reused 0
Unpacking objects: 100% (7/7), done.
Tapped 3 formulae (34 files, 28.1KB).
Air:midi admin$
- 安装
RtMidi
Air:midi admin$ brew install rtmidi
==> Downloading https://homebrew.bintray.com/bottles/rtmidi-3.0.0.high_sierra.bottle.tar.gz
######################################################################## 100.0%
==> Pouring rtmidi-3.0.0.high_sierra.bottle.tar.gz
用 Lua 控制 MIDI 合成器来播放自定义格式乐谱的更多相关文章
- 自定义css样式结合js控制audio做音乐播放器
最近工作需求需要播放预览一些音乐资源,所以自己写了个控制audio的音乐播放器. 实现的原理主要是通过js调整audio的对象属性及对象方法来进行控制: 1.通过play().pause()来控制音乐 ...
- H5多媒体(用面向对象的方法控制视频、音频播放、暂停、延时暂停)
视频,音频播放器会是我们在工作中用到的一些h5新标签,它自带一些属性,比如暂停播放,快进快退,但是,我们经常不用原生的样式或者方法,我们需要自定义这些按钮来达到我们需要的样式,也需要我们自定义来实现一 ...
- 重新想象 Windows 8.1 Store Apps (90) - 通信的新特性: 通过 HttpBaseProtocolFilter 实现 http 请求的缓存控制,以及 cookie 读写; 自定义 HttpFilter; 其他
[源码下载] 重新想象 Windows 8.1 Store Apps (90) - 通信的新特性: 通过 HttpBaseProtocolFilter 实现 http 请求的缓存控制,以及 cooki ...
- HTML5 - 使用JavaScript控制<audio>音频的播放
有时我们需要使用js来控制播放器实现音乐的播放,暂停.或者使用js播放一些音效. 1,通过JavaScript控制页面上的播放器 比如把页面上添加一个<audio>用来播放背景音乐(由 ...
- 想控制GIF图片动画播放吗?试试gifffer.js
在线演示:http://www.gbtags.com/gb/demoviewer/3578/c6bec39a-61ae-4017-8e23-e0bc1eeb740f/example|index.htm ...
- MmSystem播放Wav格式声音
//MmSystem播放Wav格式声音 //MmSystem 支持 *.wav声音格式 snd ->SoundRecorderuses MmSystem; //引用MmSystem//播放系统声 ...
- 多浏览器播放wav格式的音频文件
html5的audio标签只在火狐下支持wav格式的音频播放,无法兼容IE和google , 使用audioplayer.js 基本上能支持大部分浏览器播放wav音频文件,经测试IE.火狐.googl ...
- opencv实例三:播放AVI格式视频
一.不带滚动条的视频读取播放. 1.原理介绍:视频的本质是一些静态的图像的集合,opencv可以不断读取视屏中的图片,显示,就可以实时的视频流进行处理了. 2.代码如下: /************* ...
- amr格式转mp3和直接播放amr格式的文件-sunziren
原创文章,转载请注明出处! 前言: amr作为一种高压缩比的音频格式,受到很多客户的青睐.本文主要涉及两部分的内容,一是amr如何转为mp3格式,二是如何直接播放amr格式的文件. 1. 如何使用Ja ...
随机推荐
- PRML读书笔记_绪论曲线拟合部分
一.最小化误差函数拟合 正则化( regularization )技术涉及到给误差函数增加一个惩罚项,使得系数不会达到很大的值.这种惩罚项最简单的形式采用所有系数的平方和的形式.这推导出了误差函数的修 ...
- visual studio 和 sql server 的激活密钥序列号
VS2010: YCFHQ-9DWCY-DKV88-T2TMH-G7BHP VS2013: BWG7X-J98B3-W34RT-33B3R-JVYW9 VS2015: 专业版:HMGNV-WCYXV- ...
- python之文件系统操作(os模块)
文件系统操作(os模块) import os file_name = "D:\\test_data\\1.txt" file_name_2 = "D:\\test_dat ...
- centOS7 修改DNS
#显示当前网络连接 #nmcli connection show NAME UUID TYPE DEVICE eno1 5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03 802 ...
- lvs逻辑卷详解
管理磁盘空间对系统管理员来说是一件重要的日常工作.一旦磁盘空间耗尽就需要进行一系列耗时而又复杂的任务,以提升磁盘分区中可用的磁盘空间.它也需要系统离线才能处理.通常这种任务会涉及到安装一个新的硬盘.引 ...
- String的实例化与static final修饰符
String两种实例化方式 一种是通过双引号直接赋值的方式,另外一种是使用标准的new调用构造方法完成实例化.如下: String str = "abcd"; String str ...
- Mysql 主从服务器数据同步
安装2台windows Server 服务器,分别安装Mysql,配置环境变量,完成安装确认在CMD窗口可以使用Mysql命令 在Master服务器上创建同步账号,确保Slave服务器能访问Maste ...
- 洛谷 P2345 奶牛集会 解题报告
P2345 奶牛集会 题目背景 MooFest, 2004 Open 题目描述 约翰的N 头奶牛每年都会参加"哞哞大会".哞哞大会是奶牛界的盛事.集会上的活动很 多,比如堆干草,跨 ...
- 软Raid5制作
以raid5为例: 1.添加4块磁盘要求:容量.转速.接口一样的硬盘. 2.创建分区并修改ID[root@localhost ~]# fdisk /dev/sdb[root@localhost ~]# ...
- cf609E Minimum Spanning Tree For Each Edge (kruskal+倍增Lca)
先kruskal求出一个最小生成树,然后对于每条非树边(a,b),从树上找a到b路径上最大的边,来把它替换掉,就是包含这条边的最小生成树 #include<bits/stdc++.h> # ...