สารบัญ:

Laser Harp Synthesizer บนบอร์ด Zybo: 10 ขั้นตอน (พร้อมรูปภาพ)
Laser Harp Synthesizer บนบอร์ด Zybo: 10 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: Laser Harp Synthesizer บนบอร์ด Zybo: 10 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: Laser Harp Synthesizer บนบอร์ด Zybo: 10 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: Third Rendez-Vous - The Laser Harp 2024, กรกฎาคม
Anonim
เครื่องสังเคราะห์พิณเลเซอร์บนบอร์ด Zybo
เครื่องสังเคราะห์พิณเลเซอร์บนบอร์ด Zybo

ในบทช่วยสอนนี้ เราจะสร้างพิณเลเซอร์ที่ทำงานได้อย่างสมบูรณ์โดยใช้เซ็นเซอร์ IR พร้อมอินเทอร์เฟซแบบอนุกรมที่จะให้ผู้ใช้เปลี่ยนการจูนและโทนเสียงของเครื่องมือได้ พิณนี้จะเป็นเครื่องดนตรีเก่าที่สร้างใหม่ในศตวรรษที่ 21 ระบบถูกสร้างขึ้นโดยใช้บอร์ดพัฒนา Xilinx Zybo ร่วมกับ Vivado Design Suites สิ่งที่คุณจะต้องทำโครงการให้เสร็จ:

  • เซ็นเซอร์และตัวปล่อย IR 12 ตัว (มากหรือน้อยขึ้นอยู่กับจำนวนสาย)
  • บอร์ดพัฒนา Zybo Zynq-7000
  • ฟรี RTOS
  • วิวาโด ดีไซน์ สวีท
  • ลวด (สำหรับเชื่อมต่อเซ็นเซอร์กับบอร์ด)
  • ท่อพีวีซี 3 ชิ้น ((2) 18 นิ้ว และ (1) 8 นิ้ว)
  • ข้อศอก PVC 2 อัน

ขั้นตอนที่ 1: รับการสาธิตเสียง Zybo DMA ของ Digilent

ด้าน FPGA ของโปรเจ็กต์นี้มีพื้นฐานมาจากโปรเจ็กต์สาธิตที่พบที่นี่เป็นส่วนใหญ่ ใช้การเข้าถึงหน่วยความจำโดยตรงเพื่อส่งข้อมูลโดยตรงจากหน่วยความจำที่โปรเซสเซอร์สามารถเขียนผ่าน AXI Stream ไปยังบล็อกเสียง I2S ขั้นตอนต่อไปนี้จะช่วยให้คุณเริ่มต้นและใช้งานโครงการสาธิตเสียง DMA:

  1. อาจจำเป็นต้องมีไฟล์บอร์ดเวอร์ชันใหม่สำหรับบอร์ด Zybo ทำตามคำแนะนำเหล่านี้เพื่อรับไฟล์บอร์ดใหม่สำหรับ Vivado
  2. ทำตามขั้นตอนที่ 1 และ 2 ในคำแนะนำในหน้านี้เพื่อเปิดโครงการสาธิตใน Vivado ใช้วิธี Vivado ไม่ใช่แฮนด์ออฟฮาร์ดแวร์ SDK
  3. คุณอาจได้รับข้อความแจ้งว่าควรอัปเดตบล็อก IP บางรายการ ถ้าใช่ ให้เลือก "แสดงสถานะ IP" จากนั้นในแท็บสถานะ IP ให้เลือก IP ที่ล้าสมัยทั้งหมด แล้วคลิก "อัปเกรดที่เลือก" เมื่อเสร็จสิ้นและหน้าต่างปรากฏขึ้นเพื่อถามว่าคุณต้องการสร้างผลงานหรือไม่ ให้ดำเนินการต่อและคลิก "สร้าง" หากคุณได้รับข้อความเตือนที่สำคัญ ไม่ต้องสนใจมัน
  4. เปลี่ยนจากการออกแบบเป็นแท็บแหล่งที่มาใน Vivado เพื่อดูไฟล์ต้นฉบับ คลิกขวาที่การออกแบบบล็อก "design_1" และเลือก "สร้าง HDL Wrapper" เมื่อได้รับแจ้ง ให้เลือก "คัดลอกเสื้อคลุมที่สร้างขึ้นเพื่ออนุญาตให้ผู้ใช้แก้ไข" ไฟล์ wrapper สำหรับโปรเจ็กต์จะถูกสร้างขึ้น
  5. เมื่อขั้นตอนสำคัญๆ ที่ถูกทิ้งไว้ในบทช่วยสอนอื่นๆ เสร็จเรียบร้อยแล้ว คุณสามารถกลับไปที่บทช่วยสอนที่ลิงก์ไว้ก่อนหน้านี้และดำเนินการต่อจากขั้นตอนที่ 4 จนจบ และตรวจสอบให้แน่ใจว่าโปรเจ็กต์สาธิตทำงานอย่างถูกต้อง หากคุณไม่มีวิธีการป้อนข้อมูลเสียงสำหรับการบันทึก ก็เพียงแค่บันทึกด้วยหูฟังของคุณและฟังเสียงที่คลุมเครือเป็นเวลา 5-10 วินาทีเมื่อคุณกดปุ่มเล่น ตราบใดที่มีบางอย่างออกมาจากช่องเสียบหูฟังเมื่อคุณกดปุ่มเล่น แสดงว่าอาจทำงานได้อย่างถูกต้อง

