Skip to content

Latest commit

 

History

History
234 lines (162 loc) · 12.3 KB

README_CN.md

File metadata and controls

234 lines (162 loc) · 12.3 KB

ThatSkyPianist_LOGO

ThatSkyPianist项目是一个创新的数字音乐接口(Music Instrument Digital Interface, MIDI),它通过利用树莓派4B的强大功能,控制GPIO引脚的高低电平来模拟屏幕点击动作,自动演奏《光遇》(Sky: Children of the Light)中的乐器。这个项目展示了如何通过简单的硬件操作,将编程与音乐艺术结合起来。理论上,通过调整音符与引脚的映射关系,ThatSkyPianist不仅能演奏虚拟乐器,还能扩展到自动演奏真实的钢琴或其他乐器,只要硬件条件允许。

Demo

导入乐谱之后,运行fingering.py就可以进行演奏啦~

python finger.py

1. 钢琴家的手指

为了模拟人类的演奏动作,项目中设计了一套电子设备,这套设备通过以下材料制作而成:

  • 杜邦线
  • PC817光耦
  • 导电硅胶

这些材料共同构成了能够模拟人类手指触摸屏幕的电子“手指”,从而实现自动演奏的目的。

第一代手指的电路设计:

finger

参考视频

简化之后的设计:

fingers_v2

这些设计展示了项目从原型到成熟设计的演变过程,不断优化以提高效率和可靠性。

2. 钢琴家的大脑:树莓派4B

RaspberryPi4B

树莓派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引脚编程提供简化的接口。

2.1 钢琴家的神经: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'

3. 钢琴家的乐谱

3.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

注:期望每小节末尾有停顿,就在最后一个音符后加上,

3.2 演奏速度(风格)

支持多种演奏速度的弹奏。演奏速度(也称为速度标记)主要用来指示乐曲的速度或节奏,以下是一些常见的演奏速度标记及其大致的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,使得每次演奏的效果都不一样。

3.3 演奏模式

  • 单音演奏(Monophonic Playing):在任何给定时刻只有一个音符被演奏,这是最简单的音乐纹理形式,只包含单一的旋律线条,没有和声伴随。
  • 和弦演奏(Chord Playing):同时演奏多个音符以产生和谐或不和谐的音效,这是音乐中创造和声的一种基本方式。和弦由三个或更多不同音高的音符组成,当这些音符同时响起时,它们共同创造出一个和弦的声音。本项目采用并发来实现和弦。

和弦的数字化乐谱表示:采用-连接和弦中的各个音符,比如1.-2.-3.表示这个和弦由123组成。和弦与其他音符仍然以,间隔,比如:

5, 4, 4, 1, 1-2-3, 7., 1

未来的钢琴家 (TODO List)

  • 音乐分析工具:基于傅里叶变换开发更高级的音乐分析工具,自动识别音乐并转换为可演奏的数字乐谱。
  • 即兴创作:基于生成式AI的即兴创作,让ThatSkyPianist不仅能复现现有乐曲,还能创作新的曲目。

快速开始

要开始使用ThatSkyPianist进行音乐创作和演奏,请遵循以下步骤:

  1. 准备硬件:确保你有一块树莓派4B,以及必要的电子组件(杜邦线、PC817光耦、导电硅胶等)。

  2. 设置树莓派:根据树莓派官方文档设置你的设备,安装最新的操作系统和必要的软件包。

  3. 下载项目代码:从GitHub仓库克隆或下载ThatSkyPianist项目代码到你的树莓派。

  4. 组装电子“手指”:参照项目文档中的指南,组装你的电子“手指”。

  5. 配置GPIO引脚:根据你的乐器和乐谱,配置GPIO引脚与音符的映射关系。

  6. 导入乐谱:将你的乐谱以CSV格式导入到项目的指定目录。

  7. 运行演奏脚本:运行fingering.py脚本开始演奏。

贡献

ThatSkyPianist项目欢迎所有对音乐和编程感兴趣的人贡献自己的力量。无论是添加新的乐谱、改进硬件设计,还是开发新功能,你的贡献都将使这个项目更加完善。请访问我们的GitHub仓库,查看当前的issues或提交新的pull request。

许可证

ThatSkyPianist项目在MIT许可证下发布。这意味着你可以自由地使用、修改和分发这个项目,但必须包含原始许可证的副本。

联系我们

如果你有任何问题、建议或想要分享你的创作,请不要犹豫,通过以下方式联系我们:

我们期待听到你的声音,一起将ThatSkyPianist项目推向新的高度!