Sida 1 av 1

Generera olika frekvenser (MIDI-synth)

Postat: 7 september 2010, 05:07:02
av E85
Jag laborerar lite med att bygga en MIDI-synthesizer baserad på en STM32-krets (ARM Cortex-M3).

Säg att jag har en lookuptabell för sinusvåg med 32 värden. En ton är ju inga problem att spela då mha en timer som ställs in för att uppdatera DAC:en med rätt frekvens. Det har jag redan provat och det funkar fint. Men nu vill jag spela flera toner samtidigt och det är ju lite klurigare... nån som vet hur man brukar göra?

Re: Generera olika frekvenser (MIDI-synth)

Postat: 7 september 2010, 09:59:13
av Andax
Ofta brukar man uppdatera DAC med en fast frekvens, säg 44100 Hz eller så, och summera ihop samples från flera källor.
Källorna kan vara lookuptabeller som man stegar sig igenom olika snabbt beroende på vilken frekvens man vill få ut.
Titta lite på DDS...

Re: Generera olika frekvenser (MIDI-synth)

Postat: 7 september 2010, 10:08:53
av psynoise
Många syntar har endast sågtand och puls och där kanske man kan göra en algoritm utan tabell. Ytterligare brukar man kunna generera sinusvåg på många VA-syntar genom att dämpa alla övertoner hos en annan vågform via ett soft-filter (har många olika namn).

Re: Generera olika frekvenser (MIDI-synth)

Postat: 7 september 2010, 10:21:02
av jesse
Förr i tiden (i början av 80-talet) brukade jag generera en "falsk" sinusvåg (med Z80-processor) genom att integrera ett värde som jag räknar upp och ner (dvs en integrerad triangelvåg). Jag vet inte hur mycket det skiljer sig från riktig sinus, men det ser i alla fall bra ut. För att få flera toner samtidigt så kan man nog göra som Andax säger att man helt enkelt summerar värdena från flera sådana sinusgeneratorer.

Re: Generera olika frekvenser (MIDI-synth)

Postat: 7 september 2010, 13:47:17
av E85
Det där med fast uppdateringsfrekvens på DAC:en ska jag ordna. Men jag är mest ute efter just hur och var man ska räkna ut vilket värde ur lookuptabellen som ska spelas beroende på ton-frekvensen om ni förstår hur jag menar.
Har lite svårt att förklara eftersom jag inte har några idéer.
Om vi tar C7 som exempel, den är på 2093Hz. Uppdaterar jag med 44.1KHz och har 32 värden/period så säger det sig självt att jag inte hinner spela alla. Nånting måste till för att räkna ut vilka värden som ska skickas till DAC:en för att få precis rätt frekvens (och hinna göra det för att spela t.ex 8 toner samtidigt).

Re: Generera olika frekvenser (MIDI-synth)

Postat: 7 september 2010, 17:17:44
av Andax
T.ex kan man ha en 16-bitars räknare och använda de 5 översta bitarna (ger 32 positioner) för att peka ut vilken sample i lookuptabellen man ska använda.
Sen lägger man på ett värde värde varje gång man ska ha en ny sample som beror på vilken ton man ska spela.
I ditt fall med 2093Hz så lägger man på round(65536*2309/44100) = 3431 på räknaren vid varje sampletillfälle (dvs 44100 ggr per sekund). Det blir inte exakt 2093 Hz eftersom man fick avrunda till närmsta heltal. Upplösningen blir 44100/65536 Hz (0.67 Hz) vilket säkert duger för det mesta. Vill man ha högre upplösning kan man köra med en 24- eller 32-bitars räknare. Byt ut 65536 = 2^16 mot 2^24 alt 2^32 istället.

Re: Generera olika frekvenser (MIDI-synth)

Postat: 7 september 2010, 17:27:55
av E85
Aha, det var ju riktigt smart det. Ska prova och se vad jag kan få till. :tumupp:

Re: Generera olika frekvenser (MIDI-synth)

Postat: 7 september 2010, 18:41:02
av chille
Nu har jag inte orkat kolla upp hur snabb din processor är, men om du kan multiplicera tal snabbt kan du ju även använda denna algoritm, jag tror för övrigt det är den här algoritmen som jesse syftar på.

length = samplerate / frequence;
tmp = 2*M_PI / length;

cos -= sin * tmp;
sin += cos * tmp;

Det första stycket kör du när du ska ändra frekvens till oscillatorn, det andra stycket körs en gång för varje sample. Det är med andra ord två multiplikationer, en subtraktion och en addition för att beräkna en ny sample. Jämför detta med hur många instruktioner det går åt för att hämta data ur din lookup-table, och eventuellt interpolera.

Re: Generera olika frekvenser (MIDI-synth)

Postat: 7 september 2010, 18:43:42
av E85
Den körs i 72MHz och har hårdvarumultiplicering. Ska fundera på hur det där funkar om jag inte lyckas få igång det här som Andax sa... :)

Re: Generera olika frekvenser (MIDI-synth)

Postat: 13 september 2010, 15:30:26
av jesse
Min "formel" var enbart addition och addition igen.

tror det var nåt i stil med:
// start
a = 1; // increment

// loop
b+=a; // öka b
c+=b; // öka c
// c = utdata...

// byt riktning...
a = -a; // med lagom intervall...

problemet med den är väl att amplituden blir frekvensberoende och att det inte blir precis sinus.

Re: Generera olika frekvenser (MIDI-synth)

Postat: 13 september 2010, 17:53:23
av E85
> problemet med den är väl att amplituden blir frekvensberoende och att det inte blir precis sinus.

Ja det är ju inte så jättebra...
Och jag vill kunna byta till vilken vågform som helst så det funkade klockrent med lookuptabell och Andax tips. Ska ta och inhandla ett Rigol-skop tror jag så blir det lättare att se också.