ขั้นตอนที่ 2: ทำการเปลี่ยนแปลงบางอย่างใน Vivado

ทำการเปลี่ยนแปลงบางอย่างใน Vivado
ทำการเปลี่ยนแปลงบางอย่างใน Vivado

ตอนนี้คุณได้สาธิตเสียง DMA ของ Digilent แล้ว แต่นั่นไม่ใช่เป้าหมายสุดท้ายทั้งหมดที่นี่ เราต้องกลับไปที่ Vivado และทำการเปลี่ยนแปลงบางอย่างเพื่อให้เซ็นเซอร์ของเราสามารถเสียบเข้ากับส่วนหัว PMOD และเราสามารถใช้ค่าดังกล่าวในด้านซอฟต์แวร์ได้

  1. เปิดบล็อกไดอะแกรมใน Vivado
  2. สร้างบล็อก GPIO โดยคลิกขวาในพื้นที่ว่างในแผนภาพบล็อกและเลือก "เพิ่ม IP" จากเมนู ค้นหาและเลือก "AXI GPIO"
  3. ดับเบิลคลิกที่บล็อก IP ใหม่และในหน้าต่างกำหนดค่า IP ใหม่ ให้ไปที่แท็บการกำหนดค่า IP เลือกอินพุตทั้งหมดและตั้งค่าความกว้างเป็นสิบสอง เนื่องจากเราจะมี "สตริง" 12 อันบนพิณของเรา ดังนั้นจึงต้องมีเซ็นเซอร์ 12 ตัว หากคุณต้องการใช้เซ็นเซอร์น้อยลงหรือมากขึ้น ให้ปรับตัวเลขนี้ให้เหมาะสม ตั้งค่าเปิดใช้งานการขัดจังหวะด้วย
  4. คลิกขวาที่บล็อก GPIO IP ใหม่และเลือก "เรียกใช้การเชื่อมต่ออัตโนมัติ" ทำเครื่องหมายที่ช่อง AXI และกดตกลง สิ่งนี้ควรเชื่อมต่ออินเทอร์เฟซ AXI โดยอัตโนมัติ แต่ปล่อยให้เอาต์พุตของบล็อกไม่เชื่อมต่อ
  5. เพื่อให้มีที่ว่างสำหรับการขัดจังหวะเพิ่มเติม ให้ดับเบิลคลิกที่บล็อก IP xlconcat_0 และเปลี่ยนจำนวนพอร์ตจาก 4 เป็น 5 จากนั้นคุณสามารถเชื่อมต่อพิน ip2intc_irpt จากบล็อก GPIO ใหม่กับพอร์ตใหม่ที่ไม่ได้ใช้บนบล็อก xlconcat
  6. คลิกขวาที่เอาต์พุต "GPIO" ของบล็อก GPIO IP ใหม่และเลือก "สร้างภายนอก" ค้นหาตำแหน่งที่เส้นไปและคลิกที่รูปห้าเหลี่ยมด้านข้างเล็ก ๆ และทางด้านซ้ายหน้าต่างควรเปิดขึ้นซึ่งคุณสามารถเปลี่ยนชื่อได้ เปลี่ยนชื่อเป็น "เซ็นเซอร์" สิ่งสำคัญคือต้องใช้ชื่อเดียวกันหากคุณต้องการให้ไฟล์ข้อจำกัดที่เราจัดเตรียมไว้ให้ทำงาน มิฉะนั้น คุณจะต้องเปลี่ยนชื่อในไฟล์ข้อจำกัด
  7. กลับไปที่แท็บแหล่งที่มา ค้นหาไฟล์ข้อจำกัดและแทนที่ด้วยไฟล์ที่เราให้ไว้ คุณสามารถเลือกที่จะแทนที่ไฟล์หรือเพียงแค่คัดลอกเนื้อหาของไฟล์ข้อจำกัดของเราแล้ววางทับเนื้อหาของไฟล์เก่า สิ่งสำคัญอย่างหนึ่งที่ไฟล์ข้อ จำกัด ของเราทำคือเปิดใช้งานตัวต้านทานแบบดึงขึ้นบนส่วนหัว PMOD สิ่งนี้จำเป็นสำหรับเซ็นเซอร์บางตัวที่เราใช้ อย่างไรก็ตาม เซ็นเซอร์บางตัวไม่เหมือนกัน หากเซ็นเซอร์ของคุณต้องการตัวต้านทานแบบดึงลง คุณสามารถเปลี่ยนทุกอินสแตนซ์ของ "set_property PULLUP true" ด้วย "set_property PULLDOWN true" หากต้องการค่าตัวต้านทานที่แตกต่างจากค่าบนบอร์ด คุณสามารถลบเส้นเหล่านี้และใช้ตัวต้านทานภายนอกได้ชื่อพินอยู่ในความคิดเห็นในไฟล์ข้อ จำกัด และสอดคล้องกับป้ายกำกับในไดอะแกรมแรกใน Zybo Schematics ซึ่งสามารถพบได้ที่นี่ หากคุณต้องการใช้พิน pmod ที่แตกต่างกัน เพียงแค่จับคู่ชื่อในไฟล์ข้อ จำกัด กับป้ายกำกับในแผนผัง เราใช้ส่วนหัว PMOD JE และ JD และใช้หมุดข้อมูล 6 ตัวในแต่ละหมุด โดยละเว้นหมุด 1 และ 7 ข้อมูลนี้มีความสำคัญเมื่อเชื่อมต่อเซ็นเซอร์ของคุณ ดังแสดงในแผนผัง พิน 6 และ 12 บน PMODS คือ VCC และพิน 5 และ 11 เป็นกราวด์
  8. สร้าง wrapper HDL ใหม่ดังเดิม แล้วคัดลอกและเขียนทับอันเก่า เมื่อเสร็จแล้ว ให้สร้างบิตสตรีมและส่งออกฮาร์ดแวร์เหมือนเมื่อก่อน แล้วเปิดใช้ SDK อีกครั้ง หากคุณถูกถามว่าต้องการแทนที่ไฟล์ฮาร์ดแวร์เก่าหรือไม่ คำตอบคือใช่ อาจเป็นการดีที่สุดที่จะปิด SDK เมื่อคุณส่งออกฮาร์ดแวร์เพื่อให้มีการเปลี่ยนอย่างถูกต้อง
  9. เปิดตัว SDK

ขั้นตอนที่ 3: รับ FreeRTOS ที่ทำงานอยู่

ขั้นตอนต่อไปคือการทำให้ FreeRTOS ทำงานบนบอร์ด Zybo

  1. หากคุณยังไม่มีสำเนา ให้ดาวน์โหลด FreeRTOS ที่นี่และแตกไฟล์
  2. นำเข้าการสาธิต FreeRTOS Zynq ซึ่งอยู่ที่ FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_A9_Zynq_ZC702\RTOSDemo กระบวนการนำเข้าค่อนข้างเหมือนกันกับโครงการสาธิตอื่น ๆ อย่างไรก็ตามเนื่องจากการสาธิต FreeRTOS Zynq อาศัยไฟล์อื่นในโฟลเดอร์ FreeRTOS คุณจึงไม่ควรคัดลอกไฟล์ลงในพื้นที่ทำงานของคุณ คุณควรวางโฟลเดอร์ FreeRTOS ทั้งหมดไว้ในโฟลเดอร์โครงการของคุณแทน
  3. สร้างแพ็คเกจสนับสนุนบอร์ดใหม่โดยไปที่ "ไฟล์" -> "ใหม่" -> "แพ็คเกจสนับสนุนบอร์ด" ตรวจสอบให้แน่ใจว่าได้เลือกแบบสแตนด์อโลนและคลิกเสร็จสิ้น หลังจากนั้นครู่หนึ่งหน้าต่างจะปรากฏขึ้น ให้ทำเครื่องหมายที่ช่องถัดจาก lwip141 (ซึ่งจะหยุดการสาธิต FreeRTOS ตัวใดตัวหนึ่งจากการคอมไพล์ล้มเหลว) และกดตกลง หลังจากนั้น ให้คลิกขวาที่โปรเจ็กต์ RTOSdemo และไปที่ "คุณสมบัติ" ไปที่แท็บ "การอ้างอิงโปรเจ็กต์" และทำเครื่องหมายที่ช่องถัดจาก bsp ใหม่ที่คุณสร้างขึ้น หวังว่าจะเป็นที่รู้จัก แต่บางครั้ง Xilinx SDK อาจแปลกเกี่ยวกับสิ่งนี้ หากคุณยังคงได้รับข้อผิดพลาดหลังจากขั้นตอนนี้ที่ xparameters.h หายไปหรืออะไรทำนองนั้น ให้ลองทำซ้ำขั้นตอนนี้ และอาจออกจากการทำงานและเปิด SDK ใหม่อีกครั้ง

