Buggfix Plus
Aktuellt datum och tid: 09.34 2019-09-19

Alla tidsangivelser är UTC + 1 timme




Svara på tråd  [ 11 inlägg ] 
Författare Meddelande
 Inläggsrubrik: Självspelande piano
InläggPostat: 21.33 2019-07-17 

Blev medlem: 22.16 2005-12-28
Inlägg: 58
Ort: Södertälje
Ett självspelande piano? Vem har inte drömt om det? Speciellt när man är totalt okunnig inom musikens värld och kan inte ens spela blinka lilla stjärna.
Denna historia började på väg mot fjällen omkring 10 år sedan, impulsen tog över och vi gjorde en avstickare för att kolla på just ett självspelande piano hos en reparatör och försäljare av piano. Sagt och gjort och jag slog till… dumt beslut. Någon vecka senare med släp bärgade vi hem det nätta lilla pianot. Sen dess har det varit med om två flyttar, och rundflyttning i det nuvarande boendet(med pallvagn). Under alla år har jag öppnat det, tittat, studerat och funderat, det hade ju varit fantasiskt om det fungerade.
Tyvärr så hotade min sambo med att jag var tvungen att göra mig av med det i våras ”Det funkar ju ändå inte”. Så nu eller aldrig.

Pianot:
eller Pianola är ett självspelande piano troligen från början av 1900-talet. Det är till grunden ett vanligt piano med 88 tangenter och sedan försett med ett ”spelverk” som består av en rullmekanism för den perforerade pappersremsan som innehåller melodin. Den sveper förbi ett ”munspel”, pianot jobbar med vakuum och när det är en perforering i pappersrullen så suger den luft igenom pappret och tangenten slår.
Mängder av info om detta finns på nätet såklart.
https://sv.wikipedia.org/wiki/Pianola

Kondition:
Enligt försäljaren så var samtliga slangar torkade och läckte, ni kanske vet att när önskan är större än förståndet så tar man rationella beslut.
Under våren så tog jag tag i projektet rejält och började med att se om jag kunde få upp ett tryck i pianots vakuum del, med en dammsugare. Timmar och fler timmar utan resultat, jag tyckte hela tiden att jag hittade läckande kopplingar och slangar reparerade och lagade. Men när jag till slut insåg hur dåligt skicket var, att samtliga bälgar hade torkat och separerat så såg jag bilden framför mig hur det till slut med en dåligt skriven annons på blocket.
I samband med att jag försökte få igång original mekanismen så insåg jag till min besvikelse att man i mitt piano gjort två olika sätt att slå hammaren på strängarna.
1. Tangenterna/manuellt spelande
2. Via spelmekanismen, när denna används så åker inte tangenten ner så som man tänker sig att det skall göra.
Jag bestämde mig för att lyfta ur hela spelenheten och göra något annat. Jag är imponerad över hur man förr kunde konstruera saker, långt ifrån vår digitala värd. Något som jag också försöker illustrera igenom bilderna nedan.

Mål:
Att få full funktion på pianot. Trots att det finns ”nyinspelade” papp-rullar så är målet att kunna styra pianot från en musikspelare i exempelvis telefonen eller pekplattan. Efter lite forskning hur detta skall gå till så är såklart lösningen MIDI-filer. Det finns gott om spelare och oändligt med melodier/sånger. Jag riktar in mig på kunna överföra dessa via Bluetooth, för att sedan få elektromagneter att slå tangenterna. Och på så viss skapa ett ”nytt” spelverk. Viktigt för mig är att tangenterna skall åka ner, så att man ser att ”någon” spelar.

inspiration:
Jag är ju såklart inte ensam om den här idéen. Nedan länkar finns lite inspiration
https://www.youtube.com/channel/UCqdzAvYNICGNuqR2TWvCN4w
https://create.arduino.cc/projecthub/MoKo/arduino-controlled-piano-robot-pibot-641a06
https://medium.com/@hackmancoltaire/adventures-in-piano-building-c3fe5fa0b56b

Teknik(kan såklart förändras)
• Arduino mega 2560
• Arduino MIDI shield
• MIDI Bluetooth adapter.
• 24V elektromagneter x 88 st
• 74595 shift register


Logga in för att visa de filer som bifogats till detta inlägg.


Upp
 Profil  
 
 Inläggsrubrik: Re: Självspelande piano
InläggPostat: 21.37 2019-07-17 
Användarvisningsbild

