2016-03-26 17 views
1

Belirli bir melodide nota perdeleri (sadece isim, no oktav) arasında geçiş hızları almaya çalışıyorum. Örneğin, benim melodi seslerim (sırayla) CDEDFCBC ise, CD geçişinin 0,5 oranında, BC'nin 1 oranının, vb. Olması gerekir.Müzik21 bir not geçiş sayacı içeriyor mu?

Python'da bir işlev yazabilmem gerekir. Bu (muhtemelen çok fazla elifs kullanıyor ...) ama müziğe benziyor21 bunu da kolayca yapabilmeli. Dokümanlara baktım, Google, buradaki diğer sorular ... ve nasıl olduğunu anlayamadım ama sanırım benim için gerçekten faydalı olabilecek bir araç eksikliğim var.

+0

Sana vermek örnek geçiş oranlarını anlamıyorum: * neden * CD'de 0.5 ve * neden BC'nin 1. orana sahip olduğu var? – ironchicken

+0

Bu işlevi kendiniz yazmanız gerekeceğinden şüpheleniyorum. Bu müziği 21 bunu zaten göremiyorum. – ironchicken

+0

Tamam. İlk soruyla ilgili olarak, C-D, "C'den D'ye geçiş" anlamına gelir, C içinde olduğunuzu varsayarsak, Örnekte, C'den başlayan bir geçiş D'ye, diğeri ise B'ye gider. Bu yüzden her iki geçişe de aynı olasılığı veririm. Ama eğer B'de başlarsanız, örnekte sadece bir geçiş (B-C) vardır, yani oran birdir. –

cevap

0
Ben böyle bir şey yaptığını önermek istiyorum

:

Windowed hakkında

güzel şey trigram'ların oluşturmak kolaydır olmasıdır

from music21.ext.more_itertools import windowed 
from collections import Counter 
# assuming s is your Stream 
nameTuples = [] 
for n1, n2 in windowed(s.recurse().notes, 2): 
    nameTuples.append((n1.name, n2.name)) 
c = Counter(nameTuples) 
totalNotes = len(s.recurse().notes) # py2 cast to float 
{k : v/totalNotes for k, v in c.items()} 
vb

1

Aradığınız şey genellikle sözlüklerle işlenen bir tür bigram gösterimi. Bu biraz özensiz olabilir ama telefonu muhtemelen kolayca derli toplu yapabilirsiniz:

note_list = ...a list containing all notes in order 
bigram_dict = {} 
for note in range(1, len(note_list)): 
    bigram = (note -1, note) 
    if bigram not in bigram_dict: 
     bigram_dict[bigram] = 1/len(note_list) 
    else: 
     bigram_dict[bigram] += 1/len(note_list) 

Bu, her Bigram ait yüzdeleri verecektir. Python 2.x kullanıyorsanız, tamsayı/kayan nokta sorunlarını önlemek için bigram_dict[bigram += float(1/len(note_list)) yapmalısınız. Ayrıca, sözlük size sorun çıkarırsa, varsayılanı kullanmayı deneyebilirsiniz.

İlgili konular