Aanpasbare real-time waveform generator met direct gevolg (SoundCard Out)

Ik was op zoek naar een Real-Time Waveform Generator die de soundkaart van de PC doet aansturen.
Daarmee wou ik een WaveForm in Real-Time aanpassen door de grafiek op het scherm te veranderen, waarna het effect meteen in werking treed.
Dus dan hoef ik niet steeds weer Wave-Forms met Audacity te maken (meerdere 360 graden sinussen achter elkaar te plakken om zo een geluidsbestand van 1 min te maken) en steeds weer uitproberen of het dan wat beter is, en steeds lang zitten te klooien. Je moet er enorm veel tijd aan besteden.
Dus toen dacht ik aan iets waardoor je meteen het effect van de aanpassing kon waarnemen.

Ik kwam toen uit op SigGen wat in code geschreven is.
Het is in Visual basic 6 en in C te vinden.
Geen van bijde krijg ik foutloos aan het werk en dus ook niet gecompileerd voor eigen gebruik.

Het installeren van VB6 is al lastig genoeg met alle meldingen, en bij het openen van het SigGen.vbp project kom je ook al 5 meldingen tegen.
Toch krijg ik het aan de praat maar met wat beperkingen, zie foto hieronder: (er zijn wat instel mogelijkheden weg)

De waveform kan op het scherm aangepast worden terwijl het geluid afspeeld, dus dat werkt goed.
Maar als ik het programma afsluit en daarna weer het project wil laden, dan gaat dat niet meer.
Ik moet dan weer de gezipte file uitpakken en weer laden.

Kijk zo handig is dit, je ziet gewoon 1 sinus die je doet aanpassen:

Enig idee om dit aan de praat te krijgen of om het te compileren ?
Het is gewoon een VERREKT handig programma-tje die je nog wel eens hard nodig kan hebben.
Of is er misschien een alternatief zonder ervoor D/A omzetters te moeten aanschaffen ?

VB6 code (link)

code:

leeg

[Bericht gewijzigd door daan69 op 29 februari 2020 03:49:42 (92%)]

Jammer dat die soepkip het commentaar allemaal in het Italiaans heeft geschreven...;) (commentaar bij sourcecode altijd in het Engels; dat begrijpt (bijna) iedereen)
Als het alleen om sinussen gaat is het vrij simpel. Ik heb eventueel nog een programmaatje wat sinusbestanden maakt met instelbare lengte.
Kun je ook een sweepfile mee maken... (van xx Hz tot yy Hz in zz sec)

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Heb het even opgedoken, is een command-line tooltje. (SWEEP.EXE in zipfile). Maakt een 44kHz mono file aan.
Source is maar liefst enkele tientallen regels lang... ;)
Starten: SWEEP AAA,BBB,CCC (AAA = startfreq in Hz, BBB = stopfreq in Hz, CCC is lengte in seconden. Voor constante toon zijn AAA en BBB dus gelijk)

code:


