Einfacher Synth

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Schoasch

Betreff: Einfacher Synth

BeitragDi, Okt 06, 2009 17:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey,
ich möchte versuchen einen einfahen Synthesiser zu schreiben, ob Blitzbasic oder C++ is mir noch nicht ganz klar.
Aber bevor sich Leute aufregen sollten: Ich will keinen komplizierten Sampler schreiben sondern nur etwas besseres als diese standard Beep-Sounds von Windows machen (das Ganze ist nur ein Experiment).

Also das Problem liegt darin, dass ich in der Programmierung von sowas absolut keine Ahnung hab. Wie kann man die Wellen eines Tons verändern, ich werde wahrscheinlich eine dll brauchen oder? Kann man sich eine ganz einfache dll für sowas evtl selber schreiben?

Danke schon mal im Voraus,
mfg
Georg

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Okt 06, 2009 17:55
Antworten mit Zitat
Benutzer-Profile anzeigen
So eine Welle mußt du dir selber ''Zeichnen''. Das geht, indem du in eine Speicherbank die einzelne Bytes verändert, die du zuvor richtig berechnet hast.

Klick mich!
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

Schoasch

BeitragDi, Okt 06, 2009 22:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für deine Antwort =)
Also ich hab mir mal paar Wiki Seiten durchgelesen und verstehe schon einiges, aber manches ist mir noch nicht ganz klar z.B.:

Was versteht man unter Samples in einer Wav Datei (ist wohl nicht das gleiche als die Samples die man in einen Sampler lädt oder?)

Und was versteht man unter Frames? Hab das auch noch nicht ganz überrissen.

Und zu guter letzt.. Bei dieser Zeile wird ja anscheinend die Wellenform "gezeichnet":
Code: [AUSKLAPPEN]
Wert=Sin(2*Time*1.5^Sin(Time/25.0)*1.0000025^Time)*20000*0.99995^Time*Sin(Time/100.0)

Da versteh ich aber den ganzen Sinn irgendwie nicht.

Hoffe ihr könnt mir da noch bisschen weiterhelfen

mfg
Georg

DaysShadow

BeitragDi, Okt 06, 2009 22:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie wärs damit?

https://www.blitzforum.de/foru...hp?t=32151

Edit: Oh, nicht gesehen, sorry ^^

MfG DaysShadow
Blessed is the mind too small for doubt
  • Zuletzt bearbeitet von DaysShadow am Mi, Okt 07, 2009 9:09, insgesamt einmal bearbeitet
 

Schoasch

BeitragDi, Okt 06, 2009 22:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Hatte hectic oben schon verlinkt, trotzdem danke Wink

Hab mir zwar die Wikipediaseite hier durchgelesen http://de.wikipedia.org/wiki/RIFF_WAVE aber da hab ich halt die oben beschriebenen Verständnisprobleme..

mfg
Georg

mpmxyz

BeitragDi, Okt 06, 2009 22:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Schoasch,
ein Sample ist ein einzelner Abtastwert und ein Frame sind mehrere zusammengeschlossene Samples, welche zum selben Zeitpunkt "abgespielt" werden.
Die jeweiligen Samples eines Frames kann man einem Kanal zuordnen. (links/rechts oder Ähnliches)

Das ist ein ein bischen einfacherer Beispielcode als der, den du geschrieben hast:
Code: [AUSKLAPPEN]
;Mono
Wert=Sin(2*Time)*20000*0.9999^Time

Code: [AUSKLAPPEN]
Wert

Dieser Wert entspricht dem späteren "Ausschlag" des Lautsprechers.
Code: [AUSKLAPPEN]
Sin(...)...

Um daraus einen Ton zu bekommen, muss der Lautsprecher schwingen.
Daher bietet sich die Sinus-Funktion an, da sie einen gleichmäßig "schwingenden" Verlauf hat.
Code: [AUSKLAPPEN]
(2*...)...

Mit diesem Faktor kann man die Frequenz der Schwingung ändern. Je größer er ist, desto höher ist der Ton. Bei einigen Funktionen wird der Ton außerdem lauter.
Dieser Faktor muss übrigens nicht konstant sein! (wie bei deinem Problemcode)
Code: [AUSKLAPPEN]
...Time...

Es wird auch eine Variable der Zeit für die Berechnung gebraucht.
Bei einer Samplerate von 44100 Hz entspricht eine Einheit ca. 22,7 µs.
Code: [AUSKLAPPEN]
*20000*0.9999^Time

Dieser Teil bestimmt die Lautstärke des Tons. Je größer der Faktor ist, desto Lauter wird der Ton.
Der Sample-Wert muss aber in den gegebenen Grenzen bleiben!
Das "*0.9999^Time" sorgt übrigens dafür, dass der Ton langsam leiser wird.

Und wenn man ein bischen mit einigen Funktionen herumspielt, dann gibt es einige interessante Ergebnisse.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

Kruemelator

BeitragMi, Okt 07, 2009 16:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht hilft das hier:

http://de.wikipedia.org/wiki/Ton_%28Musik%29
http://de.wikipedia.org/wiki/Computermusik
 

Schoasch

BeitragMi, Okt 07, 2009 19:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für deine Antwort!
Zitat:
ein Sample ist ein einzelner Abtastwert und ein Frame sind mehrere zusammengeschlossene Samples, welche zum selben Zeitpunkt "abgespielt" werden.
Die jeweiligen Samples eines Frames kann man einem Kanal zuordnen. (links/rechts oder Ähnliches)

