Hi
Ich versuche gerade einen Synthesizer für einen Tiny/Mega (je nach dem
wie groß der am Ende wird) zu programmieren. Um das zu testen hab ich
das erstmal am PC probiert. Bisher kann man bis zu 255 Kanäle nutzen.
Töne hab ich bisher noch nicht definiert. Man kann nur eine Frequenz
einstellen (44100 / x).
Problem ist nur die Lautstärke. Sobald die Lautstärken unterschiedlich
sind oder auch bei bestimmten einstellungen, hört man ein Knarren.
Der ganze Code ist im Anhang. Alleg44.dll braucht man um die Exe
auszuführen.
1
structTone
2
{
3
unsignedcharpwm;
4
unsignedcharmax;
5
unsignedcharvolume;
6
unsignedshortlen;
7
};
8
9
structStream
10
{
11
Tone*stream;
12
unsignedcharlen;
13
unsignedcharstreampos;
14
unsignedchartonepwmpos;
15
unsignedshorttonepos;
16
};
17
18
structPolyStream
19
{
20
Stream*stream;
21
unsignedcharlen;
22
unsignedcharloglen;
23
};
24
25
unsignedcharGetPWM(PolyStream*stream)
26
{
27
unsignedchari=stream->len-1;
28
unsignedshortpwm=0;
29
do
30
{
31
pwm+=GetTone(&(stream->stream[i]));
32
}
33
while(i--);
34
pwm>>stream->loglen;
35
return(unsignedchar)pwm;
36
}
37
38
unsignedcharGetTone(Stream*stream)
39
{
40
if(++stream->tonepos==stream->stream[stream->streampos].len)//Ton zu Ende?
Das ist der Synthesizer abschnitt. Hier müsste der Fehler sein, den ich
nicht finde.
Es ist doch nichts anderes als, Frequenzen erzeugen und Mittelwert
bilden?
Anmerkung zum Code: Ich habe extra unsigned char und ushort genutzt, da
ich das am Ende auf dem µC auch machen muss.
EDIT:
Ist gelöst. Es lag am schieben. Ich habe keine Zuweisung beim schieben
gemacht.
Läuft jetzt ganz gut. Obwohl es nur 8 bit sind hört es sich ganz gut an.
Hab noch einen Konverter geschrieben, so schlecht ist die Quali gar
nicht.
Ich würde noch gerne ein paar Drums dazumachen, aber wie soll ich das
anstellen? Ich hab ja gar keine Samples dafür. Lässt sich das vielleicht
auch "synthetisch" herstellen. Also mit irgendeiner besonderen
Schwingung?
Ein bessere Midi-Eingabemöglichkeit möchte ich noch programmieren, das
jetzige ist nur zum testen. Der Konverter soll am Ende nur ein Array
erstellen. Das wird wahrscheinlich auch das nächste was ich machen
werde, denn das Kompilieren dauert ewig.
Das einzige brauchbare Projekt zum Midi einlesen, das ich auf die
Schnelle fand war das hier:
http://www.codeproject.com/KB/audio-video/MIDIToolkit.aspx
Leider muss man da die Midi-Datei einmal abspielen um sie zu
konvertieren. Und da das ganze gar nicht dafür gadacht ist, muss man
Zeitmessungen machen um die Zeiten zu bekommen (sehr ineffizient). Wenn
jemand eine bessere Lib kennt, wäre mir sehr geholfen.
Eine Hörprobe hab ich mal hochgeladen. Immernoch diesselbe
Rechteckschwingung, diesmal aber mit Tönen und mit einer konvertierten
Midi-Datei.
Die Töne sind zum Teil schief, da die Steuerung nicht genau genug ist.
Da müsste man sich was einfallen lassen.
Eine Frage hätte ich dann noch:
Was heißt das : _mcleanup tos overflow
Das steht bei mir in der Console nach dem Beenden des Programms
Samuel K. schrieb:> Hier noch mein bescheidener Konverter.
Mit ein Haufen kleiner Bugs. Diese Version kann endlich ohne Probleme
konvertieren.
Leider erstellt der Konverter bei manchen Stücken >1000 Kanäle was total
unsinnig ist und deshalb nicht funktioniert.
Samuel K. schrieb:> Ich würde noch gerne ein paar Drums dazumachen, aber wie soll ich das> anstellen? Ich hab ja gar keine Samples dafür. Lässt sich das vielleicht> auch "synthetisch" herstellen. Also mit irgendeiner besonderen> Schwingung?
Z.B. weißes Rauschen als Ausgangsmaterial und dann ein (Tiefpass- etc.)
Filter drauf (subtraktive Synthese).
http://de.wikipedia.org/wiki/Subtraktive_Synthese
Sound on Sound ( http://www.soundonsound.com ) hatte mal eine Serie von
Artikeln über Synthese verschiedener Instrumente. Such da mal nach
"Synth Secrets", sind auch Drums und Percussion dabei.
Irgendwann wollte ich sowas auch noch mal umsetzen, aber man kommt ja zu
nichts...
Mirko
Danke für die Links. Ich muss mich da mal einlesen.
Das andere Eingabeformat hab ich jetzt programmiert.
Auszug aus meinem Konverter, der leider noch nicht richtig funktioniert:
1
* HEADER
2
* Anzahl Kanäle (1 - 255)
3
* Anzahl der Noten/Befehle von Kanal 1-x (1 - 65535)
4
*
5
* DATA
6
* Alle Noten/Befehls - Byte von Kanal 1-x
7
*
8
*
9
* Beispiel
10
* 2 Kanäle
11
* 3 Noten/Befehle im 1. Kanal
12
* 1 Noten/Befehle im 2. Kanal
13
* a 1. Note/Befehl des 1. Kanals
14
* b 2. Note/Befehl
15
* c 3. Note/Befehl
16
* d 1. Note/Befehl des 2. Kanals
17
*
18
* entspricht {2,3,1,a,b,c,d}
Mein Konverter baut gerade völligen Mist, deshalb sind im MidiTest nur
12 Töne aus Handarbeit. Gibt es eingentlich ein
Opensource-Midiconverter/Analyser?
Wie viel Kanäle haltet ihr auf einem Attiny für realistisch? Ich finde
das wird schon ein bisschen knapp: Mit einem Bauratenquarz mit 22.12Mhz
kommt man auf 22.12Mhz / 44100 = ~500 Takte
Da kann man den PWM-Channel 2 mal durchlaufenlassen. In 500 Takten muss
man dann das hier für alle Kanäle neuberechnet haben: