Synth(MIDI)-styrda ljuseffekter, påbörjat projekt, uppskattar feedback

Spelar bassynth (Minimoog Voyager) i ett Kraftwerk-liknande band och tänkte att vi ska använda oss av mindre ljusseffekter för att ge de låtarna lite olika karaktär. Till en början har jag tänkt att göra två saker, en platta med vita lysdioder som blinkar när jag trycker ner en tangent och en platta med röda lysdioder som tänds i rader som en våg när en tangent trycks ner. PLattorna ska sen dubbleras och därefter vill förhoppningsvis de andra i bandet ha liknande grejer. Har lött de båda plattorna och lärt mig programmera Arduinon så att enstaka lysdioder tänds i en våg.

Vita plattan

Röda plattan

Nu är det dags att få plattorna att tändas med min synth. Har köpt en MIDI Shield från Electrokit och ska nu försöka förstå hur det fungerar med MIDI Library. Det senare har jag svårt att förstå hur det funkar. Men jag har laddat hem det och ser att det finns en liten tutorial, så ikväll blir det att testa sig fram lite.

Varsågod: Upskattande feedback. :slight_smile: :smiley: XD

Plattorna är fina. Jag är mera mjukvara expert, så utan kod ingen rigtig feedback.

Tack!

Kod på väg.

Här är koden. Har tänkt att hitta ett sätt att få sekvensen att löpa bara en gång, alltså en "våg" och att den börjar om ifall jag trycker ner en tangent innan den löpt färdigt. Men först vill jag bara få den att triggas.

int switchState=0;
void setup(){
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(2,INPUT);
}
void loop(){
switchState = digitalRead(2);
if(switchState==HIGH) { // the button is pressed
digitalWrite(3, HIGH); //red LED
digitalWrite(4, LOW); //red LED
digitalWrite(5, LOW); //red LED
digitalWrite(6, LOW); //red LED
digitalWrite(7, LOW); //red LED

delay(50); //  wait for a quarter second

digitalWrite(3, HIGH); //red LED
digitalWrite(4, HIGH); //red LED
digitalWrite(5, LOW); //red LED
digitalWrite(6, LOW); //red LED
digitalWrite(7, LOW); //red LED

delay(50); //  wait for a quarter second

digitalWrite(3, HIGH); //red LED
digitalWrite(4, HIGH); //red LED
digitalWrite(5, HIGH); //red LED
digitalWrite(6, LOW); //red LED
digitalWrite(7, LOW); //red LED

delay(50); //  wait for a quarter second

digitalWrite(3, LOW); //red LED
digitalWrite(4, HIGH); //red LED
digitalWrite(5, HIGH); //red LED
digitalWrite(6, HIGH); //red LED
digitalWrite(7, LOW); //red LED

delay(50); //  wait for a quarter second

digitalWrite(3, LOW); //red LED
digitalWrite(4, LOW); //red LED
digitalWrite(5, HIGH); //red LED
digitalWrite(6, HIGH); //red LED
digitalWrite(7, HIGH); //red LED

delay(50); //  wait for a quarter second

digitalWrite(3, LOW); //red LED
digitalWrite(4, LOW); //red LED
digitalWrite(5, LOW); //red LED
digitalWrite(6, HIGH); //red LED
digitalWrite(7, HIGH); //red LED

delay(50); //  wait for a quarter second

digitalWrite(3, LOW); //red LED
digitalWrite(4, LOW); //red LED
digitalWrite(5, LOW); //red LED
digitalWrite(6, LOW); //red LED
digitalWrite(7, HIGH); //red LED

delay(50); //  wait for a quarter second

digitalWrite(3, LOW); //red LED
digitalWrite(4, LOW); //red LED
digitalWrite(5, LOW); //red LED
digitalWrite(6, LOW); //red LED
digitalWrite(7, LOW); //red LED

delay(50); //  wait for a quarter second
}
else {  // the button is not pressed
digitalWrite(3, LOW); //red LED
digitalWrite(4, LOW); //red LED
digitalWrite(5, LOW); //red LED
digitalWrite(6, LOW); //red LED
digitalWrite(7, LOW); //red LED
}
} // go back to the beginning of the loop

Det där med at "börja" om något er trykt skal kodas sådan

void loop() {
if ( digitalRead(Button)==HIGH && ButtonStart == LOW  )
  ButtonStart == HIGH ;
if ( ButtonStart == HIGH ) {
  //Våg kode 
 // Når vågen er slut  
  ButtonStart == LOW ;
  }
}

Det gör at vågen bara startar när knappen går från LOW til HIGH. Inte om du holder den ned eller släpper den tidligt eller nåt.

Och så gör dig den vana at korrigere dine kommentar när du ändrar kod - delay(50) är inte en kvart sekund.

Tack!

Sir, yes sir! :astonished:

Hum, kul projekt! Verkar enklare att bygga om tex LED-belysning för hela hemmet - IKEA eller 1M 30 Pixels WS2812B RGB band. Lite mer programmering men det är ju den roliga delen.

Skulle rekommendera att göra en tabelldriven lösning. Kanske till och med en interpretator för ett byte-orienterat språk. Då skulle man kunna skicka LED styrprogram över MIDI.

Tycker om att bygga saker från noll så mig gör det inget. Då blir det precis som jag vill ha det, även om det inte alltid blir så snyggt. Men jagnjuter mer av att ha gjort det helt själv.

Hmm. Tabelldriven. Det får jag nog vänta med iom att jag inte har en susning om vad det ordet betyder. Vad blir skillnaden?

"Tabeldreven" Tja, ja ... Som jag forstår din kunnskab, Martinblom, så kan det förslag vara långt frem i tiden. Men det kan också bare att nyt ord for "Array".

Arrays er som hus på vägen. istället for at skriva "fjärde-hus-på-vägen" så skriver du Väg[4]. Det vil inte spara något på dit program i sin nuvarende form, men det blir det senere. Lår oss åka lite frem i tid :slight_smile:

byte Led[6] = { 2,3,4,5,6,7 }   // Kommentar 1
void setup() {
  for (int i=0; i<6; i++) { pinMode(Led[i],OUTPUT) ; } // kommentar 2
 .... og annat setup  }
void loop() {
   ....knap kode osv
  for ( int i=0; i<8; i++) {  // kommentar 3
    if ( i<=5 ) digitalWrite(Led[i]HIGH) ; // kommentar 4
    if ( i>=0 ) digitalWrite(Led[L],LOW) ;  // ... 5
  delay(50) ;   // Måsta slänga delay bort ... en anden Post varför och vad som kommer istället en andan gång
  } // slut på for-loop
 ..annan kode 
}

Kommentar 1: Har reserver vi plads til 6 Led pin placeringar. Den första hetter Led[0], anden Led[1] och sista Led[5]. Om du nu har bytet runt på ledningerna 4 & 5 ved lödningen, så kan du här skriva { 2,3,5,4,6,7 } - och resten af programmet behöver inte veta om ändringen! Det är det smarta.

Kommentar 2: "for ( ... )" kan du slå upp. Det gör at variablen i går från-och-med 0 til-och-med 5 (mindre än 6). För varje [b]i[/b] anropas pinMode med [nobbc]Led[i][/nobbc], dvs först med Led[0] (som jo har värden 2, dvs pin2 sätts til output). Nästa omgång er det Led[1] på tur och den sätter så pin 3, og tredje gång klarar den der feltrådning med at Led[2] sätter pin 5 ... I övrigt - just i dette tilfälle behövs{ }inte, men tydligere att skriva dom.

Kommentar 3: Här går i från 0 til 7 inklusiv. Man kunne också skriva for ( int i = 0; i <=7 ; i++ ) för att göra det tydligt at vi slutar med 7, men det är en vana som C-programmer har at det oftast skriver "< högsta+1". Det passede jo fint med at Led-arrayet på storlek 6 slutade på [5] på kommentar 1.

Kommentar 4: Om du använder digitalWrite(Led[nobbc][i][/nobbc],HIGH) och [b]i [/b]är mera än 5 så är du utanför området af Led och det är dårligt. Så det gör vi inte. Annars så tänder vi en LED åt gången for dom första 5 omgånger med [b]i[/b].

Kommentar 5: Samma problem , om [b]i[/b] bara är 1 så är i-2 lika med -1 och det går inte i Led. Eftersom [b]i [/b]slutar på 7 så är i-2 like med 5 som högsta. Här släcker vi en LED åt gången for dom sista 5 omgångarna af [b]i[/b].

Det skulle gärna göra at vågen med LED kör. Du kan jo skriva ned alla värden för [b]i[/b] og vilka LED tänns och släcks. Och så vet at ändra på i-loopens start/slut, og om du har i-1 eller i-3 så ändrar du vågens tjocklek. Med lite fantasi kan du gøra snyggare mönster.

P.S: Mit skrevna svensk er USSELT och felfyld. Jag vet det. Kan du läsa danska?

Ok. Förstår nog mer om ett tag när jag arbetat mer med Arduino. Tyvärr kan jag inte läsa andra skandinaviska språk än svenska. Jag tror jag förstår dig trots din "usla" svenska.

Har tänkt koppla på en MIDI Shield nu, men förstår inte hur. Har ju såna där pins som sitter i rader och går genom Shielden. Men ska de inte sitta fast i Shieldens hål? Förstår inte alls hur den ska kopplas. Har googlat liteen blir ite något klokare.

Edit: Aha! Kan det vara så att jag ska löda fast vissa pins som MIDI Shielden använder och så är övriga fria att koppla till annat?

Två frågor till då:

  1. Inser att jag kommer behöva fler utgångar än vad som är tillgängligt via MIDI Shielden (den röda plattan behöver ju 10 utgångar), har fått tips om nåt jag tror han kallade breakout board. Kan det vara en idé? Var beställer jag iofs det då? Kollade hos Electrokit, som jag köpte MIDI Shielden hos (snabbt och smidigt) men hittade ingen breakout board som jag tydligt kan se passar Arduino.

  2. Går det att koppla pins till mina ljusplattor provisoriskt eller måste de lödas fast?

Kanske är en sån här en bra ide? Så får jag MIDI i/o/thru och en massa utgångar. Allt i ett!

Light circuit and basic Arduino programming done! Now I just have to figure out how to use the MIDI Shield.

martinblom:
Edit: Aha! Kan det vara så att jag ska löda fast vissa pins som MIDI Shielden använder och så är övriga fria att koppla till annat?
:

  1. Inser att jag kommer behöva fler utgångar än vad som är tillgängligt via MIDI Shielden (den röda plattan behöver ju 10 utgångar), 2)Går det att koppla pins till mina ljusplattor provisoriskt eller måste de lödas fast?
    Kanske är en sån här en bra ide? SparkFun MIDI Breakout - BOB-09598 - SparkFun Electronics

Shielden anvænder bara pin 0 og 1. Da dom också anvænds af Seriel porten ha dom sat en switch på: "Prog". I "Prog" stället ¨r shielden fråkobblat så du kan använda den Seriel porten - typisk for at programmere et nyt program. I det annat läge är det Midin der gäller. Du bör nog kobbla den från USB'en når du spelar.

På den ene sidan står D2 til D13 og A0 til A5 - alle dom kan du använda - det är direkt koppling til samme pins som på Arduinoen,. Jag föreslår du köper dig en Pinheader - altså en rad stifter, så kan du anvæde female-jumper-wire för tilslutningen. Jag tycker det er en rigtig bra shield til dit syfte.

Aha, nu börjar jag förstå.

Ok, så jag kan behålla den jag har? Alltså:

Och så löder jag alltså fast pins på RX och TX medan de andra pins går rakt igenom. Och så köper jag female-kopplingar till dessa att löda fast på mina 10 sladdar. Har jag förstått rätt då?

Nej, du skal inte lödda nåt på Rx/Tx ... den där kit saknar nåt i stil med http://www.let-elektronik.dk/komponent-kit/pinheader/arduino-stackable-header-kit-1.html - du hittar säkert samma på Elektrokit. Dom sätts på så pinnarne stikker igennom - så sätter man bare Midi shielden ovan på Arduinoen.

Du skal titta på den Schematic som elektrokit har http://www.electrokit.com/productFile/download/2055 här kan du se at på DEN shield så er flere pins forbundet. Men om du inte trycker på kanpparna (eller inte sätter dem på kortet) så är det bara 6 og 7 som används af LED. Du kan jo använda A0 til A5 som vanliga digital pinnar så du har nog. Här kommer det trick med tabellen i förra mail til nytta, der kan stå Led[] = { 2, 3, 8, 9, A2 } f.eks. som dina fem LED trådar (eller 10 som du vil ha)

Sådär. Kopplingarna funkar, även "via" MIDI Shielden. Nu återstår programmering och MIDI-styrning.

Snyggt. Dom två LED kolonnerne i mitten ljuser inte - medvilja eller en programmerings fel ?

Då MIDI Shielden har push buttons kopplade t D2-D4 så använder jag mig av D5-D13, men det är ju bara nio pins. Så jag får använda en analog pin för rad tio. Och det har jag inte testat att programmera än.

Det gör du bara som dom andra -

pinMode(A0,OUTPUT) ;
   :
digitalWrite(A0,HIGH);

A0 bliver hemligt sat til 14. Dvs den 14 digital pin är den första analog pin. (Tallet A0 ändrar sig för dom olika Arduinotyparna)

Du kan också använd dina namn som förr -

#define leftpin A0
#define midpin 5 
 osv  - eller
const int leftpin = A0 ;
const int midpin = 5 ;

Om du tittar på schematic af shielden så ser du at när knappen inte är tryckt, så är ingenting kopplat til pinen - dvs du kan använda den. Men det är säkrast at låta bli, som du gjör.

Tack!