ขั้นตอนที่ 4: เพิ่มรหัสพิณเลเซอร์

เมื่อนำเข้า FreeRTOS แล้ว คุณสามารถนำไฟล์จากโปรเจ็กต์ฮาร์ปเลเซอร์ไปยังการสาธิต FreeRTOS ได้

  1. สร้างโฟลเดอร์ใหม่ภายใต้โฟลเดอร์ src ในการสาธิต FreeRTOS และคัดลอกและวางไฟล์ c ที่ให้มาทั้งหมด ยกเว้น main.c ลงในโฟลเดอร์นี้
  2. แทนที่ RTOSDemo main.c ด้วย main.c ที่ให้มา
  3. หากทำทุกอย่างถูกต้องแล้ว คุณควรจะสามารถรันโค้ดเลเซอร์พิณได้ ณ จุดนี้ เพื่อจุดประสงค์ในการทดสอบ ตอนนี้อินพุตของปุ่มที่ใช้ในโปรเจ็กต์สาธิต DMA จะใช้เพื่อเล่นเสียงโดยไม่ต้องต่อเซ็นเซอร์ (ปุ่มหลักสี่ปุ่มจะใช้งานได้) มันจะเล่นสตริงทุกครั้งที่คุณกดและวนผ่านสตริงทั้งหมดในระบบผ่านการกดหลายครั้ง เสียบหูฟังหรือลำโพงเข้ากับแจ็คหูฟังบนบอร์ด Zybo และตรวจสอบให้แน่ใจว่าคุณได้ยินเสียงของสายที่ส่งผ่านเมื่อคุณกดปุ่ม

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

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

อินเตอร์รัปต์

ก่อนอื่นฉันจะพูดถึงวิธีการสร้างอินเตอร์รัปต์ในโครงการนี้ วิธีที่เราทำคือโดยการสร้างโครงสร้างตารางเวกเตอร์ขัดจังหวะซึ่งติดตาม ID ตัวจัดการการขัดจังหวะและการอ้างอิงถึงอุปกรณ์สำหรับการขัดจังหวะแต่ละครั้ง รหัสขัดจังหวะมาจาก xparameters.h. ตัวจัดการการขัดจังหวะเป็นฟังก์ชันที่เราเขียนสำหรับ DMA และ GPIO และการขัดจังหวะ I2C มาจากไดรเวอร์ Xlic I2C การอ้างอิงอุปกรณ์ชี้ไปที่อินสแตนซ์ของแต่ละอุปกรณ์ที่เราเริ่มต้นที่อื่น ใกล้จุดสิ้นสุดของฟังก์ชัน _init_audio ลูปจะผ่านแต่ละรายการในตารางเวกเตอร์อินเตอร์รัปต์และเรียกฟังก์ชันสองอย่างคือ XScuGic_Connect() และ XScuGic_Enable() เพื่อเชื่อมต่อและเปิดใช้งานอินเตอร์รัปต์ พวกเขาอ้างอิง xInterruptController ซึ่งเป็นตัวควบคุมขัดจังหวะที่สร้างขึ้นใน FreeRTOS main.c โดยค่าเริ่มต้น โดยพื้นฐานแล้วเราแนบอินเตอร์รัปต์แต่ละรายการของเราเข้ากับตัวควบคุมอินเตอร์รัปต์ซึ่ง FreeRTOS สร้างขึ้นสำหรับเราแล้ว

DMA

รหัสการเริ่มต้น DMA เริ่มต้นใน lh_main.c ขั้นแรกให้ประกาศอินสแตนซ์คงที่ของโครงสร้าง XAxiDma จากนั้นในฟังก์ชัน _init_audio() จะได้รับการกำหนดค่า ขั้นแรก ฟังก์ชันกำหนดค่าจากโปรเจ็กต์สาธิตจะถูกเรียก ซึ่งอยู่ใน dma.c มีเอกสารค่อนข้างดีและมาจากการสาธิตโดยตรง จากนั้นอินเตอร์รัปต์จะเชื่อมต่อและเปิดใช้งาน สำหรับโปรเจ็กต์นี้จำเป็นต้องมีการขัดจังหวะแบบมาสเตอร์ถึงทาสเท่านั้น เนื่องจาก DMA ส่งข้อมูลทั้งหมดไปยังตัวควบคุม I2S หากคุณต้องการบันทึกเสียง คุณจะต้องมีอินเตอร์รัปต์ของทาสถึงมาสเตอร์ด้วย การขัดจังหวะหลักถึงทาสจะถูกเรียกเมื่อ DMA เสร็จสิ้นการส่งข้อมูลที่คุณบอกให้ส่ง การขัดจังหวะนี้มีความสำคัญอย่างเหลือเชื่อสำหรับโครงการของเรา เนื่องจากทุกครั้งที่ DMA เสร็จสิ้นการส่งตัวอย่างเสียงหนึ่งบัฟเฟอร์ มันจะต้องเริ่มส่งบัฟเฟอร์ถัดไปทันที มิฉะนั้น อาจเกิดความล่าช้าในการได้ยินระหว่างการส่ง ภายในฟังก์ชัน dma_mm2s_ISR() คุณสามารถดูวิธีที่เราจัดการกับการขัดจังหวะ ส่วนที่สำคัญอยู่ใกล้จุดสิ้นสุดที่เราใช้ xSemaphoreGiveFromISR() และ portYIELD_FROM_ISR() เพื่อแจ้ง _audio_task() ว่าสามารถเริ่มต้นการถ่ายโอน DMA ครั้งต่อไปได้ วิธีที่เราส่งข้อมูลเสียงคงที่คือการสลับระหว่างบัฟเฟอร์สองตัว เมื่อบัฟเฟอร์หนึ่งถูกส่งไปยังบล็อก I2C บัฟเฟอร์อื่นจะมีการคำนวณและจัดเก็บค่าของมัน จากนั้นเมื่ออินเตอร์รัปต์มาจาก DMA บัฟเฟอร์ที่ใช้งานอยู่จะสลับและบัฟเฟอร์ที่เขียนล่าสุดจะเริ่มถ่ายโอนในขณะที่บัฟเฟอร์ที่ถ่ายโอนก่อนหน้านี้เริ่มถูกเขียนทับด้วยข้อมูลใหม่ ส่วนสำคัญของฟังก์ชัน _audio_task คือตำแหน่งที่เรียก fnAudioPlay() fnAudioPlay() ใช้อินสแตนซ์ DMA ความยาวของบัฟเฟอร์ และตัวชี้ไปยังบัฟเฟอร์ที่จะถ่ายโอนข้อมูล ค่าบางค่าจะถูกส่งไปยังรีจิสเตอร์ I2S เพื่อแจ้งให้ทราบว่าจะมีตัวอย่างเพิ่มขึ้น จากนั้น XAxiDma_SimpleTransfer() จะถูกเรียกเพื่อเริ่มการถ่ายโอน

I2S Audio

audio.c และ audio.h คือจุดเริ่มต้นของ I2S รหัสเริ่มต้นของ I2S เป็นโค้ดทั่วไปที่ค่อนข้างจะลอยอยู่ในหลายๆ ที่ คุณอาจพบความแตกต่างเล็กน้อยจากแหล่งที่มาอื่นๆ แต่โค้ดนี้น่าจะใช้ได้ มีเอกสารค่อนข้างดีและไม่จำเป็นต้องเปลี่ยนแปลงอะไรมากสำหรับโครงการพิณ การสาธิตเสียง DMA ที่มาจากมีฟังก์ชันสำหรับการสลับไปใช้อินพุตไมโครโฟนหรือสาย คุณจึงสามารถใช้งานได้หากต้องการฟังก์ชันดังกล่าว

การสังเคราะห์เสียง

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

วิธีที่ 1: ค่าไซน์หนึ่งช่วงคำนวณสำหรับแต่ละสตริงที่ความถี่ที่สอดคล้องกันสำหรับโน้ตดนตรีของสตริงนั้นและจัดเก็บไว้ในอาร์เรย์ ตัวอย่างเช่น ความยาวของอาร์เรย์จะเป็นคาบของคลื่นไซน์ในตัวอย่าง ซึ่งเท่ากับ # ของกลุ่มตัวอย่าง / รอบ หากอัตราการสุ่มตัวอย่างคือ 48kHz และความถี่ของโน้ตคือ 100Hz จะมีตัวอย่าง 48,000 ตัวอย่าง/วินาที และ 100 รอบ/วินาทีที่นำไปสู่ 4800 ตัวอย่างต่อรอบ และความยาวอาร์เรย์จะเป็น 4800 ตัวอย่าง และจะมีค่าของตัวอย่างที่สมบูรณ์หนึ่งรายการ ช่วงคลื่นไซน์ เมื่อเล่นสตริง บัฟเฟอร์ตัวอย่างเสียงจะถูกเติมโดยนำค่าจากอาร์เรย์คลื่นไซน์มาใส่ในบัฟเฟอร์เสียงเป็นตัวอย่าง จากนั้นเพิ่มดัชนีลงในอาร์เรย์คลื่นไซน์เพื่อให้ใช้ตัวอย่างก่อนหน้าของเราตลอดหลักสูตร จากตัวอย่าง 4800 ตัวอย่าง วงจรคลื่นไซน์หนึ่งรอบจะถูกใส่ลงในบัฟเฟอร์เสียง การดำเนินการแบบโมดูโลถูกใช้ในดัชนีอาร์เรย์เพื่อให้อยู่ระหว่าง 0 ถึงความยาวเสมอ และเมื่อดัชนีอาร์เรย์ผ่านเกณฑ์ที่กำหนด (เช่น อาจมีค่าตัวอย่าง 2 วินาที) สตริงจะถูกปิด หากต้องการเล่นหลายสตริงพร้อมกัน ให้ติดตามดัชนีอาร์เรย์ของสตริงแต่ละรายการแยกกัน และเพิ่มค่าจากคลื่นไซน์ของแต่ละสตริงเข้าด้วยกันเพื่อให้ได้ตัวอย่างแต่ละตัวอย่าง

