สารบัญ:

ตัวแปลงเสียงแบบเรียลไทม์เป็น MIDI: 7 ขั้นตอน
ตัวแปลงเสียงแบบเรียลไทม์เป็น MIDI: 7 ขั้นตอน

วีดีโอ: ตัวแปลงเสียงแบบเรียลไทม์เป็น MIDI: 7 ขั้นตอน

วีดีโอ: ตัวแปลงเสียงแบบเรียลไทม์เป็น MIDI: 7 ขั้นตอน
วีดีโอ: Audio to MIDI | วิธีแปลงไฟล์เสียงให้เป็น MIDI ด้วยโปรแกรม Ableton Live 2024, กรกฎาคม
Anonim
ตัวแปลงเสียงเป็น MIDI แบบเรียลไทม์
ตัวแปลงเสียงเป็น MIDI แบบเรียลไทม์

ชาวนมัสเต! นี่เป็นโครงการที่ฉันทำงานให้กับหนึ่งในหลักสูตรของฉัน (การประมวลผลสัญญาณดิจิทัลแบบเรียลไทม์) ในหลักสูตรปริญญาตรีของฉัน โครงการนี้มีจุดมุ่งหมายเพื่อสร้างระบบ DSP ที่ "ฟัง" ข้อมูลเสียงและส่งออกข้อความ MIDI ของบันทึกที่เกี่ยวข้องผ่าน UART Arduino Nano ถูกใช้เพื่อการนี้ เรื่องสั้นสั้น ๆ ว่าไมโครคอนโทรลเลอร์ทำ FFT กับข้อมูลเสียงที่เข้ามาและทำการวิเคราะห์จุดสูงสุดและส่งข้อความ MIDI ที่เหมาะสม ไม่ต้องกังวลเกี่ยวกับ MOSFET เพราะสำหรับโปรเจ็กต์อื่น (ซึ่งจะใส่ในภายหลังในคำสั่งสอนเช่นกัน) และไม่จำเป็นสำหรับโปรเจ็กต์นี้ มาเริ่มกันเลยดีกว่า!!

ขั้นตอนที่ 1: ส่วนประกอบที่จำเป็น

ส่วนประกอบที่จำเป็น
ส่วนประกอบที่จำเป็น

เราต้องการส่วนประกอบต่อไปนี้เพื่อสร้างโปรเจ็กต์นี้ แม้ว่าส่วนประกอบเหล่านี้ส่วนใหญ่จะเป็นแบบทั่วไปและสามารถใช้แทนกันได้ อ้างอิงแผนภาพวงจรเพื่อดำเนินการและค้นหาการใช้งานที่ดีขึ้น

ปริมาณส่วนประกอบ

1. ไมโครโฟนอิเล็กเตรต 1

2. ตัวต้านทาน 30 กิโลโอห์ม 1

3. ตัวต้านทาน 150 กิโลโอห์ม 1

4. ตัวต้านทาน 100 โอห์ม 1

5. ตัวต้านทาน 2.2 กิโลโอห์ม 3

6. หม้อที่ตั้งไว้ล่วงหน้า 10 กิโลโอห์ม 1

7. หม้อทริมเมอร์ 10 กิโลโอห์ม 1

8. หม้อสเตอริโอ 47 กิโลโอห์ม 1

9. ตัวต้านทาน 470 โอห์ม 2

10. ตัวเก็บประจุ 0.01uF 2

11. ตัวเก็บประจุ 2.2uF 3

12. ตัวเก็บประจุ 47uF 2

13. ตัวเก็บประจุ 1000uF 1

14. ตัวเก็บประจุ 470uF 1

15. 7805 ตัวควบคุมแรงดันไฟฟ้า 1

16. แถบส่วนหัวหญิงและชาย. คนละ 1 ตัว

17. ขั้วต่อแจ็คบาร์เรล 1

18. อะแดปเตอร์ DC 12 V 1 แอมป์ 1