Blev medlem: 18.09 2011-07-01
Inlägg: 9078
Ort: Helsingborg
Riktigt bra projekt för att visa att det var bättre förr!
Och kan bli ännu bättre framöver!
Så klart att du skall ha igång detta på ett modern sätt!
Skall bli kul att följa.


Upp
 Profil  
 
 Inläggsrubrik: Re: Självspelande piano
InläggPostat: 21.38 2019-07-17 
Användarvisningsbild

Blev medlem: 18.04 2009-08-16
Inlägg: 10829
Kul projekt.
Varför inte använda servo i stället för elektromagneter?
Vill du inte ha möjligheten att ha variation i anslagen?


Upp
 Profil  
 
 Inläggsrubrik: Re: Självspelande piano
InläggPostat: 22.15 2019-07-17 

Blev medlem: 22.16 2005-12-28
Inlägg: 58
Ort: Södertälje
Jag har problem...

Jag har såklart redan tjuvstartat lite.
Och har införskaffat en USB-MIDI omvandlare, en MIDI Shield och letat fram ett par 595 shift register. Än så länge har jag bara kopplat upp 32 toner, men det får en uppfattning om funktionen.
Det tog ett par timmar att få igång MIDI överföringen. I exemplen som sparkfun har på sin hemsida så använder de software serial port, jag fick aldrig igång detta. Så jag lödde om stiften till Serial1 på Mega kortet för att få en hårdvaruport och vips så fungerade det på en gång.
Signalerna överför jag från antingen via Synthesia eller via Midi player 5.7. Via Midi player så finns ett väldigt bra verktyg där man ser alla events så som Note On/off.
Det blinkar på fint men... Jag förlorar vissa signaler. Det gör att den inte släcker vissa dioder/noter. Jag missar säkert någon ON-event också, men dessa är svårare att urskilja eftersom det blir väldigt tydligt när dioderna fortfarande lyser. Jag har provat olika varianter på detta, och står och stampar lite. Kanske är det någon som har någon hypotes eller förslag på vad det är som gör att jag lyckas snappa upp alla signaler? Kan det vara så att funktionen för att skicka ut signalerna till shift registerna blockerar? Vad jag lyckats läsa mig till så har biblioteket för MIDI som jag använder(https://github.com/FortySevenEffects/arduino_midi_library/) en kö/buffert?
Många frågor och lite kod nedan:
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
#include <MIDI.h>

int latchPin = 47;
int clockPin = 45;
int dataPin = 49;

int numOfRegisters = 4;
byte* registerState;

struct MySettings : public midi::DefaultSettings
{
    static const bool UseRunningStatus = true;
    static const bool HandleNullVelocityNoteOnAsNoteOff = true;
    static const bool Use1ByteParsing = true;
    static const long BaudRate = 31250;
    static const unsigned SysExMaxSize = 128;
};
MIDI_CREATE_CUSTOM_INSTANCE(HardwareSerial, Serial1, MIDI, MySettings);

void setup() {
  MIDI.setHandleNoteOn(noteOn);
  MIDI.setHandleNoteOff(noteOff);
  MIDI.setHandleControlChange(handleControlChange);
  MIDI.begin(MIDI_CHANNEL_OMNI);

  Serial.begin(115200);
  Serial.println("Setting up");

  registerState = new byte[numOfRegisters];
  for (size_t i = 0; i < numOfRegisters; i++) {
    registerState[i] = 0;
  }
 
  pinMode(latchPin, OUTPUT);
    pinMode(dataPin, OUTPUT);
    pinMode(clockPin, OUTPUT);

}

void loop() {
  // put your main code here, to run repeatedly:
   
  MIDI.read();
   
 
}



void noteOn(byte channel, byte note, byte velocity){ 

  SetNote(note, 1);

  Serial.print("Note on - ");
  Serial.print(channel);
  Serial.print("Note:");
  Serial.print(note);
  Serial.print("Value:");
  Serial.println(velocity);
 
}
 
void noteOff(byte channel, byte note, byte velocity){

  SetNote(note, 0);

  Serial.print("Note off - ");
  Serial.print(channel);
  Serial.print("Note:");
  Serial.print(note);
  Serial.print("Value:");
  Serial.println(velocity);
 
}

void handleControlChange(byte channel, byte number, byte value){
  Serial.print("Change - ");
  Serial.print(channel);
  Serial.print("Note:");
  Serial.print(number);
  Serial.print("Value:");
  Serial.println(value);
}

void SetNote(int note, int power)
{
//  Serial.print(note);
//  Serial.print(" - ");
//  Serial.println(power);

  bool P;
  if (power == 0)
  {
    P = 0;
  }
  if (power > 1)
  {
    P = 1;
  }

  int BackNote = 0;
  BackNote = note - 55;
  if(BackNote >= 0 )
  {
   
  regWrite(BackNote, power);
 
  }
  if(BackNote <= 31)
  {
      regWrite(BackNote, power);
  }
}

void regWrite(int pin, bool state){
  //Determines register
  int reg = pin / 8;
  //Determines pin for actual register
  int actualPin = pin - (8 * reg);

  //Begin session
  digitalWrite(latchPin, LOW);

  for (int i = 0; i < numOfRegisters; i++){
    //Get actual states for register
    byte* states = &registerState[i];

    //Update state
    if (i == reg){
      bitWrite(*states, actualPin, state);
    }

    //Write
    shiftOut(dataPin, clockPin, MSBFIRST, *states);
  }

  //End session
  digitalWrite(latchPin, HIGH);
}


Logga in för att visa de filer som bifogats till detta inlägg.


Upp
 Profil  
 
 Inläggsrubrik: Re: Självspelande piano
InläggPostat: 22.27 2019-07-17 

Blev medlem: 22.16 2005-12-28
Inlägg: 58
Ort: Södertälje
4kTRB skrev:
Kul projekt.
Varför inte använda servo i stället för elektromagneter?
Vill du inte ha möjligheten att ha variation i anslagen?


Helt klart en kul tanke. Det är såklart värt en googling.
Om den ursprungliga lösningen hade fungerat så är det bara ett "tryck" som går att få igenom pappersbiten.
"Trycket" finns ju med i ON/ meddeladet tillsammans med vilken not det är.


Upp
 Profil  
 
 Inläggsrubrik: Re: Självspelande piano
InläggPostat: 06.44 2019-07-18 

Blev medlem: 13.42 2011-08-15
Inlägg: 162
Är det detta du har problem med? https://github.com/FortySevenEffects/arduino_midi_library/issues/85

Kan du tvinga fram felet på något sätt? Händer det vid samma tillfälle i en sång, till exempel?
Kan du återskapa felet så försök isolera det - ta bort så mycket som möjligt av sången tills det uppträder på kort tid. Därefter kan du lägga in specialkod som triggar på det, och få ut debuginformation (antar jag)
Kan du inte återskapa det så får du titta på dina writeback-loggar och försöka se var felet kommer ifrån. Se till att ha en loopback så att du ser exakt vad du skickat, så kan du försöka isolera problemet.

Prova att kommentera bort dina serieports-skrivningar, om det är den feedbacken som skapar problem (p.ga. timing eller något sådant).

Midi-biblioteket innehåller en buffer, ja - om meddelanden faktiskt tar sig ut ur UARTen. Prova att modifiera koden och göra "något" om man försöker börja skriva över sin egen svans i bufferten, så kan du se om det är UARTen eller bufferten som trilskas.
Prova att göra den bufferten större, eller mindre. Se om det påverkar hur ditt system beter sig.

Prova att köra MIDI-biblioteket i mottagningsläge - du behöver ju inte skicka data tillbaka till datorn (även om det kan vara roligt för version 2), det kommer kapa kodstorlek och onödiga funktionsanrop.


Generellt sett - dela upp kedjan och isolera. Testa varje del för sig och se om den fungerar. Skickar du rätt data till den? Skickas det på rätt sätt? Tas det emot rätt? Tolkas det rätt? Flyttas det korrekt till minnet? Etc. etc.
Till slut så har du verifierat allt (förhoppningsvis), utom den problematiska delen, och vet då var du ska leta efter buggar och experimentera.


Upp
 Profil  
 
 Inläggsrubrik: Re: Självspelande piano
InläggPostat: 08.51 2019-07-18 
Användarvisningsbild

Blev medlem: 09.04 2007-09-03
Inlägg: 2175
Ort: Säffle
Ett Note-On måste inte nödvändigtvis följas av ett Note-Off.
Man kan köra Running Status för att spara bandbredd och istället skicka Note-On med anslagsvärde 0.

Man kan till och med fuska för vissa instrument.
T.ex. en piano-ton ändå tonar ut efter ett tag, medans en orgel-ton brölar på så länge man håller ner tangenten.

Det är många år sen jag håll på med MIDI men kanske ger ovanstående en idé för felsökning.

Kul projekt annars, kommer följas. :tumupp:


Upp
 Profil  
 
 Inläggsrubrik: Re: Självspelande piano
InläggPostat: 10.38 2019-07-18 

Blev medlem: 17.15 2008-02-11
Inlägg: 2463
Ort: Vasa, Finland
Perfekt Halloween-rekvisita om inte annat :)


