Magenta 中的所有内容都以 NoteSequences(音符序列) 为中心。这是一系列音符的抽象表示,每个音符都有不同的音高、乐器和敲击速度,很像 MIDI。
下面就是一个 NoteSequence 的代码实现,播放出来就是“一闪一闪小星星(Twinkle Twinkle Little Star)”这首歌。
import note_seq
import note_seq.protobuf.music_pb2
twinkle_twinkle = note_seq.protobuf.music_pb2.NoteSequence()
twinkle_twinkle.notes.add(pitch=60, start_time=0.0, end_time=0.5, velocity=80)
twinkle_twinkle.notes.add(pitch=60, start_time=0.5, end_time=1.0, velocity=80)
twinkle_twinkle.notes.add(pitch=67, start_time=1.0, end_time=1.5, velocity=80)
twinkle_twinkle.notes.add(pitch=67, start_time=1.5, end_time=2.0, velocity=80)
twinkle_twinkle.notes.add(pitch=69, start_time=2.0, end_time=2.5, velocity=80)
twinkle_twinkle.notes.add(pitch=69, start_time=2.5, end_time=3.0, velocity=80)
twinkle_twinkle.notes.add(pitch=67, start_time=3.0, end_time=4.0, velocity=80)
twinkle_twinkle.notes.add(pitch=65, start_time=4.0, end_time=4.5, velocity=80)
twinkle_twinkle.notes.add(pitch=65, start_time=4.5, end_time=5.0, velocity=80)
twinkle_twinkle.notes.add(pitch=64, start_time=5.0, end_time=5.5, velocity=80)
twinkle_twinkle.notes.add(pitch=64, start_time=5.5, end_time=6.0, velocity=80)
twinkle_twinkle.notes.add(pitch=62, start_time=6.0, end_time=6.5, velocity=80)
twinkle_twinkle.notes.add(pitch=62, start_time=6.5, end_time=7.0, velocity=80)
twinkle_twinkle.notes.add(pitch=60, start_time=7.0, end_time=8.0, velocity=80)
twinkle_twinkle.total_time = 8
twinkle_twinkle.tempos.add(qpm=60)
note_seq.sequence_proto_to_midi_file(twinkle_twinkle, '11.mid')
歌曲
一闪一闪的小星星
需要导入note-seq 这个专注于音乐序列生成的工具。
pip install note-seq
note-seq 是 Google AI 开发的一个用于表示和操作音乐序列的序列化格式。它可以用于存储和传输音乐数据,以及进行音乐生成、编辑和分析。
Note-seq 的核心是 Note 对象,它表示一个音乐音符。
Note-seq 还支持 NoteSequence 对象,它表示一个音乐序列。一个 NoteSequence 对象包含一个或多个 Note 对象,并可以指定序列的开始时间和结束时间。
音乐音符 Note 对象常见属性如下:
小星星示例代码参数说明
pitch 音符的音高
pitch 参数是音符的音高,以 MIDI 音符编号的形式表示。
MIDI 音符编号的范围是 0 到 127,其中 0 表示最低音的 C 音,127 表示最高音的 G 音。
MIDI 音符编号 |
音符 |
0 |
C1 |
1 |
C#1 |
2 |
D1 |
3 |
D#1 |
4 |
E1 |
5 |
F1 |
6 |
F#1 |
7 |
G1 |
8 |
G#1 |
9 |
A1 |
10 |
A#1 |
11 |
B1 |
12 |
C2 |
13 |
C#2 |
... |
... |
127 |
G7 |
上面示例代码中,pitch 参数的值分别是 69、71、73、74、76 和 81,这意味着这九个音符的音高分别是:
- E4
- G4
- B4
- C5
- E5
- G5
- E6
- G6
- E6
注意,MIDI 音符编号是相对于中音 C 音而言的,因此 E4 的音高比中音 C 音高一个八度。
velocity 音符的力度
velocity 参数是音符的力度,范围是 0 到 127。其中 0 表示最弱的力度,127 表示最强的力度。
在 MIDI 中,velocity 参数表示的是音符被击打的力度。力度越大,音符的音量越大,音色也越明亮。
前面代码中,所有音符的 velocity 参数都设置为 80,这意味着所有音符的力度都是中等的。
velocity 参数值 |
力度 |
0 |
最弱 |
30 |
弱 |
60 |
中等 |
90 |
强 |
127 |
最强 |
qpm 节拍
teapot.tempos.add(qpm=60) 表示节拍。qpm 是每分钟拍数的缩写,60 表示每分钟 60 拍。
在 MIDI 中,节拍是用来表示音乐的速度的。节拍越快,音乐的速度就越快。
示例代码中,qpm=60 表示音乐的速度是每分钟 60 拍。这意味着,每分钟有 60 个音符被演奏,每个音符的持续时间是 60 / 60 = 1 秒。
常见的节拍设置:
节拍设置 |
速度 |
60 |
每分钟 60 拍 |
80 |
每分钟 80 拍 |
120 |
每分钟 120 拍 |
160 |
每分钟 160 拍 |
架子鼓独奏
您可以将其他乐器用于您的序列。例如,下面的序列听起来应该像架子鼓独奏
import note_seq
import note_seq.protobuf.music_pb2
drums = note_seq.protobuf.music_pb2.NoteSequence()
drums.notes.add(pitch=36, start_time=0, end_time=0.125, is_drum=True, instrument=10, velocity=80)
drums.notes.add(pitch=38, start_time=0, end_time=0.125, is_drum=True, instrument=10, velocity=80)
drums.notes.add(pitch=42, start_time=0, end_time=0.125, is_drum=True, instrument=10, velocity=80)
drums.notes.add(pitch=46, start_time=0, end_time=0.125, is_drum=True, instrument=10, velocity=80)
drums.notes.add(pitch=42, start_time=0.25, end_time=0.375, is_drum=True, instrument=10, velocity=80)
drums.notes.add(pitch=42, start_time=0.375, end_time=0.5, is_drum=True, instrument=10, velocity=80)
drums.notes.add(pitch=42, start_time=0.5, end_time=0.625, is_drum=True, instrument=10, velocity=80)
drums.notes.add(pitch=50, start_time=0.5, end_time=0.625, is_drum=True, instrument=10, velocity=80)
drums.notes.add(pitch=36, start_time=0.75, end_time=0.875, is_drum=True, instrument=10, velocity=80)
drums.notes.add(pitch=38, start_time=0.75, end_time=0.875, is_drum=True, instrument=10, velocity=80)
drums.notes.add(pitch=42, start_time=0.75, end_time=0.875, is_drum=True, instrument=10, velocity=80)
drums.notes.add(pitch=45, start_time=0.75, end_time=0.875, is_drum=True, instrument=10, velocity=80)
drums.notes.add(pitch=36, start_time=1, end_time=1.125, is_drum=True, instrument=10, velocity=80)
drums.notes.add(pitch=42, start_time=1, end_time=1.125, is_drum=True, instrument=10, velocity=80)
drums.notes.add(pitch=46, start_time=1, end_time=1.125, is_drum=True, instrument=10, velocity=80)
drums.notes.add(pitch=42, start_time=1.25, end_time=1.375, is_drum=True, instrument=10, velocity=80)
drums.notes.add(pitch=48, start_time=1.25, end_time=1.375, is_drum=True, instrument=10, velocity=80)
drums.notes.add(pitch=50, start_time=1.25, end_time=1.375, is_drum=True, instrument=10, velocity=80)
drums.total_time = 1.375
drums.tempos.add(qpm=60)
note_seq.sequence_proto_to_midi_file(drums, '12.mid')
额外参数说明
is_drum 是否为鼓音符
is_drum 参数指定该音符是否为鼓音符。
- 如果 is_drum 为 True,则该音符将在鼓通道上播放。
- 如果 is_drum 为 False,则该音符将在旋律通道上播放。
instrument 音色/播放乐器
instrument 参数指定用于播放音符的 MIDI 乐器。MIDI 乐器编号是一个从 0 到 127 的整数。不同乐器具有不同的声音。例如,乐器 0 是钢琴,乐器 1 是明亮的钢琴,乐器 2 是电钢琴。
示例中 instrument 参数对于所有音符都设置为 10,这对应于 MIDI 乐器“高音鼓”。
以下是 MIDI 乐器编号与乐器名称的对应关系:
编号 |
英文名 |
中文名 |
0 |
Acoustic Grand Piano |
钢琴 |
1 |
Bright Acoustic Piano |
明亮钢琴 |
2 |
Electric Grand Piano |
电钢琴 |
3 |
Honky-tonk Piano |
乡村钢琴 |
4 |
Electric Piano 1 |
电钢琴 1 |
5 |
Electric Piano 2 |
电钢琴 2 |
6 |
Harpsichord |
羽管键琴 |
7 |
Clavinet |
电子琴 |
8 |
Celeste |
钢片琴 |
9 |
Glockenspiel |
钟琴 |
10 |
Music Box |
音乐盒 |
11 |
Vibraphone |
颤音琴 |
12 |
Marimba |
马林巴琴 |
13 |
Xylophone |
木琴 |
14 |
Tubular Bells |
管钟 |
15 |
Dulcimer |
扬琴 |
16 |
Drawbar Organ |
拉杆风琴 |
17 |
Church Organ |
管风琴 |
18 |
Reed Organ |
簧风琴 |
19 |
Accordion |
手风琴 |
20 |
Harmonica |
口琴 |
21 |
Tango Accordion |
探戈手风琴 |
22 |
Acoustic Guitar (nylon) |
尼龙弦吉他 |
23 |
Acoustic Guitar (steel) |
钢弦吉他 |
24 |
Electric Guitar (jazz) |
爵士电吉他 |
25 |
Electric Guitar (clean) |
清音电吉他 |
26 |
Electric Guitar (muted) |
闷音电吉他 |
27 |
Overdriven Guitar |
失真电吉他 |
28 |
Distortion Guitar |
失真电吉他 |
29 |
Acoustic Bass |
原声贝斯 |
30 |
Electric Bass (finger) |
指弹电贝斯 |
31 |
Electric Bass (pick) |
拨片电贝斯 |
32 |
Fretless Bass |
无品贝斯 |
33 |
Slap Bass 1 |
拨片贝斯 1 |
34 |
Slap Bass 2 |
拨片贝斯 2 |
35 |
Synth Bass 1 |
合成贝斯 1 |
36 |
Synth Bass 2 |
合成贝斯 2 |
37 |
Violin |
小提琴 |
38 |
Viola |
中提琴 |
39 |
Cello |
大提琴 |
40 |
Contrabass |
低音提琴 |
41 |
Tremolo Strings |
颤音弦乐 |
42 |
Pizzicato Strings |
撥奏弦乐 |
43 |
Orchestral Harp |
管弦乐竖琴 |
44 |
Timpani |
定音鼓 |
45 |
Strings |
弦乐 |
46 |
Synth Strings 1 |
合成弦乐 1 |
47 |
Synth Strings 2 |
合成弦乐 2 |
48 |
Choir Aahs |
合唱啊 |
49 |
Choir Oohs |
合唱哦 |
50 |
Synth Choir |
合成合唱 |
51 |
Orchestral Hit |
管弦乐打击乐 |
52 |
Trumpet |
小号 |
53 |
Trombone |
长号 |
54 |
Tuba |
大号 |
55 |
French Horn |
法国号 |
56 |
Brass Section |
铜管乐组 |
57 |
Synth Brass 1 |
合成铜管乐 1 |
58 |
Synth Brass 2 |
合成铜管乐 2 |
59 |
Soprano Sax |
高音萨克斯管 |
60 |
Alto Sax |
中音萨克斯管 |
61 |
Tenor Sax |
次中音萨克斯管 |
62 |
Baritone Sax |
低音萨克斯管 |
63 |
Oboe |
双簧管 |
64 |
English Horn |
英国管 |
65 |
Clarinet |
单簧管 |
66 |
Bassoon |
巴松管 |
67 |
Clarinet Bass |
低音单簧管 |
68 |
Contrabassoon |
大管 |
69 |
Flute |
长笛 |
70 |
Pan Flute |
排笛 |
71 |
Recorder |
竖笛 |
72 |
Blown Bottle |
吹瓶 |
73 |
Shakuhachi |
尺八 |
74 |
Whistle |
哨子 |
75 |
Ocarina |
葫芦丝 |
76 |
Synth Pad 1 |
合成垫 1 |
77 |
Synth Pad 2 |
合成垫 2 |
78 |
Synth Pad 3 |
合成垫 3 |
79 |
Synth Pad 4 |
合成垫 4 |
80 |
Synth Pad 5 |
合成垫 5 |
81 |
Synth Pad 6 |
合成垫 6 |
82 |
Synth Pad 7 |
合成垫 7 |
83 |
Synth Pad 8 |
合成垫 8 |
84 |
Synth Pad 9 |
合成垫 9 |
85 |
Synth Pad 10 |
合成垫 10 |
86 |
Synth Drum 1 |
合成鼓 1 |
87 |
Synth Drum 2 |
合成鼓 2 |
88 |
Synth Drum 3 |
合成鼓 3 |
89 |
Synth Drum 4 |
合成鼓 4 |
90 |
Synth Drum 5 |
合成鼓 5 |
91 |
Synth Drum 6 |
合成鼓 6 |
92 |
Synth Drum 7 |
合成鼓 7 |
93 |
Synth Drum 8 |
合成鼓 8 |
94 |
Synth Drum 9 |
合成鼓 9 |
95 |
Synth Drum 10 |
合成鼓 10 |
96 |
Reverse Cymbal |
反向镲 |
97 |
Guitar Fret Noise |
吉他弦噪音 |
98 |
Breath Noise |
呼吸声 |
99 |
Seashore |
海滩 |
100 |
Bird Tweet |
鸟鸣 |
101 |
Telephone Ring |
电话铃声 |
102 |
Doorbell |
门铃 |
103 |
Ambulance |
救护车 |
104 |
Fire Engine |
消防车 |
105 |
Siren |
警报声 |
106 |
Train |
火车 |
107 |
Car |
汽车 |
108 |
Horse |
马 |
109 |
Footsteps |
脚步声 |
110 |
Applause |
掌声 |
111 |
Gunshot |
枪声 |
112 |
Explosion |
爆炸 |
113 |
Hi-hat |
踩镲 |
114 |
Crash Cymbal |
落镲 |
115 |
Ride Cymbal |
骑马镲 |
116 |
Open Hi-hat |
开放踩镲 |
117 |
Low Tom |
低音鼓 |
118 |
Mid Tom |
中音鼓 |
119 |
High Tom |
高音鼓 |
120 |
Crash Cymbal 1 |
落镲 1 |
121 |
Crash Cymbal 2 |
落镲 2 |
122 |
Ride Cymbal 1 |
骑马镲 1 |
123 |
Ride Cymbal 2 |
骑马镲 2 |
124 |
Chinese Cymbal |
中国镲 |
125 |
Ride Bell |
骑马铃 |
126 |
Tambourine |
手鼓 |
127 |
Splash Cymbal |
溅水镲 |
上述代码鼓点由以下四个部分组成:
- 一个由 4 个连续音符组成的低音鼓打击,持续时间为 0.25 秒。
- 一个由 4 个连续音符组成的高音鼓打击,持续时间为 0.25 秒。
- 一个由 4 个连续音符组成的军鼓打击,持续时间为 0.25 秒。
- 一个由 4 个连续音符组成的闭合 Hi-hat 打击,持续时间为 0.25 秒。
总结
Magenta 中的 NoteSequences 是音乐序列的强大表示形式。它们可以用于创建、编辑和分析音乐。