'==================================================================================================
#COMPILE EXE
#DIM ALL
'--------------------------------------------------------------------------------------------------
FUNCTION PBMAIN
  LOCAL Pi AS DOUBLE, TempSine, FStep AS SINGLE, iResult, iTmp AS INTEGER
  LOCAL hFile, Freq_Lo, Freq_Hi, SampRate, Cnt, Duration, Ampli AS LONG
  LOCAL FName, Cmd AS STRING, FLength AS DWORD
  '------------------------------------------------------------------------------------------------
  Cmd = REMOVE$(COMMAND$, ANY " ")                                          'Process commandstring
  IF PARSECOUNT(Cmd, ANY ", ") = 3 THEN
    FName     = PARSE$(Cmd, ANY ", ",1) & "_" & PARSE$(Cmd, ANY ", ",2) & _
                "_" & PARSE$(Cmd, ANY ", ",3) & ".WAV"
    Freq_Lo   = VAL(PARSE$(Cmd, ANY ", ",1))
    Freq_Hi   = VAL(PARSE$(Cmd, ANY ", ",2))
    Duration  = VAL(PARSE$(Cmd, ANY ", ",3))
    COLOR 15,0
  ELSE
    COLOR 14,0
    PRINT "Parameters incorrect. Please use command-line:"
    PRINT "Sweep <start>,<stop>,<duration>"
    PRINT "- <start> = startfrequency in Hz"
    PRINT "- <stop>  = stopfrequency in Hz"
    PRINT "- <duration> = file length in seconds."
    COLOR 7,0
    EXIT FUNCTION
  END IF                                                                    '
  '------------------------------------------------------------------------------------------------
  SampRate  = 44100                                                         'Set WAV header parms
  FStep     = (Freq_Hi - Freq_Lo) / (Duration * SampRate)                   '
  FLength   = Duration * SampRate                                           '
  Pi        = 4 * ATN(1)                                                    '
  Ampli     = 100                                                           '

  PRINT "File " & FName & " will be created. (will take some time)"
  PRINT "Sweep from " & FORMAT$(Freq_Lo) & " to " & FORMAT$(Freq_Hi) & " Hz, length " & FORMAT$(Duration)& " sec." '
  PRINT
  '------------------------------------------------------------------------------------------------
  ' Open file and write WAV file header
  '------------------------------------------------------------------------------------------------
  hFile = FREEFILE
  OPEN FName FOR BINARY AS #hFile                     'opens the wav file
  PUT$ #hFile, "RIFF"                                 'RIFF header
  PUT$ #hFile, MKDWD$(FLength + (44-8))               'Length data + 36
  PUT$ #hFile, "WAVEfmt "                             'WAVE header
  PUT$ #hFile, MKDWD$(16)                             'Format chunk
  PUT$ #hFile, MKWRD$(1)                              'File format
  PUT$ #hFile, MKWRD$(1)                              'Channels
  PUT$ #hFile, MKDWD$(SampRate)                       'Sampling rate
  PUT$ #hFile, MKDWD$(SampRate)                       'Bytes per second
  PUT$ #hFile, MKWRD$(1)                              'Alignment
  PUT$ #hFile, MKWRD$(8)                              'Bits per sample
  PUT$ #hFile, "data"                                 'Data chunk starts here
  PUT$ #hFile, MKDWD$(FLength)                        'Length data

  '------------------------------------------------------------------------------------------------
  ' Now create and write all the samples we need
  '------------------------------------------------------------------------------------------------
  DO
    iTmp = 127 + Ampli * SIN(TempSine)
    iResult = 127 + Ampli * SIN(TempSine)
    TempSine = TempSine + 2 * Pi * ((Freq_Lo + FStep * Cnt) / SampRate)
    IF TempSine > 2 * Pi THEN TempSine = TempSine - 2 * Pi
    PUT$ #hFile, CHR$(LOBYT(iResult))
    INCR Cnt
  LOOP UNTIL Cnt = FLength
  
  PRINT "File " & FName & " is created."
  PRINT "Sweep from " & FORMAT$(Freq_Lo) & " to " & FORMAT$(Freq_Hi) & " Hz, length " & FORMAT$(Duration)& " sec." '
  FLUSH #hFile
  CLOSE #hFile
  COLOR 7,0
END FUNCTION
Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Op 24 februari 2020 00:34:20 schreef Arco:
Jammer dat die soepkip het commentaar allemaal in het Italiaans heeft geschreven...;) (commentaar bij sourcecode altijd in het Engels;

Nee hoor! In de landstaal van je doelgroep.

Bezoek mijn neefjes' site: www.tinuselectronics.nl

Het gaat mij niet om een programma waarbij je met Hz en amplitude en lengte een formwave kan creëren.

Wat belangrijk is, is dat de vorm van de sinus kan worden aangepast (waardoor het eigenlijk niet meer een echte sinus is) en het liefst in real-time.

van:

Naar:

Ah, oke...

Je had het over 'aan elkaar plakken van sinussen', maar daar heeft het dus eigenlijk niks mee te maken... ;)
(je wilt willekeurige golfvormen kunnen maken)

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Klopt, want dat doet het programma zelf.
Je maakt 1 sinus naar wens, en het programma maakt er een oneindige loop van, en stopt ook niet met afspelen tenzij je op "stop" klikt.

Maar ja deze (SigGen in VisualBasic6.0 code) werkt niet goed, en kan hem dus ook niet compileren
Link WebSite
Link Zip-Bestand (VB6 project)

of iemand die weet hoe het aan de praat te krijgen,
of anders een alternatief (heb zelf nog niks kunnen vinden)

Gebruik je WinXP en VB6 ? Ik heb wel dit gevonden:

https://create.arduino.cc/projecthub/BruceEvans/arduino-due-...tor-a9d180

Daar heb je wel een arduino Due bij nodig.

It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.