Also ist ein Sample doch ein Ton bzw so eine Schwingungskurve?

Zitat:
Daher bietet sich die Sinus-Funktion an, da sie einen gleichmäßig "schwingenden" Verlauf hat.

Das Problem ist nur, dass ich die Sinusfunktion nicht beherrsche und nach wiedermal vielen Wiki Seiten lesen (und Forum suche.. hab das tut zwar gefunden hat mich aber nd wirklich weitergebracht) bin ich immer noch verwirrt... Also ich hab mal versucht eine Sinuskurve zu programmieren:

Code: [AUSKLAPPEN]
Graphics 800,600,32,2
SetBuffer BackBuffer()

rgb = 255 * $10000 + 255 * $100 + 255
Repeat

   For x = 0 To 500
      y=300+Sin(x)*200
      WritePixel x,y,rgb
   Next

Flip
Until KeyHit(1)


Nur versteh ich nicht was X für einen einfluss auf Sinus hat, da die Kurve immer gleichmäßig ist obwohl sich X verändert.. Und was beeinflusst die Höhe der Kurve?
Und warum entsteht überhaupt so eine Welle und nicht z.B. ein Kreis?
Bei Wiki usw. steht immer nur "Sinus ist das Verhältnis der Gegenkathete und der Hypothenuse zu Alpha".. Alles klar aber was ist mit Verhältnis gemeint?
Vlt hat ja hier wer Zeit und Lust mir zu helfen..
Danke schon mal im Vorraus,
mfg
Georg

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Okt 07, 2009 19:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Mein früherer Mathelerher meinte ''Eine Sinuskurve ist die zweidimensionale Darstellung einer Kreisbewegung''. Und genau das ist es auch. Wenn du auf einen Plattenspieler etwas drauf legst, und es dir dann ganz flach von der Seite ansiehst, wird dieser Gegenstand genau der der Sinuskurve folgen. Eben in diesen Fall von links nach rechts und umgekehrt. Wobei eine neue Periode bei 360° aufhört und wieder bei 0° anfängt.

Code: [AUSKLAPPEN]
For x = 0 To 359 Step 1
    y=300+Sin(x)*200
    WritePixel x,y,rgb
Next


Würde also einen Kreis zeichnen, wobei der letzte Pixel nicht mehr auf der selben Stelle wie der erste gezeichnet wird, da 0° und 360° die selbe Position sind. Sin und Cos gegen also immer nur einen Wert zwischen -1 und +1 zurück. Damit kann man den Wert dann beliebig multiplizieren.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

Schoasch

BeitragMi, Okt 07, 2009 21:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für deine Hilfe!
Zitat:
Mein früherer Mathelerher meinte ''Eine Sinuskurve ist die zweidimensionale Darstellung einer Kreisbewegung''. Und genau das ist es auch. Wenn du auf einen Plattenspieler etwas drauf legst, und es dir dann ganz flach von der Seite ansiehst, wird dieser Gegenstand genau der der Sinuskurve folgen.

Versteh ich nicht ganz.. Muss mich aber auch dafür entschuldigen, ihr gebt euch schon so mühe und ich kapier das nicht Very Happy

Zitat:
Würde also einen Kreis zeichnen

Zeichnet bei mir aber irgendwie keinen Question

mfg
Georg

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Okt 07, 2009 21:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, ich hab vorhin zu voreilig gepostet.

Was der Aussage von meinem ehemaligem Mathelehrer angeht, so solltest du versuchen jedes Wort zu verstehen, als es einfach so durchzulesen. Was ist eine 2D-Darstellung? Ein Punkt, ein Strich, eine Fläche, ein Raum?

Was ist aber noch nicht geschrieben habe. Der Unterschied zwischen Sin und Cos ist dieser, das Cos um 90° verschoben ist. Ein Gegenstand auf den Plattendreher bewegt sich von links nach rechts und wieder zurück etc... Aber wenn man den Plattendreher nicht von Vorne X sondern von der Seite beobachtet Y, dann hat man eine zeitliche Verzögerung der Bewegung (links/rechts)... Um ein Kreis zu zeichnen welcher eine Fläche hat, benötigst du also einmal Sin und einmal Cos. Das entspräche das selbe, als würdest du den Gegenstand auf den Plattendreher von oben betrachten. Dann fährt dieser einen Kreis umrum. Wink

Code: [AUSKLAPPEN]
Graphics 400,400,0,2
SetBuffer FrontBuffer()

Local E,X,Y,R=160

For E=0 To 359
   X=200+Cos(E)*R
   Y=200+Sin(E)*R
   Plot X,Y
   Delay 20
Next

Print "Fertig!"

WaitKey


Kannst aber auch X=200+Sin(E+90)*R schreiben. Ist das selbe nur in Grün und blöder.

Aber mal so nebenbei bemerkt. Zumindest die Winkelfunktionen sollten schon ins Blut eingehen, bevor du ein Synthesizer anfängst zu programmieren. Ist ja keine einfache Sache dies. Wink
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

Schoasch

BeitragMi, Okt 07, 2009 22:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke dir nochmal Smile
Habs jetzt glaub ich schonmal halbwegs kapiert, werd noch bisschen herumprobieren Wink

mfg
Georg

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group