昨天我们有提到,我们想要生的是像小星星这样子古典钢琴音乐,像这样子的音乐音色是固定,音高也是有限范围内的排列组合,所以重要的讯息并不会是这段声音的特徵,反而是排列组合,也就是我们昨天讲的套路
如果把它跟自然语言处理做一个联想的话,我是这样子想像的
Do = 我 Re = 好 Mi = 帅
# 两只老虎
Do Re Mi Do Do Re Mi Do => 我好帅我我好帅我
# 随便乱排
Re Mi Re Mi Mi Re Do Do => 好帅好帅帅好我我
虽然这个举例很不精确XD, 但你可以看的出来两只老虎的那段排列是比较能知道它的意思的
再举一个例子来说明音乐与自然语言在语法上的相似性
假设我现在说 "我要去星巴克买...",你大概会猜我要去买 "咖啡"
同样道理如果我现在在弹两只老虎 "Do Re Mi Do Do Re Mi ..." 你也可以猜到下一个音是 "Do"
这两件事情本质是一样的,处理自然语言的时候我们透过 LSTM 好利用过去的讯息来预测未来,同样的招式也许也适用在音乐上面。
为了让我们更快速的把钢琴音乐转成像是文本的问题来解决,我们这边采用 MIDI 格式的档案来处理
MIDI 格式的档案是一种工业标准的电子通讯协定,它为电子乐器等演奏装置定义各种音符或弹奏码,可以让电子乐器、电脑、手机或是舞台演出的专业设备彼此连接,调整和同步。
MIDI 档案不传送声音,只传送像是音调和音乐强度的数据,音量,颤音和相位等参数的控制讯号,还有设定节奏的时脉讯号。在不同的电脑上,输出的声音也因音源器不同而有差异,比方说在 Windows 就是钢琴音,你可以去下载一些专门在玩 MIDI 格式的软件,就可以把它转成其他乐器的声音。
更棒的是因为它记录的东西很少,所以通常一个档案只需要 10KB
好消息是,Python 本身就有提供可以处理 MIDI 的 Lib,下面是官方的范例
from mido import MidiFile
mid = MidiFile('song.mid')
读进来之後,它可能有很多个音轨
for i, track in enumerate(mid.tracks):
print('Track {}: {}'.format(i, track.name))
for msg in track:
print(msg)
也可以自己生 MIDI 音乐
from mido import Message, MidiFile, MidiTrack
mid = MidiFile()
track = MidiTrack()
mid.tracks.append(track)
track.append(Message('program_change', program=12, time=0))
track.append(Message('note_on', note=64, velocity=64, time=32))
track.append(Message('note_off', note=64, velocity=127, time=32))
mid.save('new_song.mid')
上面这段程序码并不能演奏出什麽东西,它只是跟你说明使用概念
所以重点其实是 Message 里头要添加什麽,我们明天再实际用这个编一首歌吧,这样也可以知道里面到底装什麽东西。
<<: [Day03] Flutter GetX equatable
Project Structure 这篇文章我们来建立我们Sass专案的架构~ 一般Sass专案内都...
前言 因为 JSON Server 没有验证的功能,所以只适合让我们拿来做作品集使用,可以简单的让我...
登入 MySQL mysql -u root -p 建立空资料库 mysql > create...
昨天介绍完单层感知机模型程序,今天要来研究浅层神经网路: 单层感知机模型是只有一个输入层和输出层,如...
this 是 JavaScript 的关键字 this 是 function 执行时,自动生成的内...