วิธีที่ 2: เพื่อสร้างโทนเสียงดนตรีมากขึ้น เราเริ่มต้นด้วยโมเดลก่อนหน้าและเพิ่มฮาร์โมนิกให้กับความถี่พื้นฐานแต่ละความถี่ ความถี่ฮาร์มอนิกคือความถี่ที่เป็นจำนวนเต็มทวีคูณของความถี่พื้นฐาน ต่างจากการรวมความถี่ที่ไม่เกี่ยวข้องสองความถี่เข้าด้วยกัน ซึ่งส่งผลให้มีการเล่นเสียงที่แตกต่างกันสองเสียงพร้อมกัน เมื่อรวมฮาร์โมนิกเข้าด้วยกัน เสียงจะยังคงเหมือนเสียงเดียว แต่มีโทนเสียงที่ต่างกัน ในการทำให้สำเร็จ ทุกครั้งที่เราเพิ่มค่าของคลื่นไซน์ที่ตำแหน่ง (ดัชนีอาร์เรย์ % ความยาวอาร์เรย์) ให้กับตัวอย่างเสียง เรายังเพิ่ม (2 * ดัชนีอาร์เรย์ % ความยาวอาร์เรย์) และ (3 * ดัชนีอาร์เรย์ % ความยาวอาร์เรย์) และอื่น ๆ สำหรับฮาร์มอนิกจำนวนเท่าใดก็ได้ที่ต้องการ ดัชนีการคูณเหล่านี้จะเคลื่อนที่ผ่านคลื่นไซน์ที่ความถี่ซึ่งเป็นผลคูณของจำนวนเต็มของความถี่เดิม เพื่อให้สามารถควบคุมโทนเสียงได้มากขึ้น ค่าของฮาร์มอนิกแต่ละค่าจะถูกคูณด้วยตัวแปรซึ่งแสดงถึงปริมาณฮาร์มอนิกนั้นในเสียงโดยรวม ตัวอย่างเช่น คลื่นไซน์พื้นฐานอาจมีค่าทั้งหมดคูณด้วย 6 เพื่อให้เป็นปัจจัยในเสียงโดยรวมมากขึ้น ในขณะที่ฮาร์มอนิกที่ 5 อาจมีตัวคูณเป็น 1 ซึ่งหมายความว่าค่าของมันมีส่วนน้อยกว่ามากสำหรับเสียงโดยรวม

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

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

โดยรวมแล้วการสังเคราะห์เสียงนั้นใช้งานง่ายแต่การคำนวณก็หนักมาก การจัดเก็บเสียงสตริงทั้งหมดในหน่วยความจำพร้อมกันจะใช้หน่วยความจำมากเกินไป แต่การคำนวณคลื่นไซน์และฟังก์ชันเลขชี้กำลังระหว่างทุกเฟรมอาจใช้เวลานานเกินไปเพื่อให้ทันกับอัตราการเล่นเสียง มีการใช้กลอุบายหลายอย่างในโค้ดเพื่อเร่งการคำนวณ คณิตศาสตร์ทั้งหมดยกเว้นในการสร้างตารางไซน์และตารางการสลายตัวแบบเอ็กซ์โพเนนเชียลในขั้นต้นจะทำในรูปแบบจำนวนเต็ม ซึ่งต้องกระจายพื้นที่ตัวเลขที่มีอยู่ในเอาต์พุตเสียง 24 บิต ตัวอย่างเช่น ตารางไซน์มีแอมพลิจูด 150 เพื่อให้เรียบแต่ไม่ใหญ่จนหลายสตริงที่เล่นด้วยกันสามารถเพิ่มได้เกิน 24 บิต ในทำนองเดียวกัน ค่าตารางเลขชี้กำลังจะถูกคูณด้วย 80 ก่อนที่จะปัดเศษเป็นจำนวนเต็มและเก็บไว้ ตุ้มน้ำหนักฮาร์มอนิกสามารถรับค่าที่ไม่ต่อเนื่องได้ระหว่าง 0 ถึง 10 นอกจากนี้ ตัวอย่างทั้งหมดจะถูกเพิ่มเป็นสองเท่า และคลื่นไซน์จะถูกสร้างดัชนีโดย 2 ซึ่งทำให้อัตราการสุ่มตัวอย่างลดลงครึ่งหนึ่งอย่างมีประสิทธิภาพ สิ่งนี้จำกัดความถี่สูงสุดที่สามารถเล่นได้ แต่จำเป็นสำหรับจำนวนสตริงและฮาร์โมนิกในปัจจุบันที่จะคำนวณได้เร็วพอ

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

ขั้นตอนที่ 6: การเดินสายไฟเซ็นเซอร์

การเดินสายไฟเซนเซอร์
การเดินสายไฟเซนเซอร์