19. สวิตช์ SPST (ไม่บังคับ) 1

20. เพอร์ฟบอร์ด 1

ขั้นตอนที่ 2: ข้อกำหนดทางเทคนิค

ข้อกำหนดทางเทคนิค
ข้อกำหนดทางเทคนิค

ความถี่ในการสุ่มตัวอย่าง: 3840 ตัวอย่าง/วินาที

จำนวนตัวอย่างต่อ FFT: 256

ความละเอียดความถี่: 15Hz

อัตราการรีเฟรช: ประมาณ 15 Hz

โน้ตดนตรีระดับล่างและสูงกว่าไม่ได้บันทึกอย่างถูกต้อง โน้ตตัวล่างได้รับผลกระทบจากความละเอียดความถี่ต่ำในขณะที่ความถี่สูงได้รับผลกระทบจากอัตราการสุ่มตัวอย่างต่ำ Arduino มีหน่วยความจำไม่เพียงพอ ดังนั้นจึงไม่มีทางได้ความละเอียดที่ดีกว่านี้ และความละเอียดที่ดีกว่าจะต้องแลกมาด้วยอัตราการรีเฟรชที่ลดลง ดังนั้นการประนีประนอมยอมความอย่างหลีกเลี่ยงไม่ได้ หลักการความไม่แน่นอนของไฮเซนเบิร์กรุ่นธรรมดา

ความยากหลักคือระยะห่างเลขชี้กำลังระหว่างโน้ต (ดังรูป ทุกแรงกระตุ้นบนแกนความถี่คือโน้ตดนตรี) อัลกอริทึมอย่าง LFT อาจช่วยได้ แต่นั่นค่อนข้างขั้นสูงและซับซ้อนเล็กน้อยสำหรับอุปกรณ์อย่าง Arduino Nano

ขั้นตอนที่ 3: แผนภาพวงจร

แผนภาพวงจร
แผนภาพวงจร
แผนภาพวงจร
แผนภาพวงจร
แผนภาพวงจร
แผนภาพวงจร
แผนภาพวงจร
แผนภาพวงจร

หมายเหตุ: อย่ากังวลกับ MOSFET สามตัวและขั้วต่อสกรูในภาพ ไม่จำเป็นสำหรับโครงการนี้ โปรดสังเกตว่าบอร์ดอินพุตไมโครโฟนสามารถถอดออกได้หรือที่เรียกว่าโมดูลาร์ คำอธิบายเล็ก ๆ ของบล็อกต่าง ๆ ได้รับด้านล่าง

1) ตัวต้านทาน 470 โอห์มสองตัวรวมสัญญาณเสียงสเตอริโอเป็นสัญญาณเสียงโมโน ตรวจสอบให้แน่ใจว่ากราวด์ของสัญญาณไปที่กราวด์เสมือน (vg ในแผนภาพวงจร) และไม่ใช่กราวด์ของวงจร

2) บล็อกถัดไปคือตัวกรองสัญญาณความถี่ต่ำอันดับ 2 sallen-key ซึ่งรับผิดชอบแบนด์วิดท์ที่จำกัดสัญญาณอินพุตเพื่อหลีกเลี่ยงการสร้างนามแฝง เนื่องจากเรากำลังทำงานกับแหล่งจ่าย +12v เท่านั้น เราจึงอคติกับ op-amp โดยสร้างตัวแบ่งแรงดัน RC ที่หลอก op-amp ให้คิดว่าอุปทานคือแหล่งจ่ายไฟ 6 0 -6 โวลต์ (รางคู่) โดยที่ vg เป็นการอ้างอิงภาคพื้นดินสำหรับ op amp

3) จากนั้นเอาต์พุตจะถูกกรองความถี่ต่ำเพื่อป้องกัน DC offset 6 โวลต์และประกอบกับ DC ประมาณ 0.55 โวลต์เนื่องจาก ADC จะได้รับการกำหนดค่าให้ใช้ภายใน 1.1 v เป็น Vref

หมายเหตุ: พรีแอมพลิฟายเออร์สำหรับไมโครโฟนอิเล็กเตรตไม่ใช่วงจรที่ดีที่สุดในอินเทอร์เน็ต วงจรที่เกี่ยวข้องกับ op-amp น่าจะเป็นทางเลือกที่ดีกว่า เราต้องการให้การตอบสนองความถี่แบนราบมากที่สุด หม้อสเตอริโอขนาด 47 กิโลโอห์มใช้เพื่อกำหนดความถี่คัตออฟ ซึ่งโดยทั่วไปควรเป็นครึ่งหนึ่งของความถี่สุ่มตัวอย่าง ค่าที่ตั้งไว้ล่วงหน้า 10 กิโลโอห์ม (หม้อขนาดเล็กที่มีหัวสีขาว) ใช้เพื่อปรับเกนและค่า Q ของฟิลเตอร์ หม้อทริมเมอร์ 10 กิโลโอห์ม (อันหนึ่งมีปุ่มปรับเสียงโลหะที่ดูเหมือนสกรูหัวแบนขนาดเล็ก) ใช้เพื่อตั้งค่าแรงดันไฟให้ใกล้เคียงกับ Vref ครึ่งหนึ่ง

หมายเหตุ: เมื่อคุณเชื่อมต่อนาโนกับพีซี ให้เปิดสวิตช์ SPST ไว้อย่างอื่นปิด ระวังเป็นพิเศษหากไม่ทำเช่นนั้นอาจเป็นอันตรายต่อวงจร/คอมพิวเตอร์/ตัวควบคุมแรงดันไฟฟ้า หรือส่วนประกอบใดๆ ข้างต้น

ขั้นตอนที่ 4: แอปพลิเคชันและ IDE ที่จำเป็น

แอปพลิเคชันและ IDE ที่จำเป็น
แอปพลิเคชันและ IDE ที่จำเป็น
แอปพลิเคชันและ IDE ที่จำเป็น
แอปพลิเคชันและ IDE ที่จำเป็น
แอปพลิเคชันและ IDE ที่จำเป็น
แอปพลิเคชันและ IDE ที่จำเป็น
แอปพลิเคชันและ IDE ที่จำเป็น
แอปพลิเคชันและ IDE ที่จำเป็น
  1. สำหรับการเข้ารหัส Arduino Nano ฉันใช้ AVR studio 5.1 ดั้งเดิมเพราะดูเหมือนว่าจะใช้งานได้สำหรับฉัน คุณสามารถค้นหาโปรแกรมติดตั้งได้ที่นี่
  2. สำหรับการเขียนโปรแกรม Arduino Nano ฉันใช้ Xloader เครื่องมือน้ำหนักเบาที่ใช้งานง่ายจริงๆ เพื่อเบิร์นไฟล์.hex ไปยัง Arduinos คุณสามารถรับได้ที่นี่
  3. สำหรับโปรเจ็กต์โบนัสเล็ก ๆ น้อย ๆ และการปรับวงจร ฉันใช้การประมวลผล คุณสามารถรับได้จากที่นี่ แม้ว่าจะมีการเปลี่ยนแปลงครั้งสำคัญในการแก้ไขทุกครั้ง ดังนั้นคุณอาจต้องใช้ฟังก์ชันที่เลิกใช้แล้วเพื่อให้ภาพสเก็ตช์ทำงานได้
  4. FL studio หรือซอฟต์แวร์ประมวลผล MIDI อื่น ๆ คุณสามารถรับเวอร์ชันจำกัดการเข้าถึง FL studio ได้ฟรีจากที่นี่
  5. MIDI แบบวนรอบสร้างพอร์ต MIDI เสมือนและตรวจพบโดยสตูดิโอ FL ราวกับว่าเป็นอุปกรณ์ MIDI รับสำเนาเดียวกันจากที่นี่
  6. MIDI แบบไม่มีขนใช้เพื่ออ่านข้อความ MIDI จากพอร์ต COM และส่งไปยังพอร์ต MIDI แบบวนซ้ำ นอกจากนี้ยังดีบักข้อความ MIDI แบบเรียลไทม์ซึ่งทำให้การดีบักสะดวก รับ MIDI แบบไม่มีขนจากที่นี่

