2012-06-11 25 views
5

Music21で作成した音楽からリアルタイムオーディオ出力を作成するにはどうすればよいですか?それで、Music21で作った音楽のオーディオ出力は、どのようにしてオープンソースソフトウェアで作ることができますか?助けてくれてありがとう。Music21で作成された音楽からリアルタイムオーディオ出力を作成するにはどうすればよいですか?

+0

あなたの質問はむしろあいまいです。何が問題なのですか?また、[docs](http://mit.edu/music21/doc/html/contents.html)を持っていますか? –

答えて

6

ここに私が知ったことがあります。ここにWindows XPで動作するPythonスクリプトがあります。 music21に加えてpygameが必要です。

# genPlayM21Score.py Generates and Plays 2 Music21 Scores "on the fly". 
# 
# see way below for source notes 

from music21 import * 

# we create the music21 Bottom Part, and do this explicitly, one object at a time. 

n1 = note.Note('e4') 
n1.duration.type = 'whole' 
n2 = note.Note('d4') 
n2.duration.type = 'whole' 
m1 = stream.Measure() 
m2 = stream.Measure() 
m1.append(n1) 
m2.append(n2) 
partLower = stream.Part() 
partLower.append(m1) 
partLower.append(m2) 

# For the music21 Upper Part, we automate the note creation procedure 

data1 = [('g4', 'quarter'), ('a4', 'quarter'), ('b4', 'quarter'), ('c#5', 'quarter')] 
data2 = [('d5', 'whole')] 
data = [data1, data2] 
partUpper = stream.Part() 

def makeUpperPart(data): 
    for mData in data: 
     m = stream.Measure() 
     for pitchName, durType in mData: 
      n = note.Note(pitchName) 
      n.duration.type = durType 
      m.append(n) 
     partUpper.append(m) 
makeUpperPart(data)   

# Now, we can add both Part objects into a music21 Score object. 

sCadence = stream.Score() 
sCadence.insert(0, partUpper) 
sCadence.insert(0, partLower) 

# Now, let's play the MIDI of the sCadence Score [from memory, ie no file write necessary] using pygame 

import cStringIO 

# for music21 <= v.1.2: 
if hasattr(sCadence, 'midiFile'): 
    sCadence_mf = sCadence.midiFile 
else: # for >= v.1.3: 
    sCadence_mf = midi.translate.streamToMidiFile(sCadence) 
sCadence_mStr = sCadence_mf.writestr() 
sCadence_mStrFile = cStringIO.StringIO(sCadence_mStr) 

import pygame 

freq = 44100 # audio CD quality 
bitsize = -16 # unsigned 16 bit 
channels = 2 # 1 is mono, 2 is stereo 
buffer = 1024 # number of samples 
pygame.mixer.init(freq, bitsize, channels, buffer) 

# optional volume 0 to 1.0 
pygame.mixer.music.set_volume(0.8) 

def play_music(music_file): 
    """ 
    stream music with mixer.music module in blocking manner 
    this will stream the sound from disk while playing 
    """ 
    clock = pygame.time.Clock() 
    try: 
     pygame.mixer.music.load(music_file) 
     print "Music file %s loaded!" % music_file 
    except pygame.error: 
     print "File %s not found! (%s)" % (music_file, pygame.get_error()) 
     return 
    pygame.mixer.music.play() 
    while pygame.mixer.music.get_busy(): 
     # check if playback has finished 
     clock.tick(30) 

# play the midi file we just saved 
play_music(sCadence_mStrFile) 

#============================ 

# now let's make a new music21 Score by reversing the upperPart notes 
data1.reverse() 
data2 = [('d5', 'whole')] 
data = [data1, data2] 
partUpper = stream.Part() 
makeUpperPart(data)   
sCadence2 = stream.Score() 
sCadence2.insert(0, partUpper) 
sCadence2.insert(0, partLower) 

# now let's play the new Score 
sCadence2_mf = sCadence2.midiFile 
sCadence2_mStr = sCadence2_mf.writestr() 
sCadence2_mStrFile = cStringIO.StringIO(sCadence2_mStr) 
play_music(sCadence2_mStrFile) 



## SOURCE NOTES 
## There are 3 sources for this mashup: 

# 1. Source for the Music21 Score Creation http://web.mit.edu/music21/doc/html/quickStart.html#creating-notes-measures-parts-and-scores 

# 2. Source for the Music21 MidiFile Class Behaviour http://mit.edu/music21/doc/html/moduleMidiBase.html?highlight=midifile#music21.midi.base.MidiFile 

# 3. Source for the pygame player: http://www.daniweb.com/software-development/python/code/216979/embed-and-play-midi-music-in-your-code-python 
8

あなたが見てきたように、music21は、音楽再生システムになるように設計されていないが、それは他の再生システム内に埋め込まれるように設計されてか、システム内からそれらを呼び出すこと。私たちは再生システムに多すぎる仕事をするつもりはありません(ハードウェアのサポート、小さな研究室なので、音楽分析などには依然として作業が必要です)が、あなたのソリューションは非常にエレガントですmusic21.midi.realtimeモジュールとしてmusic21(post v1.1)のすべてのバージョンに含まれています。

# Set up a detuned piano 
# (where each key has a random 
# but consistent detuning from 30 cents flat to sharp) 
# and play a Bach Chorale on it in real time. 

from music21 import * 
import random 
keyDetune = [] 
for i in range(0, 127): 
    keyDetune.append(random.randint(-30, 30)) 

b = corpus.parse('bach/bwv66.6') 
for n in b.flat.notes: 
    n.microtone = keyDetune[n.midi] 
sp = midi.realtime.StreamPlayer(b) 
sp.play() 

StreamPlayerの.play()関数でもできます。ここでは、動的にmicrotonal再生(ほとんどのMIDI再生のための大きな問題を)をシミュレートするために、異なるピッチベンドオブジェクトとMIDIチャンネルを割り当てるmusic21の能力を取る例です。 busyFunctionとbusyArgsとbusyWaitMillisecondsの引数をとります。ほとんどの場合busyWaitMillisecondsごとに引数を指定して呼び出す関数を指定します(システムの速度が遅い場合はさらに多くなる可能性があります)。何らかの種類のスレッド再生を設定したい場合に備えて、最後に呼び出されるendFunctionとendArgsもあります。 - Myke Cuthbert(音楽21作成者)

関連する問題