#midi #music #sdl2 #piano #learning

app rusthesia

读取midi文件并创建钢琴音符瀑布

18个版本

0.1.21 2020年11月13日
0.1.20 2020年3月29日
0.1.13 2019年2月22日

#277音频

Download history 1/week @ 2024-03-08 2/week @ 2024-03-15 3/week @ 2024-03-29

每月52次下载

MIT许可

130KB
2.5K SLoC

Rusthesia

Build Rust dependency status

Rusthesia目前只是一个用于播放由Logic Pro/X创建的midi文件,并在钢琴上显示落下的音符的快速解决方案。

可以使用左右shift键实时将midi文件转换成半音。可以通过空格键暂停播放。

请注意:如果没有"-s"命令行选项,将不会显示窗口!

音频

未包含合成器。相反,midi消息将通过core audio发送。可以使用Logic Pro/X播放midi,但需要相应地设置。

对于其他操作系统没有想法,不知道是否工作以及如何操作。

视频

屏幕输出使用sdl2。

截图

Screenshot

准备

需要安装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