ขั้นตอนที่ 5: รหัสที่เกี่ยวข้องสำหรับทุกสิ่ง

ฉันขอขอบคุณ Electronic Lifes MFG (เว็บไซต์ที่นี่!!) สำหรับห้องสมุด FFT จุดคงที่ที่ฉันใช้ในโปรเจ็กต์นี้ ห้องสมุดได้รับการปรับให้เหมาะกับตระกูล mega AVR นี่คือลิงค์ไปยังไฟล์ไลบรารีและรหัสที่เขาใช้ ฉันกำลังแนบรหัสของฉันด้านล่าง รวมถึงร่างการประมวลผลและรหัส AVR C ด้วย โปรดทราบว่านี่คือการกำหนดค่าที่เหมาะกับฉัน และฉันจะไม่รับผิดชอบใดๆ ทั้งสิ้น หากคุณสร้างความเสียหายให้กับสิ่งใดเนื่องจากรหัสเหล่านี้ นอกจากนี้ ฉันมีปัญหามากมายในการพยายามทำให้โค้ดทำงาน ตัวอย่างเช่น DDRD (Data Direction Register) มี DDDx (x = 0-7) เป็นบิตมาสก์แทนที่จะเป็น DDRDx ทั่วไป (x = 0-7) ระวังข้อผิดพลาดเหล่านี้ขณะรวบรวม นอกจากนี้ การเปลี่ยนไมโครคอนโทรลเลอร์ยังส่งผลต่อคำจำกัดความเหล่านี้ ดังนั้นโปรดจับตาดูสิ่งนี้ให้ดีในขณะที่จัดการกับข้อผิดพลาดในการรวบรวม และถ้าคุณสงสัยว่าทำไมโฟลเดอร์โปรเจ็กต์ถึงเรียกว่า DDT_Arduino_328p.rar สมมุติว่าตอนผมเริ่มทำงานมันมืดมากในตอนเย็น และฉันขี้เกียจจนไม่เปิดไฟ:NS

เมื่อมาถึงร่างการประมวลผล ฉันใช้การประมวลผล 3.3.6 เพื่อเขียนแบบร่างนี้ คุณจะต้องตั้งค่าหมายเลขพอร์ต COM ในแบบร่างด้วยตนเอง คุณสามารถตรวจสอบความคิดเห็นในรหัส

หากใครสามารถช่วยฉันพอร์ตรหัสไปยัง Arduino IDE และเวอร์ชันการประมวลผลล่าสุดได้ ฉันยินดีเป็นอย่างยิ่งและจะให้เครดิตกับนักพัฒนา\ผู้ให้การสนับสนุนด้วยเช่นกัน

