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 是音乐序列的强大表示形式。它们可以用于创建、编辑和分析音乐。