การแปลงค่า pitch bend (MIDI) เป็นค่า pitch“ ปกติ”


11

ฉันพยายามวิเคราะห์ออฟไลน์ LPC และการสังเคราะห์โดยใช้ rt_lpc (เวลาจริง LPC) การดำเนินการตามที่กำหนดที่นี่ มีฟังก์ชั่นบางอย่างภายในโปรแกรมที่สามารถใช้สำหรับการวิเคราะห์ LPC ออฟไลน์และโปรแกรมสังเคราะห์ รหัส rt_lpc นั้นส่วนใหญ่มีไว้สำหรับผู้แต่งเป็นต้นซึ่งหมายความว่ามันใช้ MIDI หรืออินพุตสัญญาณสายเสียง มีบางรหัสในโปรแกรมที่แปลงค่าระยะห่าง (ที่ได้จากการสัมพันธ์อัตโนมัติ) เป็นbendค่า ความสัมพันธ์มีดังนี้:

    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;

บางจุด: เป็นวัตถุประเภทที่ดูเหมือนว่าจะมีประชากรได้ทันที ข ยังเป็นวัตถุประเภทที่ดูเหมือนว่าจะมีประชากรได้ทันที ค. วัตถุทั้งสองนี้ถูกสร้างขึ้นเมื่อโปรแกรมทำงานแบบเรียลไทม์ (mine เป็นรุ่นออฟไลน์ที่รันส่วนที่เลือกไว้ใน main.cpp ของฉันเอง
ananyaMidiMsg
geMidiMsg

คำถามของฉัน:
1. pitch pitch คืออะไร?
2. ฉันจะแปลงค่าระดับเสียงเป็นค่าโค้งได้อย่างไร ความสัมพันธ์ของการทำแผนที่คืออะไร?

ฉันใช้วิธีแก้ปัญหา แต่ไม่พบคำตอบที่ชัดเจน

คำตอบ:


12

ที่แกนกลางของ MIDI เป็นตัวแทนของเพลงเป็นเหตุการณ์บันทึกไม่ต่อเนื่องแต่ละคนมีระดับเสียงคงที่ เหมาะอย่างยิ่งสำหรับการแสดงดนตรีที่เล่นบนคีย์บอร์ด คุณสามารถแปลงความถี่ใด ๆ ที่สอดคล้องกับบันทึกย่อในระดับอารมณ์เป็นหมายเลขบันทึก MIDI โดยใช้:

69+12×เข้าสู่ระบบ2RอีQยูอีnY440

ภายใต้สมมติฐานที่ว่าตัวรับสัญญาณ MIDI ถูกปรับเทียบสำหรับ A4 = 440 Hz

การเป็นตัวแทนนี้ไม่เป็นไรสำหรับเพลงเปียโน แต่ปัญหาคือทำอย่างไรถึงจะเป็นตัวแทนของโฆษณาที่ไม่ได้แมปกับระดับอารมณ์ (เพลงที่ไม่ใช่แบบตะวันตกไม่ใช่เสียงดนตรี) และวิธีการแสดงระดับเสียงในช่วงระยะเวลาของโน้ต (glissando, vibrato)

สิ่งนี้ทำได้ใน MIDI โดยใช้ "pitch bend Messages" ซึ่งสั่งให้ซินธิไซเซอร์เปลี่ยนระดับเสียงของโน้ตที่เล่นอยู่ในปัจจุบันโดยช่วงเวลาเล็ก ๆ ซินธิไซเซอร์ส่วนใหญ่จะทำการปรับเทียบตามค่าเริ่มต้นสำหรับ +/- 2 semitones ตลอดระยะพิทช์พิชของช่วงข้อความ (0 .. 16383) 8192 ไม่สอดคล้องกับระยะห่างระหว่างพิช - ระยะพิทที่ปล่อยออกมานั้นตรงกับค่าของโน้ต การทำแผนที่ระหว่างค่าการโค้งงอและอัตราส่วนการเปลี่ยนความถี่ได้รับจาก:

อีม.ผมเสื้อเสื้ออีd_nโอเสื้ออีnโอเสื้ออี_ม.อีssaก.อี=2พีผมเสื้อชั่วโมงอีnd-81924096×12

คุณสามารถรับความถี่ของโน้ตที่เล่นโดยซินเซียร์จากสูตรต่อไปนี้:

440×2nโอเสื้ออี-6912.0+พีผมเสื้อชั่วโมงอีnd-81924096×12

โดยที่noteคือหมายเลขบันทึก MIDI 7 บิตของข้อความNote On ที่ได้รับล่าสุด และpitchbendเป็นค่า 14 บิตของข้อความPitch bend ที่ได้รับล่าสุด เครื่องสังเคราะห์เริ่มต้นด้วย pitch pitch register register ที่ 8192 และค่านี้จะถูกรีเซ็ตระหว่างการรับข้อความ "รีเซ็ตตัวควบคุมทั้งหมด"

ให้เรานำตัวอย่างต่อไปนี้ คุณต้องการแสดงการไหลของขลุ่ยด้วยวิถีวิถีความถี่ต่อไปนี้: 500 Hz, 510 Hz, 500 Hz เป็นข้อความ MIDI

หมายเลขบันทึกพื้นฐานคือ:

Rโอยูnd(69+12×เข้าสู่ระบบ2(500/440))=71

ดังนั้นคุณจึงส่งข้อความ "note on" พร้อม note # เท่ากับ 71 ซึ่งเทียบเท่ากับระดับเสียงของ:

440×2(71-69)/12=493.88

ซึ่งเป็นสนามที่ใกล้ที่สุดในระดับอารมณ์ คุณต้องส่งข้อความ pitch pitch เพื่อเพิ่มระดับเสียงโดย:

500493.88=1.0124

และรับ 500 Hz ของคุณ ค่า pitch pitch ที่สอดคล้องกันคือ:

Rโอยูnd(8192+4096×12×ล.โอก.21.0124)=9065

รับ 510 Hz ของคุณค่า pitch pitch จะเป็นเท่าไร:

Rโอยูnd(8192+4096×12×ล.โอก.2510493.88)=10469

ดังนั้นลำดับข้อความ MIDI ของคุณสำหรับ 500, 510, 500 Hz น่าจะเป็น:

  • หมายเหตุ 71
  • PITCH BEND 9065
  • ...
  • PITCH BEND 10469
  • ...
  • PITCH BEND 9065

คุณสามารถคิดถึงหมายเลขโน้ต MIDI เป็นส่วน "อินทิกรัล" ของพิทช์; และสนามงอเป็นส่วน "เศษส่วน" ซ้ำซ้อนของสนาม


นอกจากนี้จากความเข้าใจของฉันของรหัส ge เป็นข้อความที่โค้งงอ; ge.data [2] MSB และ ge.data [1] LSB ของมัน อนัญญาคือข้อความที่บันทึกไว้ ananya.data [1] คือหมายเลขบันทึกและ ananya.data [2] ความเร็ว นอกจากการตั้งชื่อตัวแปรขี้ขลาดซึ่งดูเหมือนจะบ่งบอกถึงความโรแมนติกที่ซ่อนอยู่ระหว่างผู้เขียนรหัสฉันเห็น WTF ที่เป็นไปได้ที่นี่: มีบางสิ่งบางอย่างที่น่ากลัวในค่าคงที่ 1.0653f และ 11.0f ตัวเลือกที่สามารถอ่านได้คือ: 1.05946f และ 12.0f หรือ 1.06504f และ 11.0f ผู้เขียนดูเหมือนจะสมมติช่วงพิทช์เป็น +/- 1 octave ซึ่งเป็น WTF ที่เป็นไปได้อีกอันหนึ่ง
pichenettes

ROTFL ในส่วน "ซ่อนเร้นรัก"! ฉันไม่คิดว่าฉันเข้าใจสิ่งนี้อย่างถูกต้องแล้วโปรดอดทนกับฉัน ค่า pitch ได้มาจากฟังก์ชั่นautocorrelateซึ่งดูเหมือนว่าสำหรับฉันคือ MIDI Note ที่เป็นเอาต์พุต สังเกตmidi2pitchอาร์เรย์ในสูตรหรือไม่ ถ้าฉันพูดถูกนั่นหมายความว่าฉันยังคงไม่มีbendค่าหรือค่าจริงของระยะพิทช์เพื่อประเมินค่าการโค้งงอและไม่มีทางรับพวกมันเช่นกันเว้นแต่ฉันจะมีไฟล์ MIDI กรณีที่ง่ายของตัวแปรมากเกินไปและสมการน้อยเกินไป ฉันจะประมาณค่าโค้งค่าระยะห่างจริงและvelocityในกรณีนี้ได้อย่างไร
ศรีราม

คุณพยายามจะทำอะไร? แปลงคู่ pitch / power เป็นข้อความ MIDI หรือไม่? หรือแปลงข้อมูล MIDI เป็นระดับเสียงจริง รหัสที่ให้ไว้ข้างต้นจะแปลงคู่ของข้อความ MIDI note + pitch pitch ที่เข้ามา (ananya msg, ge msg) เป็นระยะเวลาหนึ่ง (ตัวแปร pitch) และ power (ตัวแปรพลังงาน) ฉันคิดว่าสิ่งนี้ถูกใช้เพื่อแทนที่การกระตุ้นของ LPC โดยตัวสังเคราะห์ที่ควบคุมโดยแป้นพิมพ์ MIDI - การเรียงลำดับเสียงเรียกเข้าแบบหยาบหรือเอฟเฟ็กต์ autotune
pichenettes

ดูอย่างรวดเร็วที่ rt_lpc.cpp ยืนยันว่าข้อความ MIDI ขาเข้าประเภท 0xe0 (BITCH PITCH) กำลังอัปเดตค่าระยะห่างของแนวโค้ง และข้อความ MIDI ขาเข้าประเภท 0x90 (NOTE ON) จะถูกคัดลอกลงในข้อความ "ananya" จากนั้นการสังเคราะห์ใหม่โดยใช้ระยะพิทซ์ที่แก้ไขจะกระทำโดยใช้ค่าเหล่านี้ ไม่แน่ใจว่าคุณต้องการทำอะไรจากที่นั่น
pichenettes

1
ใช่อินพุต MIDI อยู่ที่นี่แตกต่างอย่างสิ้นเชิงกับการแปลงสัญญาณสร้างสรรค์ มันไม่ได้เป็นส่วนหนึ่งของห่วงโซ่การวิเคราะห์ / สังเคราะห์ LPC ปกติ แต่อนุญาตให้อ่านพารามิเตอร์ (ระยะห่างและพลังงาน) แทนแป้นพิมพ์แทนที่จะสร้างขึ้นโดยโมดูลการวิเคราะห์ บางทีคุณอาจโพสต์คำถามใหม่ด้วยตัวอย่างของไฟล์เสียงและแยกวิถีพิทช์ในเฮิร์ตซ์เพื่อให้เราสามารถปรับทิศทางให้คุณใช้เทคนิคการประมาณพิทช์ที่มีประสิทธิภาพมากขึ้น ห้องสมุด Aubio มีตัวแปรติดตามระยะพิช
pichenettes

6

MIDI เป็นโปรโตคอลที่ช่วยให้ซินธิไซเซอร์ (ส่วนใหญ่) ควบคุมหรือควบคุมโดยซินธิไซเซอร์หรือคอมพิวเตอร์อื่น ๆ

มันเป็นโปรโตคอลแบบอนุกรมที่อนุญาตให้แลกเปลี่ยนข้อความเช่น "key C1 up" "key D4 down" "key speed," sound change "และอื่น ๆ ตัวควบคุมหลายตัวมี" pitch wheel "ซึ่งเป็นจอยสติกหรือ am modulation wheel ผู้เล่นสามารถเปลี่ยนระดับเสียงของโน้ตปัจจุบันที่เล่นด้วยตนเองเพื่อสร้าง vibrato หรือ "เลื่อน" อย่างต่อเนื่องจากโน้ตหนึ่งไปยังโน้ตถัดไปด้วยเหตุนี้บ่อยครั้งที่ผู้เล่นกีต้าร์ทำบ่อย ๆ โดยการงอสาย fretted ด้วยมือซ้าย สนามงอและด้วยเหตุนี้ชื่อ

ข้อความการโค้งงอ MIDI เป็นวิธีการสื่อสารว่าการเปลี่ยนระดับเสียงควรจะเกิดขึ้น ณ เวลาใดเวลาหนึ่ง synthesizer (ซอฟต์แวร์หรือฮาร์ดแวร์) ที่ได้รับข้อความ pitch pitch ควรเปลี่ยน pitch ของโน้ตปัจจุบันทั้งหมดที่เล่นตามจำนวนที่กำหนด

ข้อความควบคุมมีอาร์กิวเมนต์ที่เปลี่ยนจาก -8192 ถึง 8191 และในไฟล์ MIDI มาตรฐานสิ่งนี้ควรจะครอบคลุมช่วงจาก -200 เซ็นต์ถึง 200 เซ็นต์ซึ่ง 1 เปอร์เซ็นต์เป็นเซมิโทน 1/100 นั่นคืออัตราส่วน 2 ^ ( 1/1200) = 1.000577789506555 ตัวอย่าง: หากต้องการสร้างระดับพิชลงเพื่อให้ได้ 93% ของความถี่ที่กำหนดค่าของคอนโทรลเลอร์จะเป็น

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

หรือ -5146 ในกรณีนี้ 0.93 คืออัตราส่วนที่คุณต้องการ 12 จำนวนเซมิโคลอนต่ออ็อกเทฟ 2 ช่วงพิทช์พิทช์สูงสุด (200 เซ็นต์หรือ 2 เซมิโคลนในกรณีนี้) และ log2 () ลอการิทึมที่มีพื้นฐาน 2

อย่างไรก็ตามในการสังเคราะห์ส่วนใหญ่ช่วงสามารถกำหนดค่าได้และอาจไม่ใช่ความคิดที่ดีที่จะสันนิษฐานว่าซินธิไซเซอร์ทั้งหมดจะทำงานเหมือนกัน

นี่คือแผนภูมิการแปลงที่อาจช่วยได้ http://www.elvenminstrel.com/music/tuning/reference/pitchbends.shtml

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.