ThatSkyPianist
项目是一个创新的数字音乐接口(Music Instrument Digital Interface, MIDI),它通过利用树莓派4B的强大功能,控制GPIO引脚的高低电平来模拟屏幕点击动作,自动演奏《光遇》(Sky: Children of the Light)中的乐器。这个项目展示了如何通过简单的硬件操作,将编程与音乐艺术结合起来。理论上,通过调整音符与引脚的映射关系,ThatSkyPianist
不仅能演奏虚拟乐器,还能扩展到自动演奏真实的钢琴或其他乐器,只要硬件条件允许。
导入乐谱之后,运行fingering.py
就可以进行演奏啦~
python finger.py
为了模拟人类的演奏动作,项目中设计了一套电子设备,这套设备通过以下材料制作而成:
- 杜邦线
- PC817光耦
- 导电硅胶
这些材料共同构成了能够模拟人类手指触摸屏幕的电子“手指”,从而实现自动演奏的目的。
第一代手指的电路设计:
简化之后的设计:
这些设计展示了项目从原型到成熟设计的演变过程,不断优化以提高效率和可靠性。
树莓派4B是一款十分受欢迎的卡片式计算机。树莓派4B作为本项目的核心,扮演着“钢琴家的大脑”的角色。它负责处理乐谱数据,控制GPIO引脚输出高低电平,从而驱动电子“手指”进行精准的音符演奏。树莓派4B的强大计算能力和灵活的GPIO引脚,使其成为连接项目各个部分的理想选择。
以下是树莓派引脚及其功能的详细概述和整理,包括WiringPi编号、BCM编号、功能描述以及物理引脚编号:
WiringPi NO. | BCM NO. | Function | BOARD NO. | BOARD NO. | Function | BCM NO. | WiringPi NO. |
---|---|---|---|---|---|---|---|
- | - | 3.3V | 1 | 2 | 5V | - | - |
8 | 2 | SDA.1 | 3 | 4 | 5V | - | - |
9 | 3 | SCL.1 | 5 | 6 | GND | - | - |
7 | 4 | GPIO.7 | 7 | 8 | TXD | 14 | 15 |
- | - | GND | 9 | 10 | RXD | 15 | 16 |
0 | 17 | GPIO.0 | 11 | 12 | GPIO.1 | 18 | 1 |
2 | 27 | GPIO.2 | 13 | 14 | GND | - | - |
3 | 22 | GPIO.3 | 15 | 16 | GPIO.4 | 23 | 4 |
- | - | 3.3V | 17 | 18 | GPIO.5 | 24 | 5 |
12 | 10 | MOSI | 19 | 20 | GND | - | - |
13 | 9 | MISO | 21 | 22 | GPIO.6 | 25 | 6 |
14 | 11 | SCLK | 23 | 24 | CE0 | 8 | 10 |
- | - | GND | 25 | 26 | CE1 | 7 | 11 |
30 | 0 | SDA.0 | 27 | 28 | SCL.0 | 1 | 31 |
21 | 5 | GPIO.21 | 29 | 30 | GND | - | - |
22 | 6 | GPIO.22 | 31 | 32 | GPIO.26 | 12 | 26 |
23 | 13 | GPIO.23 | 33 | 34 | GND | - | - |
24 | 19 | GPIO.24 | 35 | 36 | GPIO.27 | 16 | 27 |
25 | 26 | GPIO.25 | 37 | 38 | GPIO.28 | 20 | 28 |
- | - | GND | 39 | 40 | GPIO.29 | 21 | 29 |
树莓派的引脚有几种不同的编号系统:
- BOARD编号:这是引脚在物理位置上的编号,从1开始,按照实际在树莓派板上的位置排序。
- BCM编号:这是Broadcom芯片的引脚编号,用于编程时指定GPIO引脚。
- WiringPi编号:这是WiringPi库使用的引脚编号系统,它是一个为GPIO引脚编程提供简化的接口。
树莓派4B上的大多数引脚都可以被配置为输出高低电平。但是,需要注意的是,并非所有40个引脚都是GPIO引脚。其中包括专用的电源引脚(3.3V和5V)、接地引脚(GND)以及特定功能的引脚(如I2C、SPI、UART)。只有那些标记为GPIO的引脚可以被配置为输出高低电平。
当配置为输出模式时,GPIO引脚可以输出两种电平:
- 高电平:输出的电压与GPIO引脚的供电电压相同,对于树莓派4B来说,这个电压是3.3V。
- 低电平:输出的电压接近0V,可以被视为接地电平。
树莓派4B有17个可用于通用输入输出(GPIO)的引脚。按照物理引脚次序排列,树莓派4B的GPIO引脚及其对应的BCM编号如下:
Function | BCM NO. | BOARD NO. |
---|---|---|
GPIO.7 | BCM 4 | 7 |
GPIO.0 | BCM 17 | 11 |
GPIO.1 | BCM 18 | 12 |
GPIO.2 | BCM 27 | 13 |
GPIO.3 | BCM 22 | 15 |
GPIO.4 | BCM 23 | 16 |
GPIO.5 | BCM 24 | 18 |
GPIO.6 | BCM 25 | 22 |
GPIO.21 | BCM 5 | 29 |
GPIO.22 | BCM 6 | 31 |
GPIO.26 | BCM 12 | 32 |
GPIO.23 | BCM 13 | 33 |
GPIO.24 | BCM 19 | 35 |
GPIO.27 | BCM 16 | 36 |
GPIO.25 | BCM 26 | 37 |
GPIO.28 | BCM 20 | 38 |
GPIO.29 | BCM 21 | 40 |
由于SKY中很多乐器(比如钢琴,吉他,竖琴琴等)都支持15个音符的音域演奏(三度音程),因此按照物理引脚编号的次序,选择前15个GPIO引脚来依次控制各个音符的演奏。引脚-音符映射关系如下表:
Note | Numerical | BCM NO. | Function | BOARD NO. |
---|---|---|---|---|
,Do | 1. | 4 | GPIO.7 | 7 |
,Re | 2. | 17 | GPIO.0 | 11 |
,Mi | 3. | 18 | GPIO.1 | 12 |
,Fa | 4. | 27 | GPIO.2 | 13 |
,Sol | 5. | 22 | GPIO.3 | 15 |
,La | 6. | 23 | GPIO.4 | 16 |
,Si | 7. | 24 | GPIO.5 | 18 |
Do | 1 | 25 | GPIO.6 | 22 |
Re | 2 | 5 | GPIO.21 | 29 |
Mi | 3 | 6 | GPIO.22 | 31 |
Fa | 4 | 12 | GPIO.26 | 32 |
Sol | 5 | 13 | GPIO.23 | 33 |
La | 6 | 19 | GPIO.24 | 35 |
Si | 7 | 16 | GPIO.27 | 36 |
Do' | 1' | 26 | GPIO.25 | 37 |
光遇的乐器按键布局:
1. | 2. | 3. | 4. | 5. |
---|---|---|---|---|
6. | 7. | 1 | 2 | 3 |
4 | 5 | 6 | 7 | 1' |
本项目采用csv文件来存放乐谱,便于程序读入。CSV(逗号分隔值)文件是一种简单的文本文件,用于存储表格数据。
首先需要设计&约定乐谱的数据结构:
-
音符(Note):每个音符之间采用
,
间隔,如果音符之间有停顿则两个音符之间使用两个,
间隔。 -
小节(Bar):csv文件中每个非空行表示一个小节,每个小节所包含的音符数不必相同。
-
段(Phrase):一段由多个小节组成,段与段之间采用包含多个
,
的空行间隔,空行中,
的个数表示段与段之间停顿的节拍数。
此外,还支持变速演奏(Tempo Variation):
- 加速(Accelerando):用缩写
accel.
表示,-
后的数字表示本小节的演奏速度将在原基础上增加多少个BPM。 - 减速(Ritardando):用缩写
rit.
表示,-
后的数字表示本小节的演奏速度将在原基础上减少多少个BPM。
变速可以增加乐曲的表现力和动态变化,使得音乐更加生动和富有感染力。
如下面《花海》(前两段)的示例:
1, 3, 3, , 3, 2, 1, 2, 3
1, 3, 3, , 4, 3, 5, 1
1, 4, 4, , 4, 3, 1, 5., 3
rit.-20, 1, 3, 2, 1, 3, 2, 1, 3, 2
,
1, 3, 3, , 3, 2, 1, 2, 5
accel.-20, 1, 3, 3, , 4, 3, 5, 1
1, 4, 4, , 4, 3, 1, 5, 3, 1'
5, 4, 4, 1, 1, 7., 1
注:期望每小节末尾有停顿,就在最后一个音符后加上
,
。
支持多种演奏速度的弹奏。演奏速度(也称为速度标记)主要用来指示乐曲的速度或节奏,以下是一些常见的演奏速度标记及其大致的BPM(每分钟节拍数)范围。
古典音乐风格 | BPM 范围 | 流行音乐风格 | BPM 范围 |
---|---|---|---|
Largo | [40, 60] | Hip-Hop | [60, 100] |
Adagio | [66, 76] | Pop | [100, 130] |
Andante | [76, 108] | Rock | [110, 140] |
Moderato | [108, 120] | EDM | [120, 130] |
Allegro | [120, 168] | Dance | [120, 130] |
Presto | [168, 200] | Dubstep | [140, 141] |
Prestissimo | [200, 220] | Drum | [160, 180] |
Bass | [160, 180] |
本项目总共提供15种不同的演奏速度,7种古典音乐风格,8种流行音乐风格。每次演奏都将在所指定风格的BPM范围内,随机选择一个BPM,使得每次演奏的效果都不一样。
- 单音演奏(Monophonic Playing):在任何给定时刻只有一个音符被演奏,这是最简单的音乐纹理形式,只包含单一的旋律线条,没有和声伴随。
- 和弦演奏(Chord Playing):同时演奏多个音符以产生和谐或不和谐的音效,这是音乐中创造和声的一种基本方式。和弦由三个或更多不同音高的音符组成,当这些音符同时响起时,它们共同创造出一个和弦的声音。本项目采用并发来实现和弦。
和弦的数字化乐谱表示:采用-
连接和弦中的各个音符,比如1.-2.-3.
表示这个和弦由1
,2
和3
组成。和弦与其他音符仍然以,
间隔,比如:
5, 4, 4, 1, 1-2-3, 7., 1
- 音乐分析工具:基于傅里叶变换开发更高级的音乐分析工具,自动识别音乐并转换为可演奏的数字乐谱。
- 即兴创作:基于生成式AI的即兴创作,让
ThatSkyPianist
不仅能复现现有乐曲,还能创作新的曲目。
要开始使用ThatSkyPianist
进行音乐创作和演奏,请遵循以下步骤:
-
准备硬件:确保你有一块树莓派4B,以及必要的电子组件(杜邦线、PC817光耦、导电硅胶等)。
-
设置树莓派:根据树莓派官方文档设置你的设备,安装最新的操作系统和必要的软件包。
-
下载项目代码:从GitHub仓库克隆或下载
ThatSkyPianist
项目代码到你的树莓派。 -
组装电子“手指”:参照项目文档中的指南,组装你的电子“手指”。
-
配置GPIO引脚:根据你的乐器和乐谱,配置GPIO引脚与音符的映射关系。
-
导入乐谱:将你的乐谱以CSV格式导入到项目的指定目录。
-
运行演奏脚本:运行
fingering.py
脚本开始演奏。
ThatSkyPianist
项目欢迎所有对音乐和编程感兴趣的人贡献自己的力量。无论是添加新的乐谱、改进硬件设计,还是开发新功能,你的贡献都将使这个项目更加完善。请访问我们的GitHub仓库,查看当前的issues或提交新的pull request。
ThatSkyPianist
项目在MIT许可证下发布。这意味着你可以自由地使用、修改和分发这个项目,但必须包含原始许可证的副本。
如果你有任何问题、建议或想要分享你的创作,请不要犹豫,通过以下方式联系我们:
我们期待听到你的声音,一起将ThatSkyPianist
项目推向新的高度!