Die VB sourcecode geeft veel errors, maar compileert desondanks wel tot een werkend geheel...

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Arco, Krijg jij SinGen gecompileerd dan?
Ook met behoud van de /\ en \/ buttons ?

Ik heb de link van Roland even bestudeerd maar ik denk niet dat dit gaat werken met auto-fill en de rest van die dingen.
Het gaat om de sinus-vorm aan te passen met de muis-aanwijzer, en dan in een loop afspelen.

Ik kwam net CurveCTRL_DEMO tegen maar daarmee maak je alleen de curve, en wordt er geen geluid van gemaakt.

[Bericht gewijzigd door daan69 op 25 februari 2020 19:03:18 (24%)]

Compileren gaat goed, run in de interpreter ook (komt geluid uit), alleen kun je geen exe maken.
De fouten worden veroorzaakt door niet geregistreerde libraries (waarschijnlijk OCX'en), gewoon doorklikken bij elke fout.
(of de libraries aanmelden in de registry)

Wat je met /\ en /\ buttons bedoelt weet ik niet, die zie ik nergens. (met de muis de sinus 'uitrekken' gaat wel)

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Zie boven de rode pijlen (Up/Down is leeg)

Hieronder, zo moet het zijn:

Ah,

Even op die website gekeken, daar horen updown controls te zitten... ;) (je kunt wel gewoon de waarde in de editboxen aanpassen.)
Om alles te laten werken zul je zoals gezegd de libraries in de registry moeten aanmelden...

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Om die libraries te registreren, moet je daar geen serial-nummer en een account voor hebben ?
Normaal krijg je dat bij aankoop.
Maar wat als je nu dit sterk verouderde VB6 wil installeren ?

Is (gelukkig) al heel lang geleden dat ik wat met VB heb gedaan... ;)
Hier staat beschreven hoe je een OCX registreert: https://support.microsoft.com/nl-nl/help/146219/how-to-regis...x-manually
(ik weet niet wat er nodig is, maar gezien de ontbrekende updown controls in ieder geval de COMCTL32.OCX)

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com
blackdog

Golden Member

Hi daan69,

Vraagje, waar heb je dit voor nodig?
Het kan natuurlijk zo zijn dat je graag met Visual Basic worsteld, maar tegenwoording kan dit ook vrij aardig met een goedkope functie generator.
Scheeld je heel veel tijd als dit belangrijk voor je is.

Kijk een naar deze generator, is de goedkoopste uit de range en is 10MHZ max. (veel meer dan je geluidskaart)
https://www.eleshop.nl/catalog/product/view/id/2343/s/rigol-...egory/326/

Je kan daar heel mooi je golvormen mee maken.

Groet,
Bram

Waarheden zijn "Illusies waarvan men vergeten is dat het illusies zijn"

@Blackdog, niet goed gelezen, je hebt gelijk. daan69 wil een AWG generator. Net als @Arco is het jaren terug dat ik iets met VB heb gedaan, je kunt VB6 naar VB.net converteren, maar je zal het nodig werk zelf moeten doen.

[Bericht gewijzigd door Roland van Leusden op 26 februari 2020 12:05:26 (10%)]

It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.
blackdog

Golden Member

Hi Roland,

De voorgestelde generator is een AWG model. :-)

Groet,
Bram

Waarheden zijn "Illusies waarvan men vergeten is dat het illusies zijn"

Nou, niet dat ik met VB6 wil worstelen, maar ik kom eigenlijk nog niks anders tegen wat het werk kan doen en via de soundcard kan uitsturen.

PS: Het gaat mij nog steeds om de grafiek van de waveform op het scherm in realtime met de muiswijzer aan te passen waardoor de verandering meteen in werking treed en het effect ook meteen waarneembaar is.

Als je de updown keys niet nodig hebt, dan werkt 't zo al (frequentie e.d. kun je direct in de edit boxes inkloppen)

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Ja klopt.
Ik vond dat er wat te weinig punten waren waarmee je de waveform kon aanpassen.
Ben toen gaan kijken hoe het programma de waveform doet opslaan, gewoon X/Y Coördinaten in een kladblok bestand.
Zoals je onder kan zien heb ik gewoon 20 punten erbij gerekend.

code:

CODE VOOR 20 PUNTEN:

