Mac python2.7创作mid音乐文件

# 写文章初衷:

   设计学生毕设想做一个音乐交互装置。简单来说,就是把图片变成音乐。

   在完成了摄像头的拍摄和OpenCV的视觉识别之后(有时间的话之后再补这一块的代码),发现不知道如何将图片的信息转换成相应的音乐。

   因为想使用树莓派,在搜索了很多的python库之后,找不到能够很好的将数组转换成对应音乐的代码。

   接下来的部分,罗列了我使用过的库和相应的使用体验,以及我最后的使用方法。


1. pygame

    不得不承认,pygame是个很方便的库,可以直接pip下载。

    但是我发现它播放效果比较有限,比较大的文件(我试了云音乐上下载下来的Lawrence.mp3-3.9M,无法播放,但是单个音符的文件可以),而且无法自由创作音乐(即无法自己调试音量音高和持续时间)。

    最后我使用了pygame来播放midi文件。

    代码如下:

# 初始化
import cv2, time
import pygame, sys

pygame.init()
pygame.mixer.init()
print("start play")
musicfile = '/Users/hongjiayi/Desktop/Music_Interaction/test.mid'
screen = pygame.display.set_mode([640,480])
track = pygame.mixer.music.load(musicfile)
pygame.mixer.music.play(loops = 3)
time.sleep(2)

pygame.mixer.music.stop()
cv2.destroyAllWindows()

2. midi库

    同样能够直接pip下载的库,在GitHub上也有500+的STAR。不过除了在GitHub上找到的官方documents和examples,几乎没有找到其他的代码。而官方示例非常的简单,对于我这种尝试了一段在programcreek上的example,使用了随机生成的二维数组,但是无法放出声音。

3. winsound

    嗯,是的,用在windows电脑上的包,我看了代码,还是非常简单易懂,可惜没有Mac版的。sigh

4. mingus

    这个库在一些文章中说比midi易懂很多,但是我从官网看到的代码都没有办法运行,我认为是官网代码没有更新,使得一直报错。


还有一些比如psonic,BeetBox,PySynth因为各种原因,我最后没有用。


最后使用了mido库:https://github.com/olemb/mido

代码如下:

import random
from mido import Message, MidiFile, MidiTrack
import numpy as np

# create a random matrix
randArray = [[0 for x in range(3)] for y in range(20)]
randArray = np.random.randint(0,100,(3,20))

outfile = MidiFile()
track = MidiTrack()
outfile.tracks.append(track)

# choose U favourite program
track.append(Message('program_change', program=9))

for i in range(20):
    note = randArray[1][i]
    velocity = randArray[0][i]
    delta = randArray[2][i]
    track.append(Message('note_on', note=note, velocity=velocity, time=delta))
    track.append(Message('note_off', note=note, velocity=velocity, time=delta))

outfile.save('test.mid')

然后可以把之前图片处理出来的数组套到这里面,就好啦~~


你可能感兴趣的:(程序员养成记,python)