Mengubah nilai pitch bend (MIDI) ke nilai pitch "normal"

11

Saya mencoba analisis dan sintesis LPC offline menggunakan implementasi rt_lpc (LPC real-time) seperti yang diberikan di sini . Ada beberapa fungsi dalam program yang dapat digunakan untuk analisis LPC offline dan program sintesis. Kode rt_lpc sebagian besar dimaksudkan untuk komposer dll, yang berarti bahwa ia menggunakan input pulsa MIDI atau glottal. Ada beberapa kode dalam program yang mengubah nilai nada (diperoleh dari korelasi-otomatis) ke bendnilai tersebut. Relasinya diberikan sebagai berikut:

    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;

Beberapa poin:
a. ananyaadalah objek bertipe MidiMsgyang sepertinya dihuni dengan cepat.
b. gejuga merupakan objek bertipe MidiMsgyang juga tampaknya dihuni dengan cepat.
c. Dua objek ini dibuat ketika program dijalankan secara real-time (milik saya adalah versi offline yang menjalankan bagian selektif di main.cpp saya sendiri.

Pertanyaan saya:
1. Apakah pitch bend itu?
2. Bagaimana cara mengubah nilai nada menjadi nilai tikungan? Apa hubungan pemetaan?

Saya telah mencari solusi di Google, tetapi tidak menemukan jawaban yang jelas.

Sriram
sumber

Jawaban:

12

Pada intinya MIDI adalah representasi musik sebagai peristiwa catatan diskrit, masing-masing memiliki nada statis. Ini sempurna untuk merepresentasikan musik yang dimainkan pada instrumen keyboard. Anda dapat mengubah frekuensi apa pun yang terkait dengan catatan pada skala temper menjadi nomor catatan MIDI, menggunakan:

69+12×log2frequency440

Dengan asumsi bahwa penerima MIDI dikalibrasi untuk A4 = 440 Hz.

Representasi ini baik untuk musik piano, tetapi masalahnya adalah bagaimana merepresentasikan nada yang tidak dipetakan ke skala temper (musik non-barat, suara non musik), dan bagaimana merepresentasikan variasi nada selama durasi not (glissando, vibrato).

Ini dilakukan dalam MIDI dengan menggunakan "pesan lengkungan nada" yang menginstruksikan synthesizer untuk menggeser nada not yang saat ini diputar dengan interval kecil. Sebagian besar synthesizer dikalibrasi secara default untuk +/- semitones selama rentang pesan pitch bend (0 .. 16383). 8192 sesuai dengan no pitch bending - pitch yang dipancarkan persis dengan nilai not. Pemetaan antara nilai lengkungan pitch dan rasio pergeseran frekuensi diberikan oleh:

femitted_notefnote_message=2pitchbend81924096×12

Dengan demikian Anda bisa mendapatkan frekuensi not yang dimainkan oleh syntheszier dari rumus berikut:

440×2note6912.0+pitchbend81924096×12

Di mana note adalah nomor note MIDI 7-bit dari pesan Note On yang terakhir diterima ; dan pitchbend adalah nilai 14-bit dari pesan Pitch bend yang terakhir diterima . Sebuah synthesizer dimulai dengan register pitch bendnya diatur ke 8192, dan nilai ini juga diatur ulang selama penerimaan pesan "Reset semua pengontrol".

Mari kita ambil contoh berikut ini. Anda ingin mengekspresikan flute trill dengan lintasan frekuensi berikut: 500 Hz, 510 Hz, 500 Hz, sebagai pesan MIDI.

Nomor catatan dasar adalah:

round(69+12×log2(500/440))=71 .

Jadi, Anda mengirim pesan "note on" dengan note # sama dengan 71. Ini setara dengan nada:

440×2(7169)/12=493.88

Yang merupakan nada terdekat pada skala temper. Anda perlu mengirim pesan lengkungan pitch untuk menaikkan pitch dengan faktor:

500493.88=1.0124

Dan dapatkan 500 Hz Anda. Nilai lengkungan pitch yang sesuai adalah:

round(8192+4096×12×log21.0124)=9065

Untuk mendapatkan 510 Hz Anda, nilai pitch bend adalah:

round(8192+4096×12×log2510493.88)=10469

Jadi urutan pesan MIDI Anda untuk 500, 510, 500 Hz adalah:

  • CATATAN 71
  • PITCH BEND 9065
  • ...
  • PITCH BEND 10469
  • ...
  • PITCH BEND 9065

Anda dapat menganggap nomor not MIDI sebagai bagian "integral" dari pitch; dan pitch bend sebagai bagian "fraksional" yang berlebihan dari pitch.

pichenettes
sumber
Juga, dari pemahaman saya tentang kode, ge adalah pesan lengkungan; ge.data [2] MSB-nya dan ge.data [1] LSB-nya. ananya adalah catatan pada pesan, ananya.data [1] adalah nomor catatan dan ananya.data [2] kecepatannya. Selain penamaan variabel yang tampaknya menyiratkan romansa tersembunyi antara penulis kode, saya melihat WTF potensial di sini: ada sesuatu yang mencurigakan di konstanta 1.0653f dan 11.0f. Pilihan yang bisa dibaca adalah: 1.05946f dan 12.0f. Atau 1.06504f dan 11.0f. Para penulis tampaknya mengasumsikan kisaran lengkungan nada +/- 1 oktaf, yang merupakan potensi WTF lainnya.
pichenettes
ROTFL pada bagian "romansa tersembunyi"! Kurasa aku tidak mengerti ini dengan benar, jadi bersabarlah. Nilai pitch diperoleh dari fungsi autocorrelate, yang bagi saya sepertinya adalah MIDI Note yang merupakan output. Perhatikan midi2pitcharray dalam rumus? Jika saya benar, itu berarti bahwa saya masih belum memiliki bendnilai atau nilai aktual pitch untuk memperkirakan nilai tikungan, dan tidak ada cara untuk mendapatkannya juga kecuali saya memiliki file MIDI. Kasus sederhana dari terlalu banyak variabel dan terlalu sedikit persamaan. Bagaimana cara memperkirakan tikungan, nilai pitch aktual, dan velocitydalam hal ini?
Sriram
Apa yang sedang Anda coba lakukan? Mengonversi pasangan nada / kekuatan menjadi pesan MIDI? Atau mengonversi data MIDI ke pitch yang sebenarnya? Kode yang diberikan di atas mengonversi pasangan pesan MIDI note + pitch bend yang masuk (pesan ananya, pesan ge) menjadi periode (variabel pitch) dan daya (variabel daya). Saya pikir ini digunakan untuk menggantikan eksitasi LPC dengan yang sintetis yang dikendalikan oleh keyboard MIDI - semacam vocoder mentah atau efek autotune.
pichenettes
pandangan cepat pada rt_lpc.cpp mengkonfirmasi bahwa pesan MIDI yang masuk dari tipe 0xe0 (PITCH BEND) sedang memperbarui nilai pitch bend; dan bahwa pesan MIDI yang masuk dari tipe 0x90 (CATATAN AKTIF) disalin ke dalam pesan "ananya". Dari sana, resintesis menggunakan pitch yang dimodifikasi dilakukan menggunakan nilai-nilai ini. Tidak yakin apa yang ingin Anda lakukan dari sana.
pichenettes
1
Ya, input MIDI di sini adalah hal yang sama sekali berbeda untuk transformasi sinyal kreatif. Ini bukan bagian dari analisis LPC normal / rantai sintesis; tetapi sebaliknya memungkinkan beberapa parameter (pitch dan power) untuk dibaca dari keyboard daripada diproduksi oleh modul analisis. Mungkin Anda dapat memposting pertanyaan baru dengan beberapa contoh file audio, dan mengekstrak lintasan pitch dalam Hz, sehingga kami dapat mengarahkan Anda ke teknik estimasi pitch yang lebih kuat. Perpustakaan Aubio memiliki beberapa varian pelacak pitch.
pichenettes
6

MIDI adalah protokol yang memungkinkan (terutama) synthesizer untuk mengontrol atau dikendalikan oleh synthesizer atau komputer lainnya.

Ini adalah protokol serial yang memungkinkan untuk bertukar pesan seperti "kunci C1 atas" "kunci D4 turun" "kecepatan tombol," perubahan suara ", dll. Banyak pengendali memiliki" pitch wheel "yang merupakan joystick atau roda modulasi. Ini memungkinkan pemain untuk secara interaktif mengubah nada not saat ini dimainkan untuk secara manual membuat vibrato atau untuk terus "geser" dari satu not ke yang berikutnya. Seperti ini sering dilakukan oleh pemain gitar dengan menekuk senar fret dengan tangan kiri mereka, sering disebut pitch bending dan karenanya namanya.

Pesan lengkungan nada MIDI adalah cara untuk mengkomunikasikan berapa banyak pergeseran nada yang seharusnya terjadi pada suatu titik waktu tertentu. Sebuah synthesizer (perangkat lunak atau perangkat keras) yang menerima pesan lengkung nada diharapkan untuk mengubah nada semua nada saat ini dimainkan oleh jumlah yang diberikan.

Pesan controller memiliki argumen yang bergerak dari -8192 ke 8191 dan dalam file MIDI standar ini seharusnya mencakup kisaran dari -200 sen hingga 200 sen, di mana 1 sen adalah 1/100 semitone, yaitu rasio 2 ^ ( 1/1200) = 1.000577789506555. Contoh: untuk membuat pergeseran nada ke bawah untuk mencapai 93% dari frekuensi nominal, nilai pengontrolnya adalah

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

atau -5146 dalam hal ini. 0,93 adalah rasio yang Anda inginkan, 12 jumlah semiton per oktaf, 2 rentang tikungan max pitch (200 sen atau 2 semitones dalam kasus ini), dan log2 () logaritma dengan basis 2.

Namun, di sebagian besar synthesizer rentang dapat dikonfigurasi dan mungkin bukan ide yang baik untuk mengasumsikan bahwa semua synthesizer berperilaku sama.

Berikut adalah bagan konversi yang dapat membantu. http://www.elvenminstrel.com/music/tuning/reference/pitchbends.shtml

Hilmar
sumber