ขั้นตอนที่ 6: การตั้งค่า

  1. เปิดโค้ดและคอมไพล์โค้ดด้วย #define pcvisual uncommented และ #define midi_out แสดงความคิดเห็น
  2. เปิด xloader และเรียกดูไดเร็กทอรีด้วยโค้ด เรียกดูไฟล์.hex และเบิร์นไปที่ nano โดยเลือกบอร์ดและพอร์ต COM ที่เหมาะสม
  3. เปิดแบบร่างการประมวลผลและเรียกใช้ด้วยดัชนีพอร์ต COM ที่เหมาะสม หากทุกอย่างเป็นไปด้วยดี คุณควรจะเห็นสเปกตรัมของสัญญาณที่ขา A0
  4. หาไขควงและหมุนหม้อทริมเมอร์จนกว่าสเปกตรัมจะแบน (ส่วนประกอบ DC ควรใกล้ศูนย์) อย่าป้อนสัญญาณใด ๆ ไปที่บอร์ดแล้ว (ห้ามติดโมดูลไมโครโฟน)
  5. ตอนนี้ใช้เครื่องมือตัวสร้างการกวาดในลักษณะนี้เพื่อป้อนข้อมูลไปยังบอร์ดจากไมโครโฟนและสังเกตสเปกตรัม
  6. หากคุณไม่เห็นการกวาดความถี่ ให้ลดความถี่ตัดโดยเปลี่ยนความต้านทาน 47 กิโลโอห์ม นอกจากนี้ยังเพิ่มเกนโดยใช้หม้อที่ตั้งไว้ล่วงหน้า 10 กิโลโอห์ม พยายามให้ได้ผลลัพธ์การกวาดที่ราบเรียบและโดดเด่นโดยการเปลี่ยนพารามิเตอร์เหล่านี้ นี่คือส่วนที่สนุก (โบนัสเล็กน้อย!) เล่นเพลงโปรดของคุณและเพลิดเพลินไปกับสเปกตรัมแบบเรียลไทม์ (ดูวิดีโอ)
  7. ตอนนี้คอมไพล์โค้ด C แบบฝังอีกครั้งด้วย #define pcvisual แสดงความคิดเห็น และ #define midi_out uncommented
  8. โหลดโค้ดที่คอมไพล์ใหม่ลงใน arduino Nano
  9. เปิด LoopMidi และสร้างพอร์ตใหม่
  10. เปิดสตูดิโอ FL หรือซอฟต์แวร์อินเทอร์เฟซ MIDI อื่นๆ และตรวจสอบให้แน่ใจว่ามองเห็นพอร์ต midi แบบวนซ้ำได้ในการตั้งค่าพอร์ต MIDI
  11. เปิด MIDI แบบไม่มีขนโดยเชื่อมต่อกับ Arduino เลือกพอร์ตเอาต์พุตเป็นพอร์ต LoopMidi ไปที่การตั้งค่าและตั้งค่าอัตราบอดเป็น 115200 ตอนนี้เลือกพอร์ต COM ที่สอดคล้องกับ Arduino Nano และเปิดพอร์ต
  12. เล่นโทนเสียง "บริสุทธิ์" ใกล้ๆ ไมโครโฟน และคุณควรได้ยินเสียงโน้ตที่เกี่ยวข้องในซอฟต์แวร์ MIDI ด้วยเช่นกัน หากไม่มีการตอบสนอง ให้ลองลดระดับ up_threshold ที่กำหนดไว้ในโค้ด C หากโน้ตถูกเรียกแบบสุ่ม ให้เพิ่มค่า up_threshold
  13. รับเปียโนของคุณและทดสอบว่าระบบของคุณเร็วแค่ไหน!! สิ่งที่ดีที่สุดคือในโซนล็อกสีทองของโน้ต มันสามารถตรวจจับการกดปุ่มพร้อมกันหลายปุ่มได้อย่างง่ายดาย

หมายเหตุ: เมื่อแอปพลิเคชันหนึ่งเข้าถึงพอร์ต COM แอปพลิเคชันอื่นจะไม่สามารถอ่านได้ ตัวอย่างเช่น หาก Hairless MIDI กำลังอ่านพอร์ต COM Xloader จะไม่สามารถแฟลชบอร์ดได้

ขั้นตอนที่ 7: ผลลัพธ์/วิดีโอ

แค่นั้นแหละ! หวังว่าคุณจะชอบมัน. หากคุณมีข้อเสนอแนะหรือการปรับปรุงในโครงการแจ้งให้เราทราบในส่วนความคิดเห็น สันติภาพ!

แนะนำ: