Hallo,
Ik probeer sinds een tijdje een softsynth te maken in C++. Ik heb niet veel ervaring met C++ of audioprogrammeren, dus het is allemaal een beetje nieuw. Tot nu toe ging het wel, maar nu heb ik echt een probleem.
Ik ben me eerst wat gaan verdiepen in de verschillende mogelijkheden om geluid te streamen. Ik wou een zo simpel mogelijke interface, waar ik het liefst alleen de samplerate, bufferlengte en het stereo of mono zijn van het outputsignaal aan hoef te geven. Dat is me inmiddels, na veel experimenteren gelukt met behulp van de waveOut interface. Ik weet dat deze verouderd is, maar ik kreeg het gewoon niet voor elkaar op andere manieren. Ik heb gekeken naar wasapi, xaudio2, VST, maar uiteindelijk kreeg ik het alleen met de waveOut interface voor elkaar om een sinus te streamen.
Ik heb eerst een console applicatietje gemaakt waarin je kan pianospelen op het keyboard (en er een sinus met de juiste toonhoogte gestreamd wordt). Dit werkte allemaal. Toen ik echter een windows applicatie wou maken (met de winApi), ben ik tegen een probleem aangelopen. In de console-applicatie kon ik gewoon een eindeloze loop gebruiken, maar bij de winapi moeten de window messages ook nog afgehandeld worden.
Ik heb er uiteindelijk voor gekozen een timer te zetten, die dus elke ~0.1 seconde (ik heb met meerdere intervallen geëxperimenteerd) afgaat. Over het algemeen gaat dit redelijk, maar als ik het venster kleiner maak, gaat er iets mis, waardoor de synth begint te 'stotteren'. Dit gebeurt ook als ik gewoon even, zeg 7 seconden, wacht, maar in veel mindere mate (je hoort klikjes door het geluid).
Ik vermoed dat het geheel gewoon te langzaam is. Dit is een beetje opmerkelijk, want doe niks meer dan een sinus streamen, terwijl DAW's toch hele nummers ter plekke kunnen synthesizen en streamen (ten minste, ik weet niet precies hoe veel ze daar precalculaten, maar een sinus moet toch wel realtime kunnen). Het kan zijn dat de interface die ik gemaakt heb het geheel wat langzamer maakt, maar ik kan me niet voorstellen dat dat zo'n enorm verschil maakt.
Heeft iemand een idee hoe dit kan komen? Is de waveOut interface zo langzaam of is een timer zetten gewoon niet de juiste manier? Als het nodig is kan ik mijn code (twee klassen met elk < 100 regels code) ergens online zetten, er is ongetwijfeld het éen en ander mee mis.
Alvast dank (en hulde als je je mijn vraag uit deze wall of text hebt weten te extraheren
)!
Ik probeer sinds een tijdje een softsynth te maken in C++. Ik heb niet veel ervaring met C++ of audioprogrammeren, dus het is allemaal een beetje nieuw. Tot nu toe ging het wel, maar nu heb ik echt een probleem.
Ik ben me eerst wat gaan verdiepen in de verschillende mogelijkheden om geluid te streamen. Ik wou een zo simpel mogelijke interface, waar ik het liefst alleen de samplerate, bufferlengte en het stereo of mono zijn van het outputsignaal aan hoef te geven. Dat is me inmiddels, na veel experimenteren gelukt met behulp van de waveOut interface. Ik weet dat deze verouderd is, maar ik kreeg het gewoon niet voor elkaar op andere manieren. Ik heb gekeken naar wasapi, xaudio2, VST, maar uiteindelijk kreeg ik het alleen met de waveOut interface voor elkaar om een sinus te streamen.
Ik heb eerst een console applicatietje gemaakt waarin je kan pianospelen op het keyboard (en er een sinus met de juiste toonhoogte gestreamd wordt). Dit werkte allemaal. Toen ik echter een windows applicatie wou maken (met de winApi), ben ik tegen een probleem aangelopen. In de console-applicatie kon ik gewoon een eindeloze loop gebruiken, maar bij de winapi moeten de window messages ook nog afgehandeld worden.
Ik heb er uiteindelijk voor gekozen een timer te zetten, die dus elke ~0.1 seconde (ik heb met meerdere intervallen geëxperimenteerd) afgaat. Over het algemeen gaat dit redelijk, maar als ik het venster kleiner maak, gaat er iets mis, waardoor de synth begint te 'stotteren'. Dit gebeurt ook als ik gewoon even, zeg 7 seconden, wacht, maar in veel mindere mate (je hoort klikjes door het geluid).
Ik vermoed dat het geheel gewoon te langzaam is. Dit is een beetje opmerkelijk, want doe niks meer dan een sinus streamen, terwijl DAW's toch hele nummers ter plekke kunnen synthesizen en streamen (ten minste, ik weet niet precies hoe veel ze daar precalculaten, maar een sinus moet toch wel realtime kunnen). Het kan zijn dat de interface die ik gemaakt heb het geheel wat langzamer maakt, maar ik kan me niet voorstellen dat dat zo'n enorm verschil maakt.
Heeft iemand een idee hoe dit kan komen? Is de waveOut interface zo langzaam of is een timer zetten gewoon niet de juiste manier? Als het nodig is kan ik mijn code (twee klassen met elk < 100 regels code) ergens online zetten, er is ongetwijfeld het éen en ander mee mis.
Alvast dank (en hulde als je je mijn vraag uit deze wall of text hebt weten te extraheren