18个版本
0.1.21 | 2020年11月13日 |
---|---|
0.1.20 | 2020年3月29日 |
0.1.13 | 2019年2月22日 |
#277 在 音频
每月52次下载
130KB
2.5K SLoC
Rusthesia
Rusthesia目前只是一个用于播放由Logic Pro/X创建的midi文件,并在钢琴上显示落下的音符的快速解决方案。
可以使用左右shift键实时将midi文件转换成半音。可以通过空格键暂停播放。
请注意:如果没有"-s"命令行选项,将不会显示窗口!
音频
未包含合成器。相反,midi消息将通过core audio发送。可以使用Logic Pro/X播放midi,但需要相应地设置。
对于其他操作系统没有想法,不知道是否工作以及如何操作。
视频
屏幕输出使用sdl2。
截图
准备
需要安装sdl2库。在macos上,可以通过以下方式完成:
brew install sdl2 sdl2_gfx sdl2_ttf
安装
cargo install rusthesia
使用方法
如有帮助,请执行
rusthesia -h
例如,midi文件 Marche_aux_Flambeaux.mid 已包含。根据该网站,此文件为公共领域。
首先列出可用的轨道
> rusthesia Marche_aux_Flambeaux.mid -l
Track 0:
Text: Creator: GNU LilyPond 2.8.7
Text: Generated automatically by: GNU LilyPond 2.8.7
Text: at Mon Oct 16 20:41:39 2006
Text: at Mon Oct 16 20:41:39 2006
Track name: Track 0
Track 1:
Track name: upper
Instrument name: accordion
Track 2:
Track name: lower
Instrument name: accordion
要播放和显示所有轨道,请使用
> rusthesia Marche_aux_Flambeaux.mid -p 0 1 2 -s 0 1 2
为了播放下方并仅显示上方,请使用以下命令
> rusthesia Marche_aux_Flambeaux.mid -p 1 -s 2
仅使用midi播放器功能,不进行图形输出
> rusthesia Marche_aux_Flambeaux.mid -p 1
要获取关于事件循环的定时调试标志的信息,可以添加
> rusthesia Marche_aux_Flambeaux.mid -p 1 -vvv -d eventloop
待办事项
待办事项列表在 projects 中管理
合成器
macos
Logic Pro/X
未能将Logic Pro/X用作分配给不同乐器的通道的合成器。仍将继续寻找所需隐藏功能。
MainStage
可以工作,但需要为每个通道创建一个带有键盘的音乐会,这不太方便。
连接的钢琴(Roland RD-64)和合成器
由于rusthesia允许我使用我的Roland RD-64作为输出,我已经尝试了。非常惊喜地发现它工作得相当好。甚至可以手动与歌曲一起演奏。
fluidsynth
使用fluidsynth也是一个不错的选择。
brew install fluid-synth
要播放还需要一个 soundfont .sf2 文件,可以从互联网上找到。使用以下命令启动合成器:
fluidsynth your_soundfound.sf2
现在可以启动 rusthesia,并且应该可以看到 MIDI 输出。
Available output ports:
0: IAC-Treiber IAC-Bus 1
1: FluidSynth virtual port (3776)
在这种情况下,只需输入 1。
Linux
根据 Samuel Da Mota 的信息,代码在 Linux 上运行正常。
不需要更改任何一行代码或配置。只需为您的项目安装 libsdl2-dev 和 libsd2-gfx-dev 软件包以进行构建。然后安装一个系统级的 MIDI 序列器,如 timidity,并运行它(使用 timidity -iA)来播放音乐。
同时,在 deepin Linux 上进行了尝试,据我所知,它基于 Debian。以下是编译时需要执行的步骤:
sudo apt install librtaudio-dev libsdl2-2.0 cmake libfreetype6-dev libsdl2-dev libsdl2-gfx-dev libsdl2-ttf-dev libfontconfig1-dev
遗憾的是,这些问题无法解决。
- 在 Windows 出现之前有很长时间的暂停。
- 非常慢。
- 如果使用 timidity -A,则没有输出。
需要进一步调试。
使用以下方法进行性能测量:
cargo run --release Marche_aux_Flambeaux.mid -p 0 1 2 -s 0 1 2 -d eventloop -vvvv
没有鼠标移动/手势的情况下得到的结果
Sleep time 1 ms - 1 times
Sleep time 14 ms - 1 times
Sleep time 15 ms - 1 times
Sleep time 16 ms - 1 times
Sleep time 17 ms - 1 times
Sleep time 22 ms - 24 times
Sleep time 23 ms - 81 times
Sleep time 24 ms - 151 times
Sleep time 25 ms - 285 times
Sleep time 26 ms - 1736 times
Sleep time 27 ms - 4152 times
Sleep time 28 ms - 2 times
Sleep time 37 ms - 1 times
Sleep time 38 ms - 1 times
Lost frames: 2
min= 0us avg= 1us max= 64us control at loop start
min= 0us avg= 1us max= 41us keyboard built
min= 0us avg= 0us max= 1531us keyboard drawn
min= 3us avg= 17us max= 77us canvas cleared
min= 17us avg= 36us max= 173us copy keyboard to canvas
min= 0us avg= 27us max= 24298us waterfall and pressed keys drawn
min= 1us avg= 10us max= 597us event loop
min= 1821us avg= 27083us max= 38550us sleep
min= 11747us avg= 12834us max= 41421us canvas presented
macos 上也是一样。
Sleep time 6 ms - 1 times
Sleep time 18 ms - 1 times
Sleep time 26 ms - 1 times
Sleep time 27 ms - 4 times
Sleep time 28 ms - 1 times
Sleep time 29 ms - 4 times
Sleep time 30 ms - 3 times
Sleep time 31 ms - 2 times
Sleep time 32 ms - 10 times
Sleep time 33 ms - 9 times
Sleep time 34 ms - 12 times
Sleep time 35 ms - 75 times
Sleep time 36 ms - 484 times
Sleep time 37 ms - 4921 times
Sleep time 38 ms - 1054 times
Sleep time 39 ms - 1 times
Lost frames: 2
min= 2us avg= 4us max= 98us control at loop start
min= 1us avg= 2us max= 115us keyboard built
min= 0us avg= 0us max= 1355us keyboard drawn
min= 7us avg= 11us max= 261us canvas cleared
min= 9us avg= 15us max= 905us copy keyboard to canvas
min= 0us avg= 43us max= 37208us waterfall and pressed keys drawn
min= 36us avg= 149us max= 90750us event loop
min= 7070us avg= 38221us max= 40092us sleep
min= 1058us avg= 1574us max= 22518us canvas presented
在 macos 上,canvas 的速度平均快 8 倍。此外,在 Linux 上,waterfall 存在一些缺陷。不清楚这是否是由于英特尔图形驱动程序或 sdl 库造成的...
有趣的是,在 macos 上,事件循环可能会因为 poll_event 而长时间阻塞,这很奇怪。幸运的是,这似乎仅发生在很少发生的窗口事件上。
更新:将驱动程序从英特尔加速模式更改为英特尔默认驱动程序后,测量结果优于 macos。
Sleep time 34 ms - 1 times
Sleep time 37 ms - 1 times
Sleep time 38 ms - 3 times
Sleep time 39 ms - 6330 times
Lost frames: 1
min= 0us avg= 5us max= 58us control at loop start
min= 0us avg= 2us max= 34us keyboard built
min= 0us avg= 0us max= 1831us keyboard drawn
min= 3us avg= 37us max= 393us canvas cleared
min= 10us avg= 65us max= 251us copy keyboard to canvas
min= 0us avg= 41us max= 44905us waterfall and pressed keys drawn
min= 5us avg= 19us max= 326us event loop
min= 34978us avg= 39624us max= 40005us sleep
min= 47us avg= 207us max= 432us canvas presented
数据到 Marche_aux_Flambeaux.mid
- 115 小节
- 4/4 小节
- 每分钟 110 拍(根据 Logic Pro/X)
- 时长 4 分钟 8 秒
- 第一音符从第 2 小节开始。
- 最后一个音符在第 114.3 小节结束。
已知问题的解决方案
Linux
如果应用程序输出大量的 fontconfig 错误,则可能是 libfontconfig 不匹配。请检查 pkg-config 是否能够找到 fontconfig。
pkg-config --list-all|grep fontconfig
如果没有输出,则 crate servo-fontconfig-sys 将构建自己的版本,这可能是兼容的。安装 libconfig1-dev 已解决这个问题。
许可证
附带的 LICENSE 文件仅定义了此 crate 代码的许可证 - 具体是在编译或链接之前。链接后的结果二进制文件可能存在包含的 crate 许可证不兼容的问题。
从当前观点来看,需要检查的许可证:BSD-3-Clause (1): simple-logging ISC (1): rdrand N/A (2): fuchsia-cprng Unlicense (1): midly
AFAIK 不兼容:GPL-3.0-or-later (1): sdl2-unifont
因此,目前无法为生成公共可用二进制文件的结果自动构建。
结语
应用程序可以工作,但仍然这只是个快速修补,并没有经过代码审查;-)
替代方案
依赖项
~21–32MB
~540K SLoC