Upp
 Profil  
 
 Inläggsrubrik: Re: Självspelande piano
InläggPostat: 10.48 2019-07-18 
Tidigare soundbrigade
Användarvisningsbild

Blev medlem: 21.44 2006-08-23
Inlägg: 20262
Ort: Vänersborg
Du skrev USB-MIDI-omvandlare och på bilden syns en svart klump med två trådar in på ena sidan och en tråd ut på andra. Jag har nog en likadan men aldrig fått tummen ur att nyttja den. Jag har dessutom en Mode Machine (Cerebral) för att omvandla från USB till MIDI.


Upp
 Profil  
 
 Inläggsrubrik: Re: Självspelande piano
InläggPostat: 22.37 2019-07-20 

Blev medlem: 22.16 2005-12-28
Inlägg: 58
Ort: Södertälje
Tack för de fina tipsen. Jag har lagt ett gäng timmar på att testa olika delar, trilskas och meckat, bytt ut, ökat, minskat, stängt av/slagit på. Ja verkligen försökt utesluta eller hitta någon röd tråd i felen, just så som du skriver Zhorts.

Zhorts skrev:

Ja något liknade är det helt klart. Testade att byta version men utan resultat.

bit96 skrev:
Ett Note-On måste inte nödvändigtvis följas av ett Note-Off.
Man kan köra Running Status för att spara bandbredd och istället skicka Note-On med anslagsvärde 0.

Man kan till och med fuska för vissa instrument.
T.ex. en piano-ton ändå tonar ut efter ett tag, medans en orgel-ton brölar på så länge man håller ner tangenten.

Om man stänger av funktionen HandleNullVelocityNoteOnAsNoteOff så kommer faktiskt de flesta som just så som du skriver, Note-On med värde 0. Att ändra UseRunningStatus har för mig inte gjort någon skillnad.
Men ditt tips om fusk är ju intressant, jag har såklart försökt hitta information men som vanligt är det nog inte google som inte har någon info utan min fantasi vad man skall söka på. Hur länge håller en ton? Skulle man kunna kunna tänka sig att man gör en lista med tonerna som är ON och tiden de slog ner, och sedan göra en OFF på dom efter inställd tid?
Jag skall prova att köra som ett annat instrument och se om jag får med mig fler event.

Och visst är det en USB-MIDI omvandlare på bilden HUGGBÄVERN :)

Nedan en bild på sändnings listan och mottagningen på seriell, dok överflyttad till Word för att se kunna markera så man snabbt ser, jag har dessutom lagt till de rader där det bör ha kommit ett OFF och markerat med rött. På denna korta lista saknas 3 event. På två av ställena finns "Tempo change", jag tänkte först att jag missat något där, men då borde de finnas mellan alla On/Off som jag inte får in. Eller är det något jag missar? Dessa sänds dessutom inte ut, finns inget kanal nummer?


Logga in för att visa de filer som bifogats till detta inlägg.


Upp
 Profil  
 
 Inläggsrubrik: Re: Självspelande piano
InläggPostat: 08.12 2019-07-21 

Blev medlem: 22.27 2012-05-26
Inlägg: 30
Ort: Ursviken
Kul projekt. Några tips som förenklar koden. Först variabeln P. Deklarera den till 0 direkt och nästa rad koll av power.
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
bool P = 0; 
IF (power >= 1) P = 1;

Kolla variabeln BackNote för intervallet 0..31 så här:
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
  if(BackNote >= 0 || BackNote <= 31) regWrite(BackNote, power);

Annars anropas nog regWrite två gånger. De två strecken är logisk eller...

Slutligen funderar jag om det blir rätt när du sätter variabeln reg som integer. Blir integer actualPin rätt då?


Upp
 Profil  
 
Visa inlägg nyare än:  Sortera efter  
Svara på tråd  [ 11 inlägg ] 

Alla tidsangivelser är UTC + 1 timme


Vilka är online

Användare som besöker denna kategori: El-Björn, electronix, farskost och 5 gäster


Du kan inte skapa nya trådar i denna kategori
Du kan inte svara på trådar i denna kategori
Du kan inte redigera dina inlägg i denna kategori
Du kan inte ta bort dina inlägg i denna kategori
Du kan inte bifoga filer i denna kategori

Sök efter:
Hoppa till:  
    Electrokit
Drivs av phpBB® Forum Software © phpBB Group
Swedish translation by Peetra & phpBB Sweden © 2006-2010