Სარჩევი:

ლაზერული არფის სინთეზატორი Zybo დაფაზე: 10 ნაბიჯი (სურათებით)
ლაზერული არფის სინთეზატორი Zybo დაფაზე: 10 ნაბიჯი (სურათებით)

ვიდეო: ლაზერული არფის სინთეზატორი Zybo დაფაზე: 10 ნაბიჯი (სურათებით)

ვიდეო: ლაზერული არფის სინთეზატორი Zybo დაფაზე: 10 ნაბიჯი (სურათებით)
ვიდეო: Laser-Harp&Zynthian 2024, ივლისი
Anonim
ლაზერული არფის სინთეზატორი Zybo დაფაზე
ლაზერული არფის სინთეზატორი Zybo დაფაზე

ამ გაკვეთილში ჩვენ შევქმნით სრულად ფუნქციურ ლაზერულ არფას IR სენსორების გამოყენებით სერიული ინტერფეისით, რაც მომხმარებელს საშუალებას მისცემს შეცვალოს ინსტრუმენტის რეგულირება და ტონი. ეს არფა იქნება 21 -ე საუკუნის ძველი ინსტრუმენტის რიმეიკი. სისტემა შეიქმნა Xilinx Zybo განვითარების დაფის გამოყენებით Vivado Design Suites– თან ერთად. რა დაგჭირდებათ პროექტის დასასრულებლად:

  • 12 IR სენსორი და გამცემი (მეტ -ნაკლებად შეიძლება გამოყენებულ იქნას სიმების რაოდენობის მიხედვით)
  • Zybo Zynq-7000 განვითარების დაფა
  • უფასო RTOS
  • Vivado Design Suite
  • მავთული (სენსორების დაფაზე დასაკავშირებლად)
  • 3 ცალი PVC მილი ((2) 18 ინჩი და (1) 8 ინჩი)
  • 2 PVC იდაყვი

ნაბიჯი 1: მიიღეთ Digilent's Zybo DMA აუდიო დემო

ამ პროექტის 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 შექმნა". მოთხოვნისთანავე აირჩიეთ "ასლი გენერირებული შეფუთვა მომხმარებლის რედაქტირების დასაშვებად". პროექტის შესაფუთი ფაილი შეიქმნება.
  5. ახლა, როდესაც დასრულდა ის კრიტიკული ნაბიჯები, რომლებიც სხვაგვარად იქნა გამოტოვებული სხვა სამეურვეოში, შეგიძლიათ დაუბრუნდეთ ადრე დაკავშირებულ სამეურვეოს და გააგრძელოთ ნაბიჯი 4 ბოლომდე და დარწმუნდეთ, რომ დემო პროექტი მუშაობს სწორად. თუ თქვენ არ გაქვთ ხმის ჩასაწერად მისი ჩაწერა, უბრალოდ ჩაწერეთ ყურსასმენებით და მოუსმინეთ 5-10 წამი ბუნდოვან ხმას დაკვრის ღილაკზე დაჭერისას. სანამ ყურსასმენის ჯეკიდან რაღაც გამოვა დაკვრის ღილაკზე დაჭერისას, ის ალბათ სწორად მუშაობს.

ნაბიჯი 2: შეიტანეთ ცვლილებები Vivado– ში

შეიტანეთ ცვლილებები Vivado– ში
შეიტანეთ ცვლილებები Vivado– ში

ახლა თქვენ მუშაობთ Digilent– ის DMA აუდიო დემოზე, მაგრამ ეს არ არის საბოლოო მიზანი აქ. ასე რომ, ჩვენ უნდა დავბრუნდეთ Vivado– ში და შევიტანოთ ცვლილებები ისე, რომ ჩვენი სენსორები იყოს ჩართული PMOD სათაურებში და ჩვენ შეგვიძლია გამოვიყენოთ მათი მნიშვნელობა პროგრამული უზრუნველყოფის მხარეს.

  1. გახსენით ბლოკის დიაგრამა Vivado– ში
  2. შექმენით GPIO ბლოკი ბლოკის დიაგრამაში ცარიელ ადგილას მარჯვენა ღილაკით და მენიუდან აირჩიეთ "IP დამატება". იპოვნეთ და აირჩიეთ "AXI GPIO".
  3. ორჯერ დააწკაპუნეთ ახალ IP ბლოკზე და ხელახლა მორგებული IP ფანჯარაში გადადით IP კონფიგურაციის ჩანართზე. შეარჩიეთ ყველა შეყვანა და დააყენეთ სიგანე თორმეტზე, ვინაიდან ჩვენ გვექნება 12 "სტრიქონი" ჩვენს არფაზე და ამიტომ გვჭირდება 12 სენსორი. თუ გსურთ გამოიყენოთ ნაკლები ან მეტი სენსორი, მაშინ ეს რიცხვი სათანადოდ შეცვალეთ. ასევე დააყენეთ ჩართვის შეწყვეტა.
  4. დააწკაპუნეთ ახალ GPIO IP ბლოკზე და აირჩიეთ "გაუშვით კავშირის ავტომატიზაცია". შეამოწმეთ AXI ყუთი და დააჭირეთ კარგი. ამან უნდა დააკავშიროს AXI ინტერფეისი ავტომატურად, მაგრამ დატოვოს ბლოკის შედეგები დაუკავშირებელი.
  5. დამატებითი შეფერხების ადგილის გასაკეთებლად, ორჯერ დააწკაპუნეთ xlconcat_0 IP ბლოკზე და შეცვალეთ პორტების რაოდენობა 4 -დან 5 -მდე. შემდეგ შეგიძლიათ დააკავშიროთ ip2intc_irpt პინი ახალი GPIO ბლოკიდან xlconcat ბლოკის ახალ გამოუყენებელ პორტთან.
  6. დააწკაპუნეთ მარჯვენა ღილაკით ახალი GPIO IP ბლოკის "GPIO" გამოსავალზე და აირჩიეთ "make external". იპოვნეთ სად მიდის ხაზი და დააწკაპუნეთ პატარა გვერდით ხუთკუთხედზე და მარცხნივ უნდა გაიხსნას ფანჯარა, სადაც შეგიძლიათ შეცვალოთ სახელი. შეცვალეთ სახელი "სენსორები". მნიშვნელოვანია გამოიყენოთ იგივე სახელი, თუ გსურთ შეზღუდვების ფაილი, რომელიც ჩვენ გთავაზობთ, იმუშაოს, წინააღმდეგ შემთხვევაში თქვენ მოგიწევთ სახელის შეცვლა შეზღუდვების ფაილში.
  7. დაუბრუნდით წყაროების ჩანართს, იპოვნეთ შეზღუდვების ფაილი და შეცვალეთ იგი ჩვენ მიერ მოწოდებული. თქვენ შეგიძლიათ აირჩიოთ ან შეცვალოთ ფაილი, ან უბრალოდ დააკოპიროთ ჩვენი შეზღუდვების ფაილის შინაარსი და ჩასვათ იგი ძველის შინაარსზე. ერთ -ერთი მნიშვნელოვანი რამ, რასაც ჩვენი შეზღუდვების ფაილი აკეთებს, არის PMOD- ის სათაურებში გაყვანის რეზისტორების ჩართვა. ეს აუცილებელია იმ სენსორებისთვის, რომელსაც ჩვენ ვიყენებდით, თუმცა ყველა სენსორი ერთნაირი არ არის. თუ თქვენი სენსორები საჭიროებენ დამუხტვის რეზისტორებს, თქვენ შეგიძლიათ შეცვალოთ "set_property PULLUP true" ყველა მაგალითი "set_property PULLDOWN true". თუ ისინი მოითხოვენ განსხვავებულ რეზისტენტულ მნიშვნელობას, ვიდრე დაფაზე, მაშინ შეგიძლიათ წაშალოთ ეს ხაზები და გამოიყენოთ გარე რეზისტორები. პინ სახელები არის კომენტარებში შეზღუდვების ფაილში და ისინი შეესაბამება ლეიბლებს Zybo სქემაში პირველ დიაგრამაში გვერდი, რომელიც შეგიძლიათ ნახოთ აქ. თუ გსურთ გამოიყენოთ სხვადასხვა pmod ქინძისთავები, უბრალოდ შეუსაბამეთ შეზღუდვის ფაილის სახელები სქემატურ ეტიკეტებს. ჩვენ ვიყენებთ PMOD სათაურს JE და JD და ვიყენებთ ექვს მონაცემს თითოეულზე, გამოვტოვებთ 1 და 7. პინებს. ეს ინფორმაცია მნიშვნელოვანია თქვენი სენსორების მიერთებისას. როგორც დიაგრამაშია ნაჩვენები, PMODS– ის 6 და 12 ქინძისთავები არის VCC და 5 და 11 პინები დაფქულია.
  8. განაახლეთ 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– ის ერთ – ერთ დემო კომპილაციას) და დააჭირეთ ღილაკს OK. ამის დასრულების შემდეგ დააწკაპუნეთ მარჯვენა ღილაკით 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.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- ს მხარეს (წარმოიდგინეთ, რომ საჭიროა ხელახლა შექმნა ბიტ -სტრიმი ყოველ ჯერზე დრო, როდესაც ნაშრომი შეიცვალა ხმის შესამოწმებლად). თუმცა, ამის გაკეთება fpga– ზე შეიძლება იყოს ამის უკეთესი გზა, შესაძლოა აღმოიფხვრას ის საკითხი, რომ არ შეიძლება გამოვთვალოთ ნიმუშები საკმარისად სწრაფად და დავუშვათ მეტი სტრიქონი, ჰარმონიკა და აუდიო ეფექტები ან სხვა ამოცანები. პროცესორის მხარე.

ნაბიჯი 6: სენსორების გაყვანილობა

სენსორების გაყვანილობა
სენსორების გაყვანილობა

სტრიქონების შესაქმნელად ჩვენ გამოვიყენეთ IR სხივის სენსორები, რომლებიც გამოავლენენ როდის თამაშობენ სტრიქონები. ჩვენ შევუკვეთეთ ჩვენი სენსორები შემდეგი ბმულიდან. სენსორებს აქვთ სიმძლავრის, მიწისა და მონაცემთა მავთული, ხოლო გამცემებს აქვთ მხოლოდ დენის და მიწის მავთული. ჩვენ გამოვიყენეთ 3.3 V და დაფქვილი ქინძისთავები PMOD- ის სათაურებიდან, როგორც ენერგიის გამომცემლების, ასევე სენსორების გასაძლიერებლად. ყველა სენსორისა და გამავრცელებლის გასააქტიურებლად აუცილებელია ყველა სენსორისა და გამცეტის პარალელურად დაკავშირება. სენსორების მონაცემთა მავთულები თითოეულ მათგანს უნდა გადავიდეს საკუთარ pmod pin- ზე.

ნაბიჯი 7: ჩონჩხის მშენებლობა

ჩონჩხის მშენებლობა
ჩონჩხის მშენებლობა

არფის ფორმის შესაქმნელად სამი ნაჭერი გამოიყენება ჩონჩხის სახით სენსორების და გამყოფების დასაყენებლად. PVC მილის ორი 18 ინჩიანი ნაჭერიდან ერთზე გაასწორეთ სენსორები და გამცემიები ერთმანეთისგან 1.5 სანტიმეტრის მონაცვლეობით და შემდეგ მიამაგრეთ ისინი მილზე. მეორე 18 ინჩიანი PVC მილის გასწორება სენსორები და გამცემი ცვლადი თანმიმდევრობით, მაგრამ დარწმუნდით, რომ შეცვალოთ ბრძანება (ანუ, თუ პირველ მილს ჰქონდა სენსორი პირველი, მეორეს უნდა ჰქონოდა პირველი გამცემი და პირიქით).საჭირო იქნება მონაცემების, სიმძლავრის და მიწის მავთულხლართების უფრო გრძელი მავთულის შედუღება, რათა მათ შეძლონ დაფაზე მოხვედრა.