0,0
.0005,.309016994374947
.001,.587785252292473
.0015,.809016994374947
.002,.951056516295153
.0025,1
.003,.951056516295154
.0035,.809016994374949
.004,.587785252292475
.0045,.30901699437495
.005,3.23108510433268E-15
.0055,-.309016994374944
.006,-.58778525229247
.0065,-.809016994374945
.007,-.951056516295152
.0075,-1
.008,-.951056516295155
.0085,-.809016994374951
.009,-.587785252292478
.0095,-.309016994374954
.01,0

20 PUNTEN:

===================================================================================================

code:

CODE VOOR 40 PUNTEN:

0,0
.0003,.159016994374954
.0005,.309016994374947
.0008,.459016994374947
.001,.587785252292473
.0012,.707785252292473
.0015,.809016994374947
.0017,.889016994374947
.002,.951056516295153
.0022,.981056516295153
.0025,1
.0028,.981056516295153
.003,.951056516295154
.0033,.889016994374947
.0035,.809016994374949
.0037,.707785252292473
.004,.587785252292475
.0042,.459016994374947
.0045,.30901699437495
.0047,.15901699437495
.0050,0
.0052,-.159016994374954
.0055,-.309016994374944
.0057,-.459016994374947
.006,-.58778525229247
.0062,-.707785252292473
.0065,-.809016994374945
.0067,-.889016994374947
.007,-.951056516295152
.0072,-.981056516295153
.0075,-1
.0078,-.981056516295153
.008,-.951056516295155
.0082,-.889016994374947
.0085,-.809016994374951
.0087,-.707785252292473
.009,-.587785252292478
.0092,-.459016994374947
.0095,-.309016994374954
.0097,-.159016994374954
.01,0

40 PUNTEN:

Het enigste wat ik nou lastig vind is dat het programma venstertje wat te klein is, mocht van mij 2x zo groot zijn, dan was de grafiek makkelijker met de muis in te stellen.
(jammer dat die italiaansekluppel alles in een pizza-code geschreven heeft)

Ik denk dat je kwa geluid weinig verschil tussen 20 of 40 punten gaat horen. (je kunt de punten ook zijdelings verplaatsen)
Ik betwijfel ook of het opgewekte signaal echt wel klopt. (de schaalverdeling zeker niet, want die staat op 0.01s, dat klopt duidelijk zeker niet)

Als je de sinus 'uitrekt' tot een blokgolf, komt er een totaal andere frequentie uit, wat niet klopt. (geluid zou alleen scherper moeten worden)

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Dat valt wel mee, ik heb even gekeken.
Zal waarschijnlijk komen omdat de opgaande en neergaande lijnen niet echt vertikaal zijn.
Je kan geen enkel punt precies onder elkaar zetten, wel op dezelfde hoogte.

Frequentie klopt ook wel, net gecheckt met SCOPE.EXE

OWWW nou zie ik het:

Uhm als je boven de 3KHz komt dan treed er vervorming op, ook al heb je de instelling voor je soundcard op 48KHz staan.

Gelukkig hoef ik niet boven de 100Hz te komen denk ik, dus dit zal wel werken voor mij.

-------------------

Trouwens voor de mensen die dit toch kunnen gebvruiken het volgende:
Ik had ook een post gemaakt op een engels forum en daar gaf iemand (jsvenu) mij een link om SigGen als een EXE te downloaden.
klik voor (WEBSITE)
klik voor (BESTAND)

Jammer dat het menu enzo nog nog steeds in de piza-taal geschreven is.

------------------------------

Kwa uitvoering merk ik geen verschil tussen het VB6 project en de SigGen.exe bestand.
Alleen dat alle buttons er zijn en dat alles naar behoren werkt.

Hier nog even een aangepaste sinus van 100Hz gemeten met SCOPE.EXE:

Sorry maar ik moet even een nieuw post maken.
Ik heb namelijk SigGen voor 99% vertaald naar engels.
(copyright blijft - is niks anders veranderd - Credits aanwezig)
Er zijn een paar underscores die moeten blijven anders verspringt de text.
En er zijn een aantal Pizza-woorden die ik in geen enkel bestand kan terug vinden. Raar maar waar.
De CAB-File is weer mooi samen gesteld en alles weer in een Zip-File gezet.

Alles is gedaan met een HEX-EDITOR die de SigGen.exe aanpast.

Ik zal Dhr Franco Languasco hierover een mail sturen.

Hier nog even een screenshot van het engels:

-----------------------------------------------------------------

EDIT: Ik heb contact met hem, en hij vind het heel leuk.
Ben bezig om het te verwezenlijken, maar dan in de project bestanden van VB6 zelf.