【Day17】音乐与自然语言处理的奇妙关联

音乐与自然语言

  • 昨天我们有提到,我们想要生的是像小星星这样子古典钢琴音乐,像这样子的音乐音色是固定,音高也是有限范围内的排列组合,所以重要的讯息并不会是这段声音的特徵,反而是排列组合,也就是我们昨天讲的套路

  • 如果把它跟自然语言处理做一个联想的话,我是这样子想像的

      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 格式的档案是一种工业标准的电子通讯协定,它为电子乐器等演奏装置定义各种音符或弹奏码,可以让电子乐器、电脑、手机或是舞台演出的专业设备彼此连接,调整和同步。

  • MIDI 档案不传送声音,只传送像是音调和音乐强度的数据,音量,颤音和相位等参数的控制讯号,还有设定节奏的时脉讯号。在不同的电脑上,输出的声音也因音源器不同而有差异,比方说在 Windows 就是钢琴音,你可以去下载一些专门在玩 MIDI 格式的软件,就可以把它转成其他乐器的声音。

  • 更棒的是因为它记录的东西很少,所以通常一个档案只需要 10KB

MIDI in Python

好消息是,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')

上面这段程序码并不能演奏出什麽东西,它只是跟你说明使用概念

  1. 建一个 MidiFile
  2. 建一个(或多个)MidiTrack,并将其 append 到 MidiFile 中
  3. 向一个(或多个)MidiTrack 内添加 Message (包括 program_change、note_on、note_off 等)和 MetaMessage(用来表示 MIDI 文件的节拍、速度、调式等属性)
  4. MidiFile 保存起来

所以重点其实是 Message 里头要添加什麽,我们明天再实际用这个编一首歌吧,这样也可以知道里面到底装什麽东西。

参考资料

Python mido

/images/emoticon/emoticon09.gif/images/emoticon/emoticon13.gif/images/emoticon/emoticon14.gif/images/emoticon/emoticon22.gif/images/emoticon/emoticon28.gif


<<:  [Day03] Flutter GetX equatable

>>:  Day 5. 怎麽开始Vue起来

[Day 07] Sass - Project Structure

Project Structure 这篇文章我们来建立我们Sass专案的架构~ 一般Sass专案内都...

DAY17 服务室--JSON Server 部属

前言 因为 JSON Server 没有验证的功能,所以只适合让我们拿来做作品集使用,可以简单的让我...

MySQL 汇入 .sql 档案

登入 MySQL mysql -u root -p 建立空资料库 mysql > create...

DAY24神经网路(续二)

昨天介绍完单层感知机模型程序,今天要来研究浅层神经网路: 单层感知机模型是只有一个输入层和输出层,如...

[ JS个人笔记 ] this的指向—DAY8

this 是 JavaScript 的关键字 this 是 function 执行时,自动生成的内...