ნაბიჯი 8: ხის ექსტერიერის მშენებლობა

ხის ექსტერიერის მშენებლობა
ხის ექსტერიერის მშენებლობა

ეს ნაბიჯი არჩევითია, მაგრამ რეკომენდირებულია. ხის ექსტერიერი არა მხოლოდ არფას ლამაზად გამოიყურება, არამედ იცავს სენსორებსა და მავთულხლართებს დაზიანებისგან. ხის ჩარჩო შეიძლება შეიქმნას ხისგან მართკუთხა რგოლისგან. მართკუთხედის შიგნით უნდა ჰქონდეს გახსნა მინიმუმ 1-1/2 დუიმი, რათა მოერგოს მილს და სენსორის ჩონჩხს. მას შემდეგ, რაც ჩარჩო აშენდება, გააღეთ ორი ხვრელი, რომელიც საშუალებას მისცემს მავთულხლართებს სენსორიდან და გამცემიდან, რათა დააკავშირონ ისინი დაფასთან.

*შენიშვნა: მიზანშეწონილია დაამატოთ წვდომის წერტილები, რათა შეძლოთ მილის ჩონჩხის ამოღება და ჩასმა იმ შემთხვევაში, თუ საჭიროა რემონტი ან მცირედი კორექტირება.

ნაბიჯი 9: ყველა ნაწილის გაერთიანება

ყველა ნაჭრის ერთად აწყობა
ყველა ნაჭრის ერთად აწყობა

ყველა წინა ნაბიჯის დასრულების შემდეგ დროა არფის აგება. პირველი მოათავსეთ მილის ჩონჩხი ხის ექსტერიერის შიგნით. შემდეგ შეაერთეთ მავთულები სენსორებისა და გამავრცელებლებისთვის დაფის სწორ ადგილას. შემდეგ გახსენით SDK და დააწკაპუნეთ გამართვის ღილაკზე დაფის დასაპროგრამებლად. დაფის დაპროგრამებისთანავე შეაერთეთ წყვილი ყურსასმენი ან დინამიკი. იმისდა მიხედვით, თუ რომელი სენსორი მთავრდება რომელ პმოდ პორტში თქვენი არფის სიმები სავარაუდოდ თავიდან მწყობრიდან გამოვა. იმის გამო, რომ ძნელი სათქმელია რომელი მავთული რომელ სენსორზე მიდის, როდესაც ამდენი მავთული ჩართულია, ჩვენ შევიტანეთ გზა სიმებიანი რიცხვების რუქის შესაწყვეტად პროგრამულ უზრუნველყოფაში. იპოვეთ "static int sensor_map [NUM_STRINGS]" და დაარეგულირეთ მნიშვნელობები მასივში, სანამ სტრიქონები არ დაიკვრება ქვედადან უმაღლესამდე.

მენიუს გამოყენება შესაძლებელია სერიული ტერმინალის (მაგ. RealTerm) გახსნით და ბაუდის სიჩქარის დაყენებით 115200 და ეკრანის ANSI. მენიუს ნავიგაცია შესაძლებელია w და s ღილაკების გამოყენებით ზემოთ და ქვემოთ და a და d ღილაკების მნიშვნელობების შესაცვლელად.

ნაბიჯი 10: გამოტოვეთ

მას შემდეგ, რაც არფა სრულად ფუნქციონირებს. დაეუფლეთ არფას და მოუსმინეთ საკუთარი მუსიკის ტკბილ ხმას!

გირჩევთ: