用 Lua 控制 MIDI 合成器来播放自定义格式乐谱
2024-10-13 18:52:02
用 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
最新文章
- Android ExpandableGridView的实现
- Set和存储顺序
- SDWebImage缓存图片的机制(转)
- markdownpad2使用说明
- Oracle 常用命令
- bzoj1264
- linux下笔记本有线网卡";未受管理";
- LVS-DR集群搭建
- dlib人脸关键点检测的模型分析与压缩
- Java内存回收机制基础[转]
- c#默认类的修饰符。
- 测试驱动开发TDD(test drive development)
- spring+springmvc+hibernate 框架搭建
- Spark连接MongoDB之Scala
- Kubernetes持久化存储1——示例
- [bzoj4709][柠檬]
- canvas应用——将方形图片处理为圆形
- MySQL中int(M)和tinyint(M)数值类型中M值的意义
- 40个新鲜的 jQuery 插件,使您的网站用户友好
- Queue 实现生产者消费者模型
热门文章
- activiti engine.schema.update DB_SCHEMA_UPDATE_FALSE
- ubunut下使用kubeadm离线安装k8s1.9
- hadoop集群故障排除
- 软件破解入门(暴力破解CrackMe)
- Nginx PREACCESS阶段 如何限制每个客户端的并发连接数
- Linux管理用户和组
- ACG图片站\python爬虫\LAMP环境
- CSS覆盖公共样式中的某个属性
- [树链剖分]hihocoder1883
- 2.9 C++使用默认参数的构造函数