Einfacher Synth
Übersicht

SchoaschBetreff: Einfacher Synth |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hatte hectic oben schon verlinkt, trotzdem danke ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Vielleicht hilft das hier:
http://de.wikipedia.org/wiki/Ton_%28Musik%29 http://de.wikipedia.org/wiki/Computermusik |
||
Schoasch |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit 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. 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 ![]() ![]() |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
Schoasch |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() Zitat: Würde also einen Kreis zeichnen
Zeichnet bei mir aber irgendwie keinen ![]() mfg Georg |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() 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. ![]() |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
Schoasch |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke dir nochmal ![]() Habs jetzt glaub ich schonmal halbwegs kapiert, werd noch bisschen herumprobieren ![]() mfg Georg |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group