dinsdag 21 oktober 2014

Muziek in een doosje

Ik wil muziek maken! Het is te zeggen, zoals met mijn Mp3 potje wil ik muziek of spraak die vooraf is opgenomen, opnieuw afspelen ergens in een bos.

Maar ik heb dat potje al, dus waarom iets veranderen dat werkt? Omdat het niet zo goed werkt, en omdat alles beter kan. De batterij laat het te snel afweten en de grootte van het potje irriteert me. Ook het feit dat er een SD kaartje in zit, zit me niet lekker. Kleine SD-kaartjes van 128Mb vind ik hier nergens meer en de Chinese versies zijn onbetrouwbaar.

Ander en beter, dacht ik dus. Maar het alternatief onder het motto: "wat je zelf doet, doe je beter", is in dit geval een behoorlijke uitdaging. Om te beginnen ga ik dus geen MP3 module meer gebruiken zoals vroeger. Zo'n module is voorgeprogrammeerd om muziek te spelen die op een SD kaartje staat. Het enige dat mijn potje doet is met een aparte microcontroller de module besturen als er een magneet in de buurt komt.

Nu moet het dus anders. Ik ga zelf een module maken die geheugen heeft om de muziek op te slaan en een D/A convertor om de digitale signalen hoorbaar te maken door MP3 oortjes. Omdat dat allemaal nieuw is voor mij, was dit de eerste stap. Een Chinees verkocht 20 D/A covertors voor een dollar en dat boeide me. Ik ging er vandaag mee aan de slag en weet nu waarom ie die prijs hanteerde.



Uiteraard gaat het zo niet in een potje, we zijn slechts in de experimenteerfase. Links zie je een mini Arduino en rechts de beruchte Chinees (PCF8591). Het is een chip met 4 A/D convertors en één D/A convertor. Hij heeft dus te veel pinnen en is nog te groot voor wat ik echt nodig heb. Maar dat is nu even het minste van mijn zorgen.

De chip doet de D/A coversie serieel, dat wil zeggen dat de Arduino links muziek data zal doorgeven door twee draadjes. Daar zit dus meteen de belangrijkste reden om deze chip niet te gebruiken. De seriële interface kan 100kbps versturen, wat op zich best veel is. Maar als ik 8 bits nodig heb per sample (het blijken er 9 te zijn), kan ik dus 11000 bytes per seconde versturen. Dat is behoorlijk weinig als je weet dat een CD speler er 44100 verstuurt. Ik zal dus geluiden met een frequentie boven 5500 Hz niet kunnen afspelen en dat is een probleem. Nu sta ik niet te springen om CD kwaliteit in een bos te brengen, maar enkel spraak onder de 5500 Hz klinkt al niet mooi meer. De 's' klanken worden 'sj' klanken en het verschil tussen een 't' en de 'p' zal vervagen.

Toch moest ik even proberen wat ie kon. Geef toe, dit is een mooie zaagtand die de Arduino heeft verzonnen. Hij is samengesteld uit 512 waarden van 0 tot 255 en weer terug naar 0. De vorm is goed, maar je hoort niks. Dat komt omdat alles zo traag gaat dat ie maar 5 Hz is. Je hoort dus niks. Nu is dat geen punt, want ik moet voor één vorm nooit 512 waarden gebruiken, een CD speler kan dat ook niet.


Ik kan 50 waarden proberen zoals hier, maar er loopt iets mis. De chip heeft een soort datamodus (die heb ik nodig) om enkel data te versturen over de bus. Je stuurt enkele bytes om te zeggen dat ie in die modus moet werken, en alles wat je dan stuurt, moet ie als data beschouwen.

En dat doet ie dus niet! Je ziet dat de vorm kleine hoekjes heeft, zo zouden er dus 50 moeten komen. Maar in de helft geeft ie het op, en daardoor is de golf plots onderbroken. Ik kan dus maximaal een 20 of 30-tal bytes sturen in deze modus, en dan zou ik weer twee bytes moeten sturen om opnieuw te starten. Maar dan zijn er dus kleine hiaten elke 20 of 30 samples. En dat zal je zeker horen als een constante ruis. Het alternatief is die modus niet gebruiken (zoals de eerste foto), maar dan beperk ik het aantal samples tot 3000 à 4000 per seconde, en dat is waardeloos. Spraak van 1.5 à 2 kHz kan je echt niet maken, een goed oor kan tot 15 kHz horen.

Soit, ik kan er dus niks mee doen en een volgende lading chips is onderweg. Ze zijn veel kleiner en de seriële bus is een SPI bus. Die is niet beperkt in snelheid tenzij de snelheid van de Arduino me parten speelt. Maar daar gaan we even niet vanuit.

Oh ja, ze zijn ook veel veel duurder, die andere chips. In plaats van twintig voor één dollar heb ik er maar twee voor één dollar.

Duur hè ;-)

1 opmerking: