Arduino step sequencer

Trädvy Permalänk
Medlem
Registrerad
Mar 2012

Arduino step sequencer

Så jag har fått för mig att bygga en arduino step sequencer som denna
https://www.youtube.com/watch?v=lGAkuM0IOZ8

De flesta step sequencers på instructables m.m har som ett atari punk console ljud medan den här har ett annorlunda ljud samt två potentiometrar per step. Hur kan jag göra min step sequencer som denna om jag utgår från en guide från instructables t.ex denna

http://www.instructables.com/id/Arduino-Step-Sequencer/

Trädvy Permalänk
Medlem
Registrerad
Jan 2014
Skrivet av Haxxorcisten:

De flesta step sequencers på instructables m.m har som ett atari punk console ljud medan den här har ett annorlunda ljud samt två potentiometrar per step.

Den övre raden vred verkar inte vara kopplade till stegen under dem, utan styr globala parametrar som tempo, filterfrekvens och -resonans. Det mesta som går att göra med en 303 verkar finnas på plats.

Trädvy Permalänk
Medlem
Registrerad
Mar 2012
Skrivet av Hieronymus Bosch:

Den övre raden vred verkar inte vara kopplade till stegen under dem, utan styr globala parametrar som tempo, filterfrekvens och -resonans. Det mesta som går att göra med en 303 verkar finnas på plats.

Vad menar du med 303? Hur kan jag få ljudet från videon?

Trädvy Permalänk
Medlem
Registrerad
Jan 2014
Skrivet av Haxxorcisten:

Vad menar du med 303?

<sur gubbe>Ungarna av idag och deras allmänbildning...</sur gubbe>
Roland TB-303! En synt med inbyggd sextonstegs sequencer. Byggd för att låta som en elbas, men om man lastade på fullt med de få effekter den hade så lät den som ett gummiband spänt över en plastbytta eller en laserpistol. Och så föddes acid house.

Citat:

Hur kan jag få ljudet från videon?

Du behöver bygga en enkel subtraktiv synt. Den består av några olika delar, men utifrån vad jag hörde i videon verkar den bara bestå av:

  • En vågformsgenerator som på något sätt kan styras från Arduinon. Den ska vräka ur sig ett fett övertonsspektra, inte bara en ren sinusvåg. Det går att göra en hyggligt bra vågformsgenerator i mjukvara. Vågformsgeneratorn ska kunna generera frekvenser motsvarande de toner du vill kunna spela, samt övertoner.

  • Lågpassfilter med ställbar brytfrekvens. Lågpass = bara frekvenser under brytfrekvensen kommer ut ur filtret. Jag har ingen aning om hur man gör, men det ska även gå att få filtret att ha en resonans, som förstärker frekvenser just vid brytfrekvensen.

Trädvy Permalänk
Medlem
Registrerad
Mar 2012

[QUOTE=Hieronymus Bosch;15066645]<sur gubbe>Ungarna av idag och deras allmänbildning...</sur gubbe>
Roland TB-303! En synt med inbyggd sextonstegs sequencer. Byggd för att låta som en elbas, men om man lastade på fullt med de få effekter den hade så lät den som ett gummiband spänt över en plastbytta eller en laserpistol. Och så föddes acid house.

Du behöver bygga en enkel subtraktiv synt. Den består av några olika delar, men utifrån vad jag hörde i videon verkar den bara bestå av:

  • En vågformsgenerator som på något sätt kan styras från Arduinon. Den ska vräka ur sig ett fett övertonsspektra, inte bara en ren sinusvåg. Det går att göra en hyggligt bra vågformsgenerator i mjukvara. Vågformsgeneratorn ska kunna generera frekvenser motsvarande de toner du vill kunna spela, samt övertoner.

  • Lågpassfilter med ställbar brytfrekvens. Lågpass = bara frekvenser under brytfrekvensen kommer ut ur filtret. Jag har ingen aning om hur man gör, men det ska även gå att få filtret att ha en resonans, som förstärker frekvenser just vid brytfrekvensen.

[/QUOTE]
Ok jag inser nu att detta är för komplicerat för mig

Trädvy Permalänk
Medlem
Registrerad
Jan 2014
Skrivet av Haxxorcisten:

Ok jag inser nu att detta är för komplicerat för mig

Cheer up, det här går att fixa i mjukvara.
Jag hittade den här vågformsgeneratorn som är byggd på ett sätt som vi kan missbruka: Den beskriver vågformer med hjälp av tabeller som beräknas i förväg. De tabeller som ingår i exemplet är

  • Ren sinus

  • Ren triangel

  • Ren sågtand

  • Ren fyrkantvåg

Kolla till exempel på tabellen för fyrkantvåg:

{ 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }

Först kommer det hexadecimala värdet 0xfff (som motsvarar 4095 i vårt gamla tråkiga decimala talsystem) sextio gånger, sedan kommer värdet 0x0 (som motsvarar 0. Förstås.) lika många gånger.
Programmet jag länkade till skickar ut värdena i tabellen i tur och ordning till en ADC, som omvandlar värdet till en spänning. Full spruta (4095) motsvarar +5V, värdet noll motsvarar noll volt. Arduinon kan reglera vilken ton som spelas genom att göra olika långa uppehåll mellan varje värde som skickas till ADCn. Om uppehållet mellan värden är 19 mikrosekunder (19 miljondels sekunder) så kommer det att ta 19*120=2280 mikrosekunder att harva igenom tabellen. På en sekund kommer den att hinna spela upp vågformen 1000000/2280 gånger, vilket blir ca 438 Hz. Som motsvarar tonen A.
Fyrkantvåg är bra, den innehåller en massa övertoner. Tyvärr lite för många udda övertoner, vilket ger ett argt men inte fett ljud.
Om vi skulle lägga till en jämn överton, säg, 1 oktav ovanför grundtonen skulle det nog låta ballare.
En höjning med en oktav motsvarar en fördubbling av frekvensen. En tabell enligt ovan med dubbelt så hög frekvens skulle alltså se ut så här:

{ 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }

See? Den ursprungliga vågformen var först hög, sedan låg. Den nya vågformen växlar dubbelt så snabbt mellan hög och låg.

Återstår bara att blanda vågformerna innan vi stoppar in dem i Arduinon. Arduinon kan bara spela upp en vågform i taget.
Jag kan tänka mig att vågformerna egentligen inte ska blandas 50%/50% för att låta allra bäst, men det blir enkelt att räkna då. Så vi tar helt enkelt medelvärdet av de bägge vågformerna för varje plats i tabellen.
De tre första raderna är lätta - i bägge vågformerna är värdet 0xfff, så medelvärdet blir ...0xfff!
De tre följande raderna är 0xfff i originaltabellen, men 0x0 i övertonstabellen. Medelvärdet blir (0xfff + 0x0)/2 = 0x7ff
Nästa grupp om tre rader är bakochfram, jämfört med förra gruppen: 0x0 i originalet, 0xfff i övertonen. Samma slutresultat, dock: 0x7ff.
Sista treradersgruppen är 0x0 i bägge vågformerna. 0x0.
Så:

{ 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }

Så. Sitt nu uppe halva natten och hitta på blandningar av vågformer och övertoner tills det låter tufft.

Jag missade att förklara hur fördröjningen mellan samples påverkade frekvensen.
Trädvy Permalänk
Medlem
Registrerad
Mar 2012

[QUOTE=Hieronymus Bosch;15067047]Cheer up, det här går att fixa i mjukvara.
Jag hittade den här vågformsgeneratorn som är byggd på ett sätt som vi kan missbruka: Den beskriver vågformer med hjälp av tabeller som beräknas i förväg. De tabeller som ingår i exemplet är

  • Ren sinus

  • Ren triangel

  • Ren sågtand

  • Ren fyrkantvåg

Kolla till exempel på tabellen för fyrkantvåg:

{ 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }

Först kommer det hexadecimala värdet 0xfff (som motsvarar 4095 i vårt gamla tråkiga decimala talsystem) sextio gånger, sedan kommer värdet 0x0 (som motsvarar 0. Förstås.) lika många gånger.
Programmet jag länkade till skickar ut värdena i tabellen i tur och ordning till en ADC, som omvandlar värdet till en spänning. Full spruta (4095) motsvarar +5V, värdet noll motsvarar noll volt. Arduinon kan reglera vilken ton som spelas genom att göra olika långa uppehåll mellan varje värde som skickas till ADCn. Om uppehållet mellan värden är 19 mikrosekunder (19 miljondels sekunder) så kommer det att ta 19*120=2280 mikrosekunder att harva igenom tabellen. På en sekund kommer den att hinna spela upp vågformen 1000000/2280 gånger, vilket blir ca 438 Hz. Som motsvarar tonen A.
Fyrkantvåg är bra, den innehåller en massa övertoner. Tyvärr lite för många udda övertoner, vilket ger ett argt men inte fett ljud.
Om vi skulle lägga till en jämn överton, säg, 1 oktav ovanför grundtonen skulle det nog låta ballare.
En höjning med en oktav motsvarar en fördubbling av frekvensen. En tabell enligt ovan med dubbelt så hög frekvens skulle alltså se ut så här:

{ 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }

See? Den ursprungliga vågformen var först hög, sedan låg. Den nya vågformen växlar dubbelt så snabbt mellan hög och låg.

Återstår bara att blanda vågformerna innan vi stoppar in dem i Arduinon. Arduinon kan bara spela upp en vågform i taget.
Jag kan tänka mig att vågformerna egentligen inte ska blandas 50%/50% för att låta allra bäst, men det blir enkelt att räkna då. Så vi tar helt enkelt medelvärdet av de bägge vågformerna för varje plats i tabellen.
De tre första raderna är lätta - i bägge vågformerna är värdet 0xfff, så medelvärdet blir ...0xfff!
De tre följande raderna är 0xfff i originaltabellen, men 0x0 i övertonstabellen. Medelvärdet blir (0xfff + 0x0)/2 = 0x7ff
Nästa grupp om tre rader är bakochfram, jämfört med förra gruppen: 0x0 i originalet, 0xfff i övertonen. Samma slutresultat, dock: 0x7ff.
Sista treradersgruppen är 0x0 i bägge vågformerna. 0x0.
Så:

{ 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x7ff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }

Så. Sitt nu uppe halva natten och hitta på blandningar av vågformer och övertoner tills det låter tufft.[/QUOTE]

Wow tack så mycket för din detaljerade förklaring, men jag tror fortfarande att detta är utom min räckvidd