สารบัญ:
- ขั้นตอนที่ 1: ส่วนประกอบที่จำเป็น
- ขั้นตอนที่ 2: ข้อกำหนดทางเทคนิค
- ขั้นตอนที่ 3: แผนภาพวงจร
- ขั้นตอนที่ 4: แอปพลิเคชันและ IDE ที่จำเป็น
- ขั้นตอนที่ 5: รหัสที่เกี่ยวข้องสำหรับทุกสิ่ง
- ขั้นตอนที่ 6: การตั้งค่า
- ขั้นตอนที่ 7: ผลลัพธ์/วิดีโอ
วีดีโอ: ตัวแปลงเสียงแบบเรียลไทม์เป็น MIDI: 7 ขั้นตอน
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:04
ชาวนมัสเต! นี่เป็นโครงการที่ฉันทำงานให้กับหนึ่งในหลักสูตรของฉัน (การประมวลผลสัญญาณดิจิทัลแบบเรียลไทม์) ในหลักสูตรปริญญาตรีของฉัน โครงการนี้มีจุดมุ่งหมายเพื่อสร้างระบบ 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 ที่จำเป็น
- สำหรับการเข้ารหัส Arduino Nano ฉันใช้ AVR studio 5.1 ดั้งเดิมเพราะดูเหมือนว่าจะใช้งานได้สำหรับฉัน คุณสามารถค้นหาโปรแกรมติดตั้งได้ที่นี่
- สำหรับการเขียนโปรแกรม Arduino Nano ฉันใช้ Xloader เครื่องมือน้ำหนักเบาที่ใช้งานง่ายจริงๆ เพื่อเบิร์นไฟล์.hex ไปยัง Arduinos คุณสามารถรับได้ที่นี่
- สำหรับโปรเจ็กต์โบนัสเล็ก ๆ น้อย ๆ และการปรับวงจร ฉันใช้การประมวลผล คุณสามารถรับได้จากที่นี่ แม้ว่าจะมีการเปลี่ยนแปลงครั้งสำคัญในการแก้ไขทุกครั้ง ดังนั้นคุณอาจต้องใช้ฟังก์ชันที่เลิกใช้แล้วเพื่อให้ภาพสเก็ตช์ทำงานได้
- FL studio หรือซอฟต์แวร์ประมวลผล MIDI อื่น ๆ คุณสามารถรับเวอร์ชันจำกัดการเข้าถึง FL studio ได้ฟรีจากที่นี่
- MIDI แบบวนรอบสร้างพอร์ต MIDI เสมือนและตรวจพบโดยสตูดิโอ FL ราวกับว่าเป็นอุปกรณ์ MIDI รับสำเนาเดียวกันจากที่นี่
- 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: การตั้งค่า
- เปิดโค้ดและคอมไพล์โค้ดด้วย #define pcvisual uncommented และ #define midi_out แสดงความคิดเห็น
- เปิด xloader และเรียกดูไดเร็กทอรีด้วยโค้ด เรียกดูไฟล์.hex และเบิร์นไปที่ nano โดยเลือกบอร์ดและพอร์ต COM ที่เหมาะสม
- เปิดแบบร่างการประมวลผลและเรียกใช้ด้วยดัชนีพอร์ต COM ที่เหมาะสม หากทุกอย่างเป็นไปด้วยดี คุณควรจะเห็นสเปกตรัมของสัญญาณที่ขา A0
- หาไขควงและหมุนหม้อทริมเมอร์จนกว่าสเปกตรัมจะแบน (ส่วนประกอบ DC ควรใกล้ศูนย์) อย่าป้อนสัญญาณใด ๆ ไปที่บอร์ดแล้ว (ห้ามติดโมดูลไมโครโฟน)
- ตอนนี้ใช้เครื่องมือตัวสร้างการกวาดในลักษณะนี้เพื่อป้อนข้อมูลไปยังบอร์ดจากไมโครโฟนและสังเกตสเปกตรัม
- หากคุณไม่เห็นการกวาดความถี่ ให้ลดความถี่ตัดโดยเปลี่ยนความต้านทาน 47 กิโลโอห์ม นอกจากนี้ยังเพิ่มเกนโดยใช้หม้อที่ตั้งไว้ล่วงหน้า 10 กิโลโอห์ม พยายามให้ได้ผลลัพธ์การกวาดที่ราบเรียบและโดดเด่นโดยการเปลี่ยนพารามิเตอร์เหล่านี้ นี่คือส่วนที่สนุก (โบนัสเล็กน้อย!) เล่นเพลงโปรดของคุณและเพลิดเพลินไปกับสเปกตรัมแบบเรียลไทม์ (ดูวิดีโอ)
- ตอนนี้คอมไพล์โค้ด C แบบฝังอีกครั้งด้วย #define pcvisual แสดงความคิดเห็น และ #define midi_out uncommented
- โหลดโค้ดที่คอมไพล์ใหม่ลงใน arduino Nano
- เปิด LoopMidi และสร้างพอร์ตใหม่
- เปิดสตูดิโอ FL หรือซอฟต์แวร์อินเทอร์เฟซ MIDI อื่นๆ และตรวจสอบให้แน่ใจว่ามองเห็นพอร์ต midi แบบวนซ้ำได้ในการตั้งค่าพอร์ต MIDI
- เปิด MIDI แบบไม่มีขนโดยเชื่อมต่อกับ Arduino เลือกพอร์ตเอาต์พุตเป็นพอร์ต LoopMidi ไปที่การตั้งค่าและตั้งค่าอัตราบอดเป็น 115200 ตอนนี้เลือกพอร์ต COM ที่สอดคล้องกับ Arduino Nano และเปิดพอร์ต
- เล่นโทนเสียง "บริสุทธิ์" ใกล้ๆ ไมโครโฟน และคุณควรได้ยินเสียงโน้ตที่เกี่ยวข้องในซอฟต์แวร์ MIDI ด้วยเช่นกัน หากไม่มีการตอบสนอง ให้ลองลดระดับ up_threshold ที่กำหนดไว้ในโค้ด C หากโน้ตถูกเรียกแบบสุ่ม ให้เพิ่มค่า up_threshold
- รับเปียโนของคุณและทดสอบว่าระบบของคุณเร็วแค่ไหน!! สิ่งที่ดีที่สุดคือในโซนล็อกสีทองของโน้ต มันสามารถตรวจจับการกดปุ่มพร้อมกันหลายปุ่มได้อย่างง่ายดาย
หมายเหตุ: เมื่อแอปพลิเคชันหนึ่งเข้าถึงพอร์ต COM แอปพลิเคชันอื่นจะไม่สามารถอ่านได้ ตัวอย่างเช่น หาก Hairless MIDI กำลังอ่านพอร์ต COM Xloader จะไม่สามารถแฟลชบอร์ดได้
ขั้นตอนที่ 7: ผลลัพธ์/วิดีโอ
แค่นั้นแหละ! หวังว่าคุณจะชอบมัน. หากคุณมีข้อเสนอแนะหรือการปรับปรุงในโครงการแจ้งให้เราทราบในส่วนความคิดเห็น สันติภาพ!
แนะนำ:
สร้าง Arduino MIDI Controller: 5 ขั้นตอน (พร้อมรูปภาพ)
สร้าง Arduino MIDI Controller: สวัสดีทุกคน! ในคำแนะนำนี้ฉันจะแสดงวิธีสร้างคอนโทรลเลอร์ MIDI ที่ขับเคลื่อนด้วย Arduino ของคุณเอง MIDI ย่อมาจาก Musical Instrument Digital Interface และเป็นโปรโตคอลที่ช่วยให้คอมพิวเตอร์ เครื่องดนตรี และฮาร์ดแวร์อื่นๆ สามารถสื่อสาร
MIDI Handpan พร้อม 19 Tonefields ที่ด้านบนและด้านล่าง: 15 ขั้นตอน (พร้อมรูปภาพ)
MIDI Handpan พร้อม 19 Tonefields ที่ด้านบนและด้านล่าง…: บทนำ นี่คือบทแนะนำเกี่ยวกับ Handpan MIDI ที่ฉันทำเองซึ่งมีโทนฟิลด์ที่ไวต่อเสียง 19 โทน ความสามารถของ Plug'n Play USB และพารามิเตอร์ที่ใช้งานง่ายมากมายสำหรับการปรับแพด สำหรับความต้องการส่วนบุคคลของคุณ ไม่ใช่ mod ที่ได้รับรางวัลการออกแบบ
MIDI Sonar "Theremin": 10 ขั้นตอน (พร้อมรูปภาพ)
MIDI Sonar "Theremin": นี่คือเครื่องดนตรีที่ใช้เซ็นเซอร์วัดระยะโซนาร์สองตัวเพื่อควบคุมระดับเสียงและคุณภาพของโน้ต ไม่ใช่ Theremin แน่นอน แต่เป็น "Theremin" ได้กลายเป็นคำศัพท์ทั่วไปสำหรับเครื่องดนตรีที่เล่นโดยการโบกมือ
การสร้าง Arduino MIDI Controller: 9 ขั้นตอน (พร้อมรูปภาพ)
การสร้าง Arduino MIDI Controller: คำแนะนำนี้เผยแพร่ครั้งแรกในบล็อกของฉันเมื่อวันที่ 28 มิถุนายน 2020 ฉันสนุกกับการสร้างสิ่งต่าง ๆ ที่มีอุปกรณ์อิเล็กทรอนิกส์และฉันต้องการสร้างบางสิ่งโดยใช้ Arduino เสมอ หนึ่งในงานสร้างทั่วไปสำหรับผู้เริ่มต้นที่ฉันพบคือ ตัวควบคุม MIDI
MIDI 5V LED Strip Light Controller สำหรับ Spielatron หรือ MIDI Synth อื่นๆ: 7 ขั้นตอน (พร้อมรูปภาพ)
MIDI 5V LED Strip Light Controller สำหรับ Spielatron หรือ MIDI Synth อื่นๆ: คอนโทรลเลอร์นี้กะพริบไฟแถบ LED สามสีเป็นเวลา 50mS ต่อโน้ต สีน้ำเงินสำหรับ G5 ถึง D#6, สีแดงสำหรับ E6 ถึง B6 และสีเขียวสำหรับ C7 ถึง G7 คอนโทรลเลอร์เป็นอุปกรณ์ ALSA MIDI ดังนั้นซอฟต์แวร์ MIDI สามารถส่งออกไปยัง LED ได้ในเวลาเดียวกันกับอุปกรณ์สังเคราะห์ MIDI