用 Lua 控制 MIDI 合成器来播放自定义格式乐谱

说明: 本文是根据 七周七语言(卷2) 中的一个 Lua 示例项目略加修改而来.

目录

项目介绍

这个项目通过 Lua 调用一个用 C++ 实现的 MIDI 接口库 RtMidi 来控制一个 MIDI合成器 播放自定义格式的乐谱, 来演示 LuaC 之间的代码交互.

首先用 C++ 作为宿主程序, 把 Lua 解释器嵌入其中, 接着用 C++ 封装了一个可供 Lua 脚本调用的 C++ 函数 midi_send, 这个函数通过调用 RtMidi 库中的 APIMIDI合成器 发送控制命令来播放音乐, 而音乐的来源则是我们用 Lua 自定义格式的乐谱, 由 Lua 将其解析转换为 MIDI 合成器 能够识别的格式.

环境准备

这个项目是跨平台的, 可以同时支持 Windows/macOS/Linux 平台, 本文只提供 macOS 上的实现, 其他两个平台也很简单, 其中 Lua 部分的代码不需要改变.

需要安装以下环境

  • 包管理器 brew;
  • 编译工具 XCodegcc;
  • C sound 项目的源码跟 RtMidi;
  • LuaCMake;
  • 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

最新文章

  1. Android ExpandableGridView的实现
  2. Set和存储顺序
  3. SDWebImage缓存图片的机制(转)
  4. markdownpad2使用说明
  5. Oracle 常用命令
  6. bzoj1264
  7. linux下笔记本有线网卡&quot;未受管理&quot;
  8. LVS-DR集群搭建
  9. dlib人脸关键点检测的模型分析与压缩
  10. Java内存回收机制基础[转]
  11. c#默认类的修饰符。
  12. 测试驱动开发TDD(test drive development)
  13. spring+springmvc+hibernate 框架搭建
  14. Spark连接MongoDB之Scala
  15. Kubernetes持久化存储1——示例
  16. [bzoj4709][柠檬]
  17. canvas应用——将方形图片处理为圆形
  18. MySQL中int(M)和tinyint(M)数值类型中M值的意义
  19. 40个新鲜的 jQuery 插件,使您的网站用户友好
  20. Queue 实现生产者消费者模型

热门文章

  1. activiti engine.schema.update DB_SCHEMA_UPDATE_FALSE
  2. ubunut下使用kubeadm离线安装k8s1.9
  3. hadoop集群故障排除
  4. 软件破解入门(暴力破解CrackMe)
  5. Nginx PREACCESS阶段 如何限制每个客户端的并发连接数
  6. Linux管理用户和组
  7. ACG图片站\python爬虫\LAMP环境
  8. CSS覆盖公共样式中的某个属性
  9. [树链剖分]hihocoder1883
  10. 2.9 C++使用默认参数的构造函数