3 个版本
0.1.3 | 2019年12月8日 |
---|---|
0.1.2 | 2019年12月8日 |
0.1.0 | 2019年12月8日 |
#509 in 音频
25KB
491 行
asciimusic
在 ascii 中编码音乐的实验。可能有一些领先的数据来表示节奏、音符渐弱、同时演奏的音符(以及它们相应的音量)、每个音符的字符数、低音频率以及音符的划分(例如,压缩表示可能具有5位用于音高和3位用于长度的表示)。甚至可能有一些位用于乐器选择。
也许可以将其与 SDL 或其他东西集成,以便它可以自己播放音乐。也许可以使用合适的 GUI 工具包,以便可以直接加载音乐短语,其他人也可以使用它。(也许将其变成一个与网络相关的项目是可以实现的。这可能是 WebAssembly,因为我更愿意用 Rust 来做大部分工作。)
请注意,以下值中这些位不会是每个输入字节8位。如果输入字节是 base-64,则每个字符仅提供6位。使用 base32,输入字符仅提供5位。
Base32 更清晰、更容易处理,但 base64 将为单个字符提供5.25个八度,而不是仅仅2.58个八度。2.5个八度是低音大提琴不使用拇指位置时的音域。5.25个八度足以从低音大提琴的音域延伸到小提琴的自然音域以上。
音符范围
每个音符的位(0将是一个休止符,所以总数总是减少1)
- 1: 1个半音;1/12个八度
- 2: 3个半音;1/4个八度
- 3: 7个半音;7/12个八度
- 4: 15个半音;1.25个八度(1个八度,3个半音)
- 5: 31个半音;2.58个八度(2个八度,7个半音)
- 6: 63个半音;5.25个八度(5个八度,3个半音)
- 7: 127个半音;10.58个八度(10个八度,7个半音)
- 8: 255个半音;21.25个八度(21个八度,3个半音)
或者,将其制作成有符号表示可能是个好主意,将所有音符相对于前一个音符来计算,"基本频率"只是起始频率。这将将跳跃距离减半(因此5位表示只能跳升15个半音和下降16个)。
音符长度
假设基数为16分音符。这里最细的划分是16分音符。通过调整节奏,可以将高音音符的六分音符降低到十六分音符,三个十六分音符构成一个八分音符,两个十六分音符构成一个四分音符。
长度每位的位数:最长可编码音符。(0将不可用)
- 1: 8分音符
- 2: 4分音符
- 3: 半音符
- 4: 全音符
- 5: 全音符(最小为32分音符)
- 6: 全音符(最小为64分音符)
使用位或字节确定的其他潜在内容。
- 渐入
- 渐出
- 阻尼
- 失真
多声部考虑的格式
一个合理的设置是base64输入。初始块设置速度和其他类似内容,包括声音数量,以及每个声音的乐器。然后是节拍。需要节拍(其前一个音符或休止符已结束)的每个乐器将依次期望获取一个节拍。声音不在线指定,它们只是按正确的时间拉取下一个适用的音符。一开始,所有开始音符都为其中一个声音。如果一个声音的音符比其他声音长,它需要更长的时间才能需要自己的音符。
另一个合理的设置是base32输入,每个声音需要自己的基频率,允许每个声音拥有单独合理的2.5个八度范围。有人可以有两个具有相同乐器的声音来模仿更高的范围,但这将涉及在其他所有时间长时间休止乐器(这不是一个大问题。对于base32,一个字符表示音符,一个字符表示长度,基数为16分音符,每两小节有一个休止符)。