ในการสร้างสายอักขระ เราใช้เซ็นเซอร์ IR break beam ที่จะตรวจจับเมื่อมีการเล่นสาย เราสั่งเซ็นเซอร์ของเราจากลิงค์ต่อไปนี้ เซ็นเซอร์มีสายไฟ กราวด์ และสายข้อมูล ในขณะที่ตัวปล่อยจะมีเพียงสายไฟและสายกราวด์เท่านั้น เราใช้ 3.3 V และพินกราวด์จากส่วนหัว PMOD เพื่อจ่ายไฟให้กับทั้งตัวปล่อยและเซ็นเซอร์ ในการจ่ายพลังงานให้กับเซ็นเซอร์และตัวปล่อยทั้งหมด จำเป็นต้องเชื่อมต่อเซ็นเซอร์และตัวปล่อยทั้งหมดแบบขนาน สายข้อมูลจากเซ็นเซอร์แต่ละตัวจะต้องไปที่พิน pmod ของตัวเอง

ขั้นตอนที่ 7: การสร้างโครงกระดูก

การสร้างโครงกระดูก
การสร้างโครงกระดูก

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

ขั้นตอนที่ 8: สร้างภายนอกไม้

การสร้างภายนอกไม้
การสร้างภายนอกไม้

ขั้นตอนนี้เป็นทางเลือก แต่ขอแนะนำเป็นอย่างยิ่ง ภายนอกไม้ไม่เพียงแต่ทำให้พิณดูดีเท่านั้น แต่ยังปกป้องเซ็นเซอร์และสายไฟจากความเสียหาย โครงไม้สามารถสร้างได้ด้วยวงแหวนสี่เหลี่ยมที่ทำจากไม้ ด้านในของสี่เหลี่ยมผืนผ้าต้องมีช่องเปิดอย่างน้อย 1-1 / 2 นิ้วเพื่อให้พอดีกับท่อและโครงกระดูกเซ็นเซอร์ เมื่อสร้างเฟรมแล้ว ให้เจาะรูสองรูที่จะยอมให้สายไฟจากเซ็นเซอร์และตัวปล่อยออกเพื่อเชื่อมต่อกับบอร์ด

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

ขั้นตอนที่ 9: นำชิ้นส่วนทั้งหมดมารวมกัน

ประกอบชิ้นส่วนทั้งหมดเข้าด้วยกัน
ประกอบชิ้นส่วนทั้งหมดเข้าด้วยกัน

เมื่อขั้นตอนก่อนหน้าทั้งหมดเสร็จสิ้น ก็ถึงเวลาสร้างพิณ ขั้นแรกให้วางโครงกระดูกท่อไว้ด้านในด้านนอกที่เป็นไม้ จากนั้นเสียบสายไฟสำหรับเซ็นเซอร์และตัวปล่อยลงในตำแหน่งที่ถูกต้องบนบอร์ด จากนั้นเปิด SDK แล้วคลิกปุ่มดีบั๊กเพื่อตั้งโปรแกรมบอร์ด เมื่อตั้งโปรแกรมบอร์ดแล้วให้เสียบหูฟังหรือลำโพง ขึ้นอยู่กับว่าเซ็นเซอร์ตัวใดจะลงเอยด้วยพอร์ต pmod ที่สายพิณของคุณอาจจะไม่เป็นระเบียบในตอนแรก เนื่องจากอาจเป็นเรื่องยากที่จะบอกได้ว่าสายใดจะไปที่เซ็นเซอร์ตัวใดเมื่อมีสายจำนวนมากที่เกี่ยวข้อง เราจึงรวมวิธีการจับคู่หมายเลขสตริงเพื่อขัดจังหวะตำแหน่งบิตในซอฟต์แวร์ ค้นหา "static int sensor_map[NUM_STRINGS]" และปรับค่าในอาร์เรย์จนกว่าสตริงจะเล่นจากต่ำสุดไปสูงสุดตามลำดับ

สามารถใช้เมนูได้โดยเปิดเทอร์มินัลอนุกรม (เช่น RealTerm) และตั้งค่าอัตราบอดเป็น 115200 และแสดงผลเป็น ANSI สามารถนำทางเมนูได้โดยใช้ปุ่ม w และ s เพื่อเลื่อนขึ้นและลง และปุ่ม a และ d เพื่อเปลี่ยนค่า

ขั้นตอนที่ 10: ROCK OUT

เมื่อพิณทำงานเต็มที่แล้ว ฝึกพิณให้เชี่ยวชาญและฟังเสียงอันไพเราะของเพลงของคุณเอง!

แนะนำ: