Bir eğim büküm (MIDI) değerini “normal” bir perde değerine dönüştürme


11

Burada verildiği gibi rt_lpc (gerçek zamanlı LPC) uygulamasını kullanarak bir çevrimdışı LPC analizi ve sentezi deniyorum . Program içinde çevrimdışı bir LPC analiz ve sentez programı için kullanılabilecek bazı işlevler vardır. Rt_lpc kodu çoğunlukla besteciler vb. İçindir, yani bir MIDI veya glottal darbe girişi kullanır. Programda bir adım değerini (otomatik korelasyondan elde edilen) değere dönüştüren bazı kodlar vardır bend. İlişki aşağıdaki gibi verilir:

    pitch = (int)( Stk::sampleRate() / midi2pitch[ananya.data[1]] ) /
                            pow( 1.0653f, bend/64.0f*11.0f );
                    power *= ananya.data[2] / 64.0f;
bend = ge.data[1] / 128.0f + ge.data[2] - 64;

Bazı noktalar:
a. anında doldurulmuş gibi görünen ananyabir nesnedir MidiMsg.
b. geaynı zamanda MidiMsganında doldurulmuş gibi görünen bir nesnedir .
c. Bu iki nesne, program gerçek zamanlı olarak çalıştırıldığında oluşturulur (benimki, bir main.cpp dosyasında seçici bölümlerini çalıştıran çevrimdışı bir sürümdür.

Sorum (lar )
ım : 1. Zift eğimi nedir?
2. Bir adım değerini bir bükülme değerine nasıl dönüştürebilirim? Haritalama ilişkileri nelerdir?

Çözüm aramaya başladım, ancak net bir cevap bulamadım.

Yanıtlar:


12

MIDI'nin merkezinde, her biri statik bir perdeye sahip olan müziğin ayrı nota olayları olarak bir temsili vardır. Bu, klavye enstrümanlarında çalınan müziği temsil etmek için mükemmeldir. Temperli ölçekte bir nota karşılık gelen herhangi bir frekansı aşağıdakileri kullanarak bir MIDI nota numarasına dönüştürebilirsiniz:

69+12xgünlük2frequency440

MIDI alıcısının A4 = 440 Hz için kalibre edildiği varsayımı altında.

Bu temsil piyano müziği için uygundur, ancak sorun, temperlenmiş ölçeğe (batılı olmayan müzik, müzikal olmayan sesler) eşlenmemiş perdeleri nasıl temsil edeceğiniz ve bir notanın süresi boyunca perdelerin varyasyonlarının nasıl temsil edileceği (glissando, vibrato).

Bu MIDI'de, sentezleyiciye çalınan notanın perdesini küçük bir aralıkta kaydırmasını söyleyen "perde bükme mesajları" kullanılarak yapılır. Çoğu sentezleyici, aralık bükme mesajı aralığı (+/- 16383) boyunca +/- 2 yarı ton için varsayılan olarak kalibre edilir. 8192, hiçbir eğim eğimine karşılık gelmez - yayılan eğim, tam olarak notanın değerine eşittir. Eğim bükme değeri ile frekans kaydırma oranı arasındaki eşleme şu şekilde verilir:

fembentted_nÖtefnÖte_messbirge=2pbentchbend-81924096x12

Böylece, bir sentezleyici tarafından çalınan bir notanın frekansını aşağıdaki formülden alabilirsiniz:

440x2nÖte-6912.0+pbentchbend-81924096x12

Burada not , en son alınan Not Açık mesajının 7 bitlik MIDI not numarasıdır ; ve pitchbend son alınan Pitch bend mesajının 14 bit değeridir . Bir sentezleyici hatve bükme yazmacı 8192'ye ayarlanmış olarak başlar ve bu değer "Tüm kontrolörleri sıfırla" mesajının alınması sırasında da sıfırlanır.

Aşağıdaki örneği ele alalım. Aşağıdaki frekans yörüngesine sahip bir flüt trilini ifade etmek istiyorsunuz: MIDI mesajları olarak 500 Hz, 510 Hz, 500 Hz.

Temel nota numarası:

rÖund(69+12xgünlük2(500/440))=71

Böylece, nota 71'e eşit bir "not açık" mesajı gönderirsiniz. Bu, aşağıdakilere benzer:

440x2(71-69)/12=493,88

Temperli ölçekte en yakın adım olan. Perdeyi şu faktörlerle yükseltmek için perde bükme mesajı göndermeniz gerekir:

500493,88=1,0124

500 Hz'inizi alın. İlgili eğim bükme değeri:

rÖund(8192+4096x12xlÖg21,0124)=9065

510 Hz değerinizi elde etmek için eğim bükme değeri:

rÖund(8192+4096x12xlÖg2510493,88)=10469

500, 510, 500 Hz için MIDI mesaj diziniz şöyle olur:

  • NOT 71
  • PITCH BÜKME 9065
  • ...
  • PITCH BÜKME 10469
  • ...
  • PITCH BÜKME 9065

MIDI nota numarasını perdenin "ayrılmaz" kısmı olarak düşünebilirsiniz; ve zift, ziftin bir "kesirli" kısmı olarak bükülür.


Ayrıca, kodu anladığım kadarıyla, ge perde bükme mesajıdır; ge.data [2] MSB ve ge.data [1] LSB'dir. ananya mesajdaki nottur, ananya.data [1] not numarası ve ananya.data [2] hızdır. Kod yazarları arasında gizli bir romantizm ima eden funky değişken adının yanı sıra, burada potansiyel bir WTF görüyorum: 1.0653f ve 11.0f sabitlerinde balık gibi bir şey var. Okunabilir bir seçim şu şekildedir: 1.05946f ve 12.0f. Veya 1.06504f ve 11.0f. Yazarlar, bir başka potansiyel WTF olan +/- 1 oktavlık bir eğim aralığı olduğunu varsayarlar.
Mart'ta pichenettes

"Gizli romantizm" bölümünde ROTFL! Bunu doğru anladığımı sanmıyorum, bu yüzden bana eşlik et. Perde değeri autocorrelate, çıktı gibi görünen MIDI Notu gibi görünen fonksiyondan elde edilir . Edin midi2pitchformülde dizi? Eğer haklıysam, bu hala bendeğilme değerini tahmin etmek için perdenin değerine veya gerçek değerine sahip olmadığım anlamına gelir ve bir MIDI dosyası olmadıkça bunları almanın hiçbir yolu yoktur. Çok fazla değişken ve çok az denklem içeren basit bir durum. Bükülmeyi, gerçek eğim değerini ve velocitybu durumda nasıl tahmin edebilirim ?
Sriram

Ne yapmaya çalışıyorsun? Bir adım / güç çiftini MIDI mesajlarına dönüştürmek mi istiyorsunuz? Veya MIDI verilerini gerçek bir perdeye dönüştürür müsünüz? Yukarıda verilen kod, bir çift gelen MIDI notu + adım bükme mesajını (ananya msg, ge msg) bir noktaya (adım değişkeni) ve bir güce (güç değişkeni) dönüştürür. Bu LPC uyarma bir MIDI klavye tarafından kontrol edilen sentetik bir yerine - bir tür ham vocoder veya otomatik ayar etkisi yerine kullanılır düşünüyorum.
pichenettes

rt_lpc.cpp dosyasına hızlı bir bakış, 0xe0 (PITCH BEND) türünde gelen MIDI iletilerinin adım bükme değerini güncellediğini doğrular; ve 0x90 (NOT ON) türünden gelen MIDI iletileri "ananya" iletisine kopyalanır. Oradan, bu değerler kullanılarak değiştirilmiş bir adım kullanılarak yeniden sentez yapılır. Oradan ne yapmak istediğinizden emin değilim.
Ocak 12'de pichenettes

1
Evet, MIDI girişi, yaratıcı sinyal dönüşümü için tamamen farklı bir şey. Normal LPC analiz / sentez zincirinin bir parçası değildir; bunun yerine bazı parametrelerin (perde ve güç) analiz modülü tarafından üretilmek yerine bir klavyeden okunmasına izin verir. Belki bazı ses dosyası örnekleriyle yeni bir soru gönderebilir ve Hz'deki perde yörüngesini çıkarabiliriz, böylece sizi daha sağlam perde tahmin tekniklerine yönlendirebiliriz. Aubio kütüphanesinde birkaç saha takipçisi var.
12'de pichenettes

6

MIDI, (öncelikle) sentezleyicilerin diğer sentezleyiciler veya bilgisayarlar tarafından kontrol edilmesine veya kontrol edilmesine izin veren bir protokoldür.

Bu, "tuş C1 yukarı" "tuş D4 aşağı" "tuş hızı," ses değişikliği ", vb. Gibi mesajların değiş tokuş edilmesine izin veren seri bir protokoldür. manuel olarak vibrato oluşturmak için çalınmakta olan notanın perdesini etkileşimli olarak değiştirmek veya sürekli olarak bir notadan diğerine "kaydırmak" için, bu gitar çalıcılar tarafından sık sık ipin sol elleriyle bükülmesiyle yapılıyor. perde bükme ve böylece adı.

MIDI eğim bükme mesajı, herhangi bir zamanda eğim kaydırmanın ne kadar olması gerektiğini bildirmenin bir yoludur. Perde bükme mesajı alan bir sentezleyicinin (yazılım veya donanım), verilen miktarda çalınmakta olan tüm notların perdesini değiştirmesi beklenir.

Denetleyici iletisinin -8192'den 8191'e kadar olan bir argümanı vardır ve standart MIDI dosyalarında bunun -200 cent ile 200 cent aralığını kapsaması beklenir, burada 1 cent 1/100 yarı ton, yani 2 ^ oranındadır ( 1/1200) = 1.000577789506555. Örnek: nominal frekansın% 93'üne ulaşmak için aşağı doğru bir adım kaydırma oluşturmak için kontrolör değeri

c = round(log2(.93)*12*8192/2);

veya bu durumda -5146. 0.93 istediğiniz oran, 12 oktav başına yarı ton sayısı, 2 maksimum perde eğimi aralığı (bu durumda 200 cent veya 2 yarı ton) ve logaritmayı temel 2 ile log2 ().

Bununla birlikte, çoğu sentezleyicide aralık yapılandırılabilir ve muhtemelen tüm sentezleyicilerin aynı şekilde davrandığını varsaymak iyi bir fikir değildir.

İşte size yardımcı olabilecek bir dönüşüm tablosu. http://www.elvenminstrel.com/music/tuning/reference/pitchbends.shtml

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.