Magenta之note-seq
  ZbXVz5VGTsjy 2023年11月24日 35 0

Magenta 中的所有内容都以 NoteSequences(音符序列) 为中心。这是一系列音符的抽象表示,每个音符都有不同的音高、乐器和敲击速度,很像 MIDI

下面就是一个 NoteSequence 的代码实现,播放出来就是“一闪一闪小星星(Twinkle Twinkle Little Star)”这首歌。

Magenta之note-seq_ide

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 拍

架子鼓独奏

您可以将其他乐器用于您的序列。例如,下面的序列听起来应该像架子鼓独奏

Magenta之note-seq_ci_02

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

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月24日 0

暂无评论

推荐阅读
ZbXVz5VGTsjy