INHOUDSOPGAWE:

Laserharp -sintetiseerder op Zybo -bord: 10 stappe (met foto's)
Laserharp -sintetiseerder op Zybo -bord: 10 stappe (met foto's)

Video: Laserharp -sintetiseerder op Zybo -bord: 10 stappe (met foto's)

Video: Laserharp -sintetiseerder op Zybo -bord: 10 stappe (met foto's)
Video: 10 gewoontes om gelukkig te worden 2024, Julie
Anonim
Laserharp -sintetiseerder op Zybo -bord
Laserharp -sintetiseerder op Zybo -bord

In hierdie handleiding sal ons 'n volledig funksionele laserharp skep met behulp van IR -sensors met 'n seriële koppelvlak waarmee die gebruiker die stem en toon van die instrument kan verander. Hierdie harp sal die 21ste eeuse remake van die eeue oue instrument wees. Die stelsel is geskep met behulp van 'n Xilinx Zybo -ontwikkelbord saam met die Vivado Design Suites. Wat u benodig om die projek te voltooi:

  • 12 IR -sensors en -senders (min of meer kan gebruik word, afhangende van die aantal snare)
  • Zybo Zynq-7000 ontwikkelingsbord
  • Gratis RTOS
  • Vivado Design Suite
  • Draad (om die sensors aan die bord te koppel)
  • 3 stukke PVC -pyp ((2) 18 duim en (1) 8 duim)
  • 2 PVC elmboë

Stap 1: Kry Digilent's Zybo DMA Audio Demo

Die FPGA -kant van hierdie projek is grootliks gebaseer op die demo -projek wat hier gevind word. Dit gebruik direkte geheuetoegang om data direk vanaf die geheue te stuur wat die verwerker via AXI Stream na 'n I2S -klankblok kan skryf. Die volgende stappe sal u help om die DMA -klank -demo -projek aan die gang te kry:

  1. 'N Nuwe weergawe van die bordlêer vir die Zybo -bord kan nodig wees. Volg hierdie instruksies om nuwe bordlêers vir Vivado te bekom.
  2. Volg stap 1 en 2 in die instruksies op hierdie bladsy om die demo -projek in Vivado oop te maak. Gebruik die Vivado -metode, nie die SDK -hardeware -oorhandiging nie.
  3. U kry moontlik 'n boodskap wat sê dat sommige van u ip -blokke opgedateer moet word. As dit die geval is, kies "Wys IP -status" en kies dan in die oortjie IP -status alle verouderde IP en klik op "Opgradeer geselekteer". As dit klaar is en 'n venster verskyn wat vra of u 'n uitsetproduk wil genereer, klik dan op "Genereer". As u 'n kritiese waarskuwingsboodskap kry, ignoreer dit.
  4. Skakel van die ontwerp na die bronne -oortjie in Vivado om die bronlêers te sien. Klik met die rechtermuisknop op die blokontwerp "design_1" en kies "Create HDL Wrapper". As u gevra word, kies 'kopieer gegenereerde omslag om gebruikersbewerkings toe te laat'. 'N Omslaglêer vir die projek sal gegenereer word.
  5. Noudat die kritieke stappe wat op die een of ander manier in die ander tutoriaal weggelaat is, voltooi is, kan u terugkeer na die voorheen gekoppelde tutoriaal en van stap 4 tot die einde voortgaan en seker maak dat die demo -projek korrek verloop. As u nie 'n manier het om klank in te voer om op te neem nie, neem dan net op met u koptelefoon en luister na 'n fuzzy geluid van 5-10 sekondes as u op die afspeelknoppie druk. Solank daar iets uit die koptelefoonaansluiting kom as u op die afspeelknoppie druk, werk dit waarskynlik korrek.

Stap 2: Maak 'n paar veranderinge in Vivado

Maak 'n paar veranderinge in Vivado
Maak 'n paar veranderinge in Vivado

Nou het u Digilent se DMA -klankdemo aan die werk, maar dit is glad nie die einddoel hier nie. Ons moet dus teruggaan na Vivado en 'n paar veranderings aanbring sodat ons sensors in die PMOD -koppe ingeprop kan word en ons die waarde daarvan aan die sagteware kan gebruik.

  1. Maak die blokdiagram in Vivado oop
  2. Skep 'n GPIO-blok deur met die rechtermuisknop in die leë spasie in die blokdiagram te klik en "Voeg IP" in die spyskaart te kies. Soek en kies "AXI GPIO".
  3. Dubbelklik op die nuwe IP-blok en gaan na die IP-konfigurasie-oortjie in die IP-venster wat weer aangepas is. Kies alle insette en stel die breedte op twaalf, aangesien ons 12 "snare" op ons harp sal hê en dus 12 sensors benodig. As u minder of meer sensors wil gebruik, pas dan hierdie nommer toepaslik aan. Stel ook aktiveer onderbreek in.
  4. Klik met die rechtermuisknop op die nuwe GPIO IP -blok en kies "Verbindingsoutomatisering uitvoer". Merk die AXI -boks en druk OK. Dit behoort die AXI -koppelvlak outomaties aan te sluit, maar laat die uitsette van die blok nie verbind nie.
  5. Om plek te maak vir die ekstra onderbreking, dubbelklik op die xlconcat_0 IP -blok en verander die aantal poorte van 4 na 5. Dan kan u die ip2intc_irpt -pen van die nuwe GPIO -blok aansluit op die nuwe ongebruikte poort op die xlconcat -blok.
  6. Klik met die rechtermuisknop op die "GPIO" -uitset van die nuwe GPIO IP -blok en kies "maak ekstern". Vind waarheen die lyn gaan en klik op die klein sywaartse vyfhoek en links moet 'n venster oopmaak waar u die naam kan verander. Verander die naam na "SENSORS". Dit is belangrik om dieselfde naam te gebruik as u wil hê dat die beperkingslêer wat ons verskaf werk, anders moet u die naam in die beperkingslêer verander.
  7. Terug in die bronne -oortjie, vind die beperkingslêer en vervang dit met die een wat ons verskaf. U kan kies om die lêer te vervang of net die inhoud van ons beperkingslêer te kopieer en dit oor die inhoud van die ou te plak. Een van die belangrikste dinge wat ons beperkingslêer doen, is om die pullup -weerstande op die PMOD -opskrifte moontlik te maak. Dit is nodig vir die spesifieke sensors wat ons gebruik het, maar nie alle sensors is dieselfde nie. As u sensors drukweerstands benodig, kan u elke geval van "set_property PULLUP true" verander met "set_property PULLDOWN true". As hulle 'n ander weerstandswaarde benodig as die op die bord, kan u hierdie lyne verwyder en eksterne weerstande gebruik. bladsy wat hier gevind kan word. As u verskillende pmod -penne wil gebruik, pas die name in die beperkingslêer by die etikette in skematiese. Ons gebruik PMOD -kop JE en JD, en gebruik ses datapennetjies op elk, sonder om penne 1 en 7. weg te laat. Hierdie inligting is belangrik wanneer u u sensors aansluit. Soos in die skema getoon, is penne 6 en 12 op die PMODS VCC en penne 5 en 11 word gemaal.
  8. Regenereer die HDL -omhulsel soos voorheen, en kopieer en skryf die ou een oor. As dit klaar is, genereer u bitstream en voer hardeware uit soos voorheen, en herlaai die SDK. As u gevra word of u die ou hardeware -lêer wil vervang, is die antwoord ja. Dit is waarskynlik die beste om die SDK toe te maak as u hardeware uitvoer, sodat dit behoorlik vervang word.
  9. Begin die SDK.

Stap 3: Begin FreeRTOS

Die volgende stap is om FreeRTOS op die Zybo -bord te laat loop.

  1. Laai FreeRTOS hier af en haal die lêers uit as u nog nie 'n afskrif het nie.
  2. Voer die FreeRTOS Zynq -demo in op FreeRTOSv9.0.0 / FreeRTOS / Demo / CORTEX_A9_Zynq_ZC702 / RTOSDemo. Die invoerproses is ongeveer dieselfde as vir die ander demo -projek, maar omdat die FreeRTOS Zynq -demo staatmaak op ander lêers in die FreeRTOS -lêergids, moet u die lêers nie na u werkruimte kopieer nie. In plaas daarvan moet u die hele FreeRTOS -lêergids in u projektmap plaas.
  3. Skep 'n nuwe pakketondersteuningspakket deur na "file" -> "new" -> "board support package" te gaan. Maak seker dat selfstandig gekies is en klik op afwerking. Na 'n rukkie verskyn 'n venster, merk die blokkie langs lwip141 (dit keer dat een van die FreeRTOS -demo's nie kan opstel nie) en klik OK. Nadat dit voltooi is, klik met die rechtermuisknop op die RTOSdemo -projek en gaan na "eiendomme", gaan na die oortjie "projekverwysings" en merk die blokkie langs die nuwe bsp wat u geskep het. Hopelik sal dit erken word, maar soms kan die Xilinx SDK vreemd wees oor hierdie soort dinge. As u na hierdie stap nog steeds 'n fout kry dat xparameters.h ontbreek of iets dergeliks, probeer dan om hierdie stap te herhaal en miskien die SDK te verlaat en weer te begin.

Stap 4: Voeg Laser Harp -kode by

Noudat FreeRTOS ingevoer is, kan u die lêers van die laserharp -projek na die FreeRTOS -demo bring

  1. Skep 'n nuwe gids onder die src -lêergids in die FreeRTOS -demo en kopieer en plak al die c -lêers behalwe main.c in hierdie gids.
  2. Vervang die RTOSDemo main.c met die meegeleverde main.c.
  3. As alles reg gedoen word, moet u die laserharpkode op hierdie stadium kan uitvoer. Vir toetsdoeleindes word die knoppie -invoer wat in die DMA -demo -projek gebruik is, nou gebruik om klanke te speel sonder dat sensors aangeheg is (enige van die vier hoofknoppies werk). Dit speel 'n snaar elke keer as u daarop druk en deur al die snare in die stelsel deur meer as een druk druk. Koppel 'n paar koptelefoon of luidsprekers aan die koptelefoonaansluiting op die Zybo -bord en maak seker dat u die geluide van die snare hoor hoor as u op 'n knoppie druk.

Stap 5: Oor die kode

Baie van u wat hierdie tutoriaal lees, sal waarskynlik hier leer hoe om klank op te stel of DMA te gebruik om iets anders te doen, of om 'n ander musiekinstrument te maak. Daarom gaan die volgende paar afdelings daaroor om te beskryf hoe die verskafde kode werk saam met die hardeware wat voorheen beskryf is om 'n werkende klankuitset met DMA te kry. As u verstaan waarom die kodestukke daar is, moet u dit kan aanpas vir wat u ook al wil skep.

Onderbreek

Eerstens noem ek hoe onderbrekings in hierdie projek ontstaan. Die manier waarop ons dit gedoen het, was deur eers 'n onderbrekingsvektortabelstruktuur te skep wat die ID, onderbrekingshanteerder en 'n verwysing na die toestel vir elke onderbreking hou. Die onderbrekings -ID's kom van xparameters.h. Die interrupt -hanteerder is 'n funksie wat ons vir die DMA en GPIO geskryf het, en die I2C -interrupt kom van die Xlic I2C -bestuurder. Die apparaatverwysing dui op gevalle van elke toestel wat ons elders inisieer. Teen die einde van die _init_audio -funksie gaan 'n lus deur elke item in die onderbrekingsvektortabel en roep twee funksies, XScuGic_Connect () en XScuGic_Enable () aan om die onderbrekings aan te sluit en moontlik te maak. Hulle verwys na xInterruptController, wat standaard 'n onderbrekingskontroleerder is wat in die FreeRTOS main.c geskep is. So basies heg ons elkeen van ons onderbrekings aan hierdie onderbrekingskontroleerder wat reeds deur FreeRTOS vir ons geskep is.

DMA

Die initialiseringskode van die DMA begin in lh_main.c. Eerstens word 'n statiese voorbeeld van 'n XAxiDma -struktuur verklaar. Dan word dit in die _init_audio () -funksie gekonfigureer. Eerstens word die konfigureerfunksie van die demo -projek genoem, wat in dma.c. Dit is redelik goed gedokumenteer en kom direk uit die demo. Dan word die onderbreking verbind en geaktiveer. Vir hierdie projek is slegs die master-to-slave-onderbreking nodig, omdat alle data deur die DMA na die I2S-beheerder gestuur word. As u klank wil opneem, benodig u ook die onderbreking van slawe-tot-meester. Die meester-tot-slaaf-onderbreking word gebel wanneer die DMA klaar is met die uitstuur van die gegewens wat u gesê het om te stuur. Hierdie onderbreking is ongelooflik belangrik vir ons projek, want elke keer as die DMA klaar is met die stuur van een buffer klankmonsters, moet dit onmiddellik begin met die stuur van die volgende buffer, anders kan daar 'n hoorbare vertraging tussen die sendings voorkom. Binne die funksie dma_mm2s_ISR () kan u sien hoe ons die onderbreking hanteer. Die belangrike deel is naby die einde waar ons xSemaphoreGiveFromISR () en portYIELD_FROM_ISR () gebruik om _audio_task () in kennis te stel dat dit die volgende DMA -oordrag kan begin. Die manier waarop ons konstante klankdata stuur, is deur afwisselend tussen twee buffers. As een buffer na die I2C -blok oorgedra word, word die waardes daarvan bereken en geberg deur die ander buffer. As die onderbreking van die DMA af kom, skakel die aktiewe buffer oor en begin die meer onlangs geskrewe buffer oorgedra word, terwyl die buffer wat voorheen oorgedra is, met nuwe data oorgeskryf word. Die belangrikste deel van die _audio_task -funksie is waar fnAudioPlay () gebel word. fnAudioPlay () neem die DMA -instansie, die lengte van die buffer en 'n wyser na die buffer waaruit data oorgedra sal word. 'N Paar waardes word na I2S -registers gestuur om te laat weet dat daar nog monsters kom. Dan word XAxiDma_SimpleTransfer () gebel om die oordrag te begin.

I2S klank

audio.c en audio.h is waar die initialisering van I2S plaasvind. I2S -inisialiseringskode is 'n redelik algemene stuk kode wat op 'n aantal plekke ronddwaal; u kan geringe variasies van ander bronne vind, maar hierdie moet werk. Dit is redelik goed gedokumenteer en hoef nie veel verander te word vir die harp -projek nie. Die DMA -klankdemo waaruit dit gekom het, het funksies om oor te skakel na die mikrofoon- of lyninvoer, sodat u dit kan gebruik as u die funksie nodig het.

Klank sintese

Om te beskryf hoe die klanksintese werk, gaan ek 'n lys maak van elk van die klankmodelle wat in die ontwikkeling gebruik is, wat tot die finale metode gelei het, aangesien dit u 'n idee sal gee waarom dit gedoen word soos dit gedoen word.

Metode 1: Een periode van sinuswaardes word vir elke snaar bereken op die ooreenstemmende frekwensie vir die snit se musieknoot en in 'n skikking gestoor. Die lengte van die skikking is byvoorbeeld die periode van die sinusgolf in monsters, wat gelyk is aan # monsters / siklus. As die monsternemingstempo 48 kHz is en die nootfrekwensie 100 Hz, dan is daar 48 000 monsters/sekonde en 100 siklusse/sekonde wat lei tot 4800 monsters per siklus, en die skikkinglengte sal 4800 monsters wees en bevat die waardes van een volledige sinusgolfperiode. As die snaar gespeel word, word die klankmonsterbuffer gevul deur 'n waarde uit die sinusgolfreeks te neem en dit as 'n voorbeeld in die klankbuffer te plaas, en dan die indeks in die sinusgolfreeks te verhoog sodat ons ons vorige voorbeeld in die loop gebruik van 4800 monsters word een sinusgolfsiklus in die klankbuffer geplaas. 'N Modulobewerking word op die skikkingindeks gebruik, sodat dit altyd tussen 0 en die lengte val, en as die skikkingindeks oor 'n sekere drempel gaan (byvoorbeeld monsters van 2 sekondes), word die string afgeskakel. Om verskeie snare gelyktydig te speel, hou die skikkingindeks van elke snaar afsonderlik by en voeg die waarde van die sinusgolf van elke snaar bymekaar om elke monster te kry.

Metode 2: Om 'n meer musikale toon te skep, begin ons met die vorige model en voeg harmonieke by elke fundamentele frekwensie. Harmoniese frekwensies is frekwensies wat heelgetalle veelvoude van die fundamentele frekwensie is. Anders as wanneer twee onverwante frekwensies saamgevat word, wat lei tot twee verskillende klanke wat gelyktydig gespeel word, as harmonieke bymekaar gevoeg word, klink dit net soos een klank, maar met 'n ander toon. Om dit te bereik, voeg ons ook elke keer (2 * skikkingindeks % skikkinglengte) en (3 * skikkingindeks % skikkinglengte) elke keer as ons die waarde van die sinusgolf op die plek (skikkingindeks % skikkingslengte) by die klankmonster, by), ensovoorts, alhoewel baie harmonieke verlang word. Hierdie vermenigvuldigde indekse sal die sinusgolf deurkruis by frekwensies wat heelgetalle veelvoude van die oorspronklike frekwensie is. Om die toon meer te beheer, word die waardes van elke harmonika vermenigvuldig met 'n veranderlike wat die hoeveelheid harmonie in die algehele klank voorstel. Byvoorbeeld, die fundamentele sinusgolf kan sy waardes hê wat almal met 6 vermenigvuldig word om dit meer 'n faktor in die algehele klank te maak, terwyl die 5de harmoniese 'n vermenigvuldiger van 1 kan hê, wat beteken dat sy waardes baie minder bydra tot die algehele klank.

Metode 3: Oké, nou het ons 'n baie goeie toon op die note, maar daar is nog steeds 'n redelik belangrike probleem: hulle speel vir 'n vaste tyd op 'n vaste volume. Om enigsins soos 'n regte instrument te klink, moet die volume van 'n snaar wat gespeel word, mettertyd glad verval. Om dit te bereik, word 'n skikking gevul met die waardes van 'n eksponensieel vervalle funksie. As die klankmonsters nou geskep word, word die geluid van elke string bereken soos in die vorige metode, maar voordat dit by die klankmonster gevoeg word, word dit vermenigvuldig met die waarde by die snaar se skikkingindeks in die eksponensiële vervalfunksieskikking. Dit laat die geluid mettertyd glad verdwyn. As die skikkingindeks die einde van die vervalskikking bereik, word die string gestop.

Metode 4: Hierdie laaste stap gee die snaarklanke werklik hul realistiese snaarklank. Voordat dit aangenaam geklink het, maar duidelik gesintetiseer is. Om 'n harpstring in die regte wêreld beter te probeer navolg, word elke harmoniek 'n ander verval koers toegeken. In regte snare, as die snaar die eerste keer geslaan word, is daar 'n hoë inhoud van hoëfrekwensie harmonieke wat die soort plukgeluid skep wat ons van 'n snaar verwag. Hierdie hoëfrekwensie -harmonieke is baie kortliks die belangrikste deel van die klank, die klank van die snaar wat geslaan word, maar hulle verval baie vinnig namate die stadiger harmonieke oorneem. 'N Vervalreeks word geskep vir elke harmoniese getal wat gebruik word in klanksintese, elk met sy eie vervalstempo. Nou kan elke harmonika onafhanklik vermenigvuldig word met die waarde van die ooreenstemmende vervalskikking by die skikkingindeks van die snaar en by die klank gevoeg word.

In die algemeen is die klanksintese intuïtief, maar berekend swaar. Om die hele snaarklank tegelyk in die geheue te stoor, verg te veel geheue, maar die berekening van die sinusgolf en die eksponensiële funksie tussen elke raam sal te lank neem om tred te hou met die tempo van klankweergawe. 'N Aantal truuks word in die kode gebruik om die berekening te bespoedig. Alle wiskunde, behalwe by die aanvanklike skepping van die sinus- en eksponensiële vervalstabelle, word in 'n heelgetalformaat gedoen, wat die beskikbare numeriese ruimte in die 24 -bit -klankuitset moet versprei. Die sinustabel is byvoorbeeld van amplitude 150 sodat dit glad is, maar nie so groot dat baie snare wat saamgespeel word, meer as 24 bisse kan wees nie. Net so word die eksponensiële tabelwaardes met 80 vermenigvuldig voordat dit na heelgetalle afgerond en gestoor word. Die harmoniese gewigte kan diskrete waardes aanneem tussen 0 en 10. Ook word alle monsters eintlik verdubbel en die sinusgolwe word met 2's geïndekseer, wat die bemonsteringstempo effektief halveer. Dit beperk die maksimum frekwensie wat gespeel kan word, maar was nodig om die huidige aantal snare en harmonieke vinnig genoeg te bereken.

Om hierdie klankmodel te skep en aan die werk te kry, het aan die verwerkerkant baie moeite gekos, en dit sou ongelooflik moeilik gewees het om dit aan die fpga -kant van die begin af te laat werk in die tydsraamwerk van hierdie projek (stel u voor dat u elke keer die bitstream moet herskep) keer dat 'n stuk verilog verander is om die klank te toets). As u dit op die fpga doen, is dit egter waarskynlik 'n beter manier om dit te doen, en dit kan die probleem uitskakel om nie vinnig genoeg monsters te kan bereken nie en meer snare, harmonieke en selfs klankeffekte of ander take op die verwerker se kant.

Stap 6: Bedrading van die sensors

Die bedrading van die sensors
Die bedrading van die sensors

Om die snare te skep, gebruik ons IR breekbalsensors wat sal opspoor wanneer die snaar gespeel word. Ons het ons sensors vanaf die volgende skakel bestel. Die sensors het 'n krag-, grond- en datadraad, terwyl die uitstuurers slegs 'n krag- en gronddraad het. Ons het die 3.3 V- en grondpenne van die PMOD -kopstukke gebruik om die emitters en sensors aan te dryf. Om al die sensors en emitters aan te dryf, is dit nodig om al die sensors en emitters parallel aan te sluit. Die datadrade van die sensors moet elkeen na hul eie pmod -pen gaan.

Stap 7: Die konstruksie van die skelet

Die konstruksie van die skelet
Die konstruksie van die skelet

Om die vorm van die harp te skep, word die drie stukke as 'n geraamte gebruik om die sensors en uitstralers op te sit. Op een van die twee stukke PVC -pyp van 18 duim, pas die sensors en afgee in afwisselende volgorde 1,5 sentimeter van mekaar af en plak dit dan aan die pyp vas. Op die ander 18 duim PVC -pyp pas die sensors en emitters in afwisselende volgorde in, maar maak seker dat u die volgorde verreken (dit wil sê, as die eerste pyp eers 'n sensor gehad het, moet die tweede eers 'n emitter hê en omgekeerd). Dit sal nodig wees om langer drade aan die data-, krag- en gronddrade te soldeer om te verseker dat hulle die bord kan bereik.

Stap 8: Bou die buitekant van die hout

Bou die buitekant van die hout
Bou die buitekant van die hout

Hierdie stap is opsioneel, maar word sterk aanbeveel. Die hout se buitekant laat die harp nie net mooi lyk nie, dit beskerm ook die sensors en drade teen skade. Die houtraam kan gemaak word deur 'n heilige vierkantige ring van hout. Die binnekant van die reghoek moet 'n opening van minstens 1-1/2 duim hê om by die pyp en sensorskelet te pas. Sodra die raam gebou is, boor u twee gate waarmee die drade van die sensor en die stralers uitkom om dit met die bord te verbind.

*Opmerking: dit word aanbeveel om toegangspunte by te voeg om die pypskelet te kan verwyder en in te sit indien herstelwerk gedoen moet word of geringe aanpassings gemaak moet word.

Stap 9: Sit al die stukke bymekaar

Sit al die stukke bymekaar
Sit al die stukke bymekaar

Sodra al die vorige stappe voltooi is, is dit tyd om die harp te bou. Plaas eers die pypskelet binne die buitekant van die hout. Koppel dan die drade vir die sensors en uitstralers aan op die regte plek op die bord. Maak dan die SDK oop en klik op die ontfoutknoppie om die bord te programmeer. Sodra die bord geprogrammeer is, koppel 'n koptelefoon of 'n luidspreker aan. Afhangende van watter sensor in die pmod -poort beland, sal die snare van u harp waarskynlik eers buite werking wees. Omdat dit moeilik kan wees om te bepaal watter draad na watter sensor gaan as daar soveel drade betrokke is, het ons 'n manier ingesluit om stringgetalle in kaart te bring om bitposisies in sagteware te onderbreek. Soek "static int sensor_map [NUM_STRINGS]" en pas die waardes in die skikking aan totdat die snare van laagste na hoogste in volgorde speel.

Die spyskaart kan gebruik word deur 'n seriële terminale (bv. RealTerm) oop te maak en die baud -tempo op 115200 en die skerm op ANSI te stel. U kan deur die spyskaart navigeer deur die w en s sleutels te gebruik om op en af te beweeg en die a en d sleutels om die waardes te verander.

Stap 10: ROTS UIT

Sodra die harp ten volle funksioneel is. Bemeester die harp en luister na die soet geluid van u eie musiek!

Aanbeveel: