导航

Magenta之note-seq

Posted on 2023-10-19 15:16  蝈蝈俊  阅读(114)  评论(0编辑  收藏  举报

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