Home News Forum Kijk/Luister Sample Sets Vergelijk Benodigdheden Foto's Links Downloads Over ons

 

Midificeren met Arduino

Toon actieve onderwerpen


Avatar gebruiker

Berichten: 1820

Geregistreerd: 01 dec 2011 12:35

Woonplaats: Barneveld

Bericht 18 feb 2019 17:43

Midificeren met Arduino

Ik wist dat er mensen mee bezig waren, maar nu weet ik het zeker: http://forum.hauptwerk.com/viewtopic.ph ... 02#p130102
Zoou toch leuk zijn als je een orgel kunt midificeren voor € 5,- per klavier!
Het mooiste orgel maak je zelf.

Berichten: 99

Geregistreerd: 22 jun 2018 07:59

Bericht 25 feb 2019 08:31

Re: Midificeren met Arduino

Volgens mij is het al vaker gedaan...

https://pcorgel.nl/viewtopic.php?f=12&t=2492
Met vriendelijke groet,
Johan.

van Harmonium naar Hauptwerk
Avatar gebruiker

Berichten: 1820

Geregistreerd: 01 dec 2011 12:35

Woonplaats: Barneveld

Bericht 26 feb 2019 22:19

Re: Midificeren met Arduino

Joopie schreef:Volgens mij is het al vaker gedaan...

https://pcorgel.nl/viewtopic.php?f=12&t=2492

Ja inderdaad. Het is toen niet zo aangeslagen...
Maar als er handige jongens zijn, is het volgens mij wel een goedkoper alternatief voor de gebruikelijke midi-ware.
Laatst bijgewerkt door Jaap380 op 27 feb 2019 14:37, in totaal 1 keer bewerkt.
Het mooiste orgel maak je zelf.

Berichten: 99

Geregistreerd: 22 jun 2018 07:59

Bericht 27 feb 2019 08:16

Re: Midificeren met Arduino

Ik zal het is moeten uitzoeken. Ik weet dat een oom van me het wilde doen, heb hem toen mijn Arduino gegeven die lag te verstoffen in de kast. Zal hem is berichten want moet zelf mijn registers nog midificeren en in de toekomst een pedaal.
Met vriendelijke groet,
Johan.

van Harmonium naar Hauptwerk

Berichten: 99

Geregistreerd: 22 jun 2018 07:59

Bericht 01 maart 2019 08:34

Re: Midificeren met Arduino

Ow euhmm Jaap, bekijk deze site is: http://www.jaapvangils.nl/wb/pages/vers ... r-midi.php
Met vriendelijke groet,
Johan.

van Harmonium naar Hauptwerk

Berichten: 99

Geregistreerd: 22 jun 2018 07:59

Bericht 01 maart 2019 19:53

Re: Midificeren met Arduino

Hey een Teensy, had ik nog niet aan gedacht. Maar die pauze van enkele miliseconden snap ik niet helemaal... Gebruik je wel de libraries van de Arduino?
Met vriendelijke groet,
Johan.

van Harmonium naar Hauptwerk

Berichten: 99

Geregistreerd: 22 jun 2018 07:59

Bericht 03 maart 2019 17:56

Re: Midificeren met Arduino

prestantt schreef:Als je een beetje handig ben met elektronica en Arduino...


Met elektronica helaas niet, maar met de Arduino kan ik wel aardig overweg. De matrix materie is gelukkig niet nieuw voor me, maar moest het wel ff ophalen. Dank voor je link, samen met deze informatie kom ik er wel uit. Een ook de elektronica is volgens mij niet bijzonder moeilijk, heb gelukkig links en rechts wat bekenden die daar meer kaas van gegeten hebben.

Ben een boodschappenlijstje aan het samenstellen bij de grote Chineese groothandel, vooralsnog valt dat niet tegen. Ga wel een Arduino gebruiken, wil namelijk in de toekomst ook mijn pedaal er mee kunnen midificeren.
Met vriendelijke groet,
Johan.

van Harmonium naar Hauptwerk

Berichten: 99

Geregistreerd: 22 jun 2018 07:59

Bericht 04 maart 2019 20:14

Re: Midificeren met Arduino

prestantt schreef:Dat is trouwens een hele goede de shiftIn. Had ik nog niet aan gedacht. Alleen weet ik niet hoeveel latency deze chip genereert. Heb er zelf absoluut geen ervaring mee.


Ach... dat zit in de nano secondes. Vanaf de input van de Arduino tot de USB input van de PC zal meer latency opleveren.

In mijn winkelmandje zit nu voor ongeveer €100,- aan spullen. Hiermee kan ik dan een pedaal en een stapel registers mee midificeren. Ik heb alles wat ruimer genomen (assortimentje weerstanden en condensators, paar meter flatcable en een Arduino Mega starterskit) dus voor iemand die wat krapper kijkt kan er zo nog €20,- af. Dan heb je een paar avonden plezier, verbrande vingers en koppijn van code kloppen, maar dan ben je goedkoper uit als bij een leverancier van kant en klare midi componenten.

Jaap bedankt voor je aanzet om het is uit te zoeken, ik denk dat het zeker mogelijk is! (weet alleen niet of ik het ga doen)

Prestantt dank voor het meedenken!
Met vriendelijke groet,
Johan.

van Harmonium naar Hauptwerk

Berichten: 33

Geregistreerd: 19 dec 2015 23:38

Bericht 06 maart 2019 20:27

Re: Midificeren met Arduino

prestantt schreef:
Joopie schreef:
prestantt schreef:Als je een beetje handig ben met elektronica en Arduino...


Met elektronica helaas niet, maar met de Arduino kan ik wel aardig overweg. De matrix materie is gelukkig niet nieuw voor me, maar moest het wel ff ophalen. Dank voor je link, samen met deze informatie kom ik er wel uit. Een ook de elektronica is volgens mij niet bijzonder moeilijk, heb gelukkig links en rechts wat bekenden die daar meer kaas van gegeten hebben.

Ben een boodschappenlijstje aan het samenstellen bij de grote Chineese groothandel, vooralsnog valt dat niet tegen. Ga wel een Arduino gebruiken, wil namelijk in de toekomst ook mijn pedaal er mee kunnen midificeren.

Dat is trouwens een hele goede de shiftIn. Had ik nog niet aan gedacht. Alleen weet ik niet hoeveel latency deze chip genereert. Heb er zelf absoluut geen ervaring mee.


Een interessant topic. Ik denk ook dat er veel voordelen liggen in het gebruik van de Arduino voor midificeren van een orgel.

Daarbij wil ik vooral inhaken op de link die verwijst naar deze informatie. Vermoedelijk kan dit ook nuttig zijn bij het midificeren van outputs. Als voorbeeld geef ik het project waar ik mee bezig ben. Dit is een Domus Opera waarvan de elektronica stuk was. De pedalen en klavieren zijn met elektronica van GINO gemidificeerd. Met de gedachte, waarom moeilijk doen als er al elektronica voor is?
Echter, alle 36 trekregisters zijn voorzien van verlichting. Voor zover ik weet is hiervoor geen bestaande Midi elektronica om dit aan te sturen. De genoemde link kan ook goed van toepassing zijn voor midi-uitgangen. Mocht er interesse zijn kan/wil ik jullie op de hoogte houden.

Berichten: 99

Geregistreerd: 22 jun 2018 07:59

Bericht 06 maart 2019 20:57

Re: Midificeren met Arduino

Dat zou leuk zijn Bastiaan! ShiftOut is inderdaad ook goed mogelijk met een Arduino, het zou niet moeilijk moeten zijn om daar ledjes mee te schakelen!
Met vriendelijke groet,
Johan.

van Harmonium naar Hauptwerk

Berichten: 33

Geregistreerd: 19 dec 2015 23:38

Bericht 30 apr 2019 19:30

Re: Midificeren met Arduino

Inhakend op de vraag wie met Arduino midificeren bezig is.

Ik ben bezig om een defect orgel (Domus) op te knappen. Er zitten pistons met licht in. Die wil ik schakelen met Hauptwerk. Daarvoor moet Hauptwerk wel een signaal uit kunnen sturen via MIDI.

Weet iemand toevallig of dit kan binnen Hauptwerk?

En mocht het lukken, dan wil ik uiteraard de Arduino schets delen met jullie.

Berichten: 5125

Geregistreerd: 12 feb 2011 01:09

Bericht 30 apr 2019 23:51

Re: Midificeren met Arduino

Ja, dat kan in HW
Zie blz. 155 van het HauptwerkInstallationAndUserManual

Berichten: 99

Geregistreerd: 22 jun 2018 07:59

Bericht 07 jun 2019 20:20

Re: Midificeren met Arduino

Nou we zijn weer wat verder gekomen. Heb een Arduino Leonardo laten invliegen. Deze beschikt over de juiste USB MCU. Hij kan dus via USB rechtstreeks op de PC aangesloten worden. Dit heb ik net is even getest en het is mogelijk de Arduino Leonardo te selecteren als midi input in hauptwerk. Ik verwacht met een paar weken de rest van de elektronica, dan kunnen we is wat reed contacten etc gaan testen.
Met vriendelijke groet,
Johan.

van Harmonium naar Hauptwerk

Berichten: 33

Geregistreerd: 19 dec 2015 23:38

Bericht 10 jun 2019 19:01

Re: Midificeren met Arduino

Joopie schreef:Nou we zijn weer wat verder gekomen. Heb een Arduino Leonardo laten invliegen. Deze beschikt over de juiste USB MCU. Hij kan dus via USB rechtstreeks op de PC aangesloten worden. Dit heb ik net is even getest en het is mogelijk de Arduino Leonardo te selecteren als midi input in hauptwerk. Ik verwacht met een paar weken de rest van de elektronica, dan kunnen we is wat reed contacten etc gaan testen.


Interessante ontwikkeling. Zou je eens kunnen laten weten hoe de bevindingen zijn i.c.m. Hauptwerk? Met name de latency ben ik wel benieuwd naar.

Berichten: 33

Geregistreerd: 19 dec 2015 23:38

Bericht 10 jun 2019 19:11

Re: Midificeren met Arduino

En ik ben ook verder gegaan. Inmiddels is er in de lijn van dit forum, een stukje code geschreven voor de Arduino. Met behulp van 6 shift-in registers, zijn de 36 pistons van de Domus Opera voorzien van licht.

Hieronder volgt de code:

N.B. Deze code is uiteraard specifiek voor een Domus Opera. Deze code is vrij aanpasbaar, en het zou leuk zijn als iemand hier wat mee kan, dan hoor ik het graag terug in een pb.

  Code:
//**************************************************************//
//  Name    : shiftOutCode, Dual Binary Counters                 //
int latchPin = 8;
int clockPin = 10;
int dataPin = 9;
byte commandByte;
byte noteByte;
byte velocityByte;
int RegisterA1B3Temp;
int RegisterA1B3;
int RegisterB4D1Temp1;
int RegisterB4D1Temp2;
int RegisterB4D1;
int RegisterD205Temp;
int RegisterD205;
int RegisterD3F1Temp;
int RegisterD3F1;
int RegisterF2H1Temp;
int RegisterF2H1;
int RegisterH2H3Temp;
int RegisterH2H3;

void setup() {
  //Start Serial for debuging purposes 
  Serial.begin(31250);
  //set pins to output because they are addressed in the main loop
  pinMode(latchPin, OUTPUT);

}

void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {
  int i=0;
  int pinState;
  pinMode(myClockPin, OUTPUT);
  pinMode(myDataPin, OUTPUT);

  digitalWrite(myDataPin, 0);
  digitalWrite(myClockPin, 0);

  for (i=7; i>=0; i--)  {
    digitalWrite(myClockPin, 0);

    //if the value passed to myDataOut and a bitmask result
    // true then... so if we are at i=6 and our value is
    // %11010100 it would the code compares it to %01000000
    // and proceeds to set pinState to 1.
    if ( myDataOut & (1<<i) ) {
      pinState= 1;
    }
    else { 
      pinState= 0;
    }

    //Sets the pin to HIGH or LOW depending on pinState
    digitalWrite(myDataPin, pinState);
    //register shifts bits on upstroke of clock pin 
    digitalWrite(myClockPin, 1);
    //zero the data pin after shift to prevent bleed through
    digitalWrite(myDataPin, 0);
  }

  //stop shifting
  digitalWrite(myClockPin, 0);
}

//midi
void checkMIDI(){
  do{
    if (Serial.available()){
      commandByte = Serial.read();//read first byte
      noteByte = Serial.read();//read next byte
      velocityByte = Serial.read();//read final byte
     // if (commandByte == noteOn){//if note on message
        //check if note == 60 and velocity > 0   //debugging purposes     
          digitalWrite(13,HIGH);//turn on led
         // Serial.begin(9600);
         // Serial.print("Var 1: ");
         // Serial.print(commandByte);
         // Serial.print("Var 2: ");
         // Serial.print(noteByte);
         //  Serial.print("Var 3: ");
         //  Serial.print(velocityByte);
         //  Serial.begin(31250);
       }
    }
    while (Serial.available() > 2);//when at least three bytes available

 
    //ground latchPin and hold low for as long as you are transmitting
    digitalWrite(latchPin, 1);

    if (noteByte > 72 && noteByte < 75)
      {
      RegisterH2H3Temp = 0.5 + pow(2,(noteByte-73));
      RegisterH2H3 = RegisterH2H3 ^ (RegisterH2H3Temp & 3);   
      }
    shiftOut(dataPin, clockPin, RegisterH2H3); //register H2 en H3

    if (noteByte > 64 && noteByte < 73)
    {
      RegisterF2H1Temp = 0.5 + pow(2,(noteByte-65));
      RegisterF2H1 = RegisterF2H1 ^ RegisterF2H1Temp;     
    }
    shiftOut(dataPin, clockPin, RegisterF2H1);//register F2 - H1   
   
    if (noteByte > 56 && noteByte < 65)
      {
      RegisterD3F1Temp = 0.5 + pow(2,(noteByte-57));
      RegisterD3F1 = RegisterD3F1 ^ RegisterD3F1Temp;
      }
    shiftOut(dataPin, clockPin, RegisterD3F1);//register D3 - F1

     if (noteByte > 55 && noteByte < 57)
     {
      RegisterD205Temp = 0.5 + pow(2,(noteByte-56));
      RegisterD205 = RegisterD205 ^ (RegisterD205Temp & 255);
     }
    shiftOut(dataPin, clockPin, RegisterD205);//register D2 (255) + 0-5
   
    if (noteByte > 43 && noteByte < 56 )
      {
      RegisterB4D1Temp1 = 0.5 + pow(2,(noteByte-44)) ;
      RegisterB4D1Temp1 = (RegisterB4D1Temp1 & 15);
      RegisterB4D1 = RegisterB4D1 ^ RegisterB4D1Temp1;
      RegisterB4D1Temp2 = 0.5 + pow(2,(noteByte-48)) ;
      RegisterB4D1Temp2 = (RegisterB4D1Temp2 & 240);
      RegisterB4D1 = RegisterB4D1 ^ RegisterB4D1Temp2;
      }   
    shiftOut(dataPin, clockPin, RegisterB4D1);//register B4 - D1
   
    //shiftOut(dataPin, clockPin, 3);//register B4 - D1
    //shiftOut(dataPin, clockPin, 0);//register A1 - B3
    //return the latch pin high to signal chip that it

    if (noteByte > 35 && noteByte < 44)
    {
      RegisterA1B3Temp = 0.5 + (pow(2,(noteByte-36)));
      RegisterA1B3 = RegisterA1B3 ^ RegisterA1B3Temp;
    } 
    shiftOut(dataPin, clockPin, RegisterA1B3);

    noteByte = 0;
    //no longer needs to listen for information
    digitalWrite(latchPin, 1);
   
}

//end midi

void loop() {
//midi
    checkMIDI();
    delay(1000);
    digitalWrite(13,LOW);//turn led off
   
    }

Berichten: 15

Geregistreerd: 02 okt 2018 14:33

Bericht 11 jun 2019 20:05

Re: Midificeren met Arduino

Goedenavond,

Ik heb een aantal maanden geleden mijn orgel gemidificeerd en heb dat ook met arduino gedaan. Daarvoor gebruik ik 8 multiplexers (74HC4051) met elk 8 inputs, dus een totaal van 8*8=64 inputs waarvoor ik maar 8+3=11 pinnen op mijn arduino nodig heb. De code stuurt alleen een MIDI-signaal als de input is veranderd, wat een hoop onnodige data scheelt. Voor de hardware heb ik een eenvoudig PCB gemaakt, zodat het er een beetje netjes uitziet. Voor elk klavier en het pedaal gebruik ik zo'n PCB, voor de registers kan dat ook, maar heb nog niet de moeite genomen om dat aan te sluiten ;). Totaal krijg ik nu dus van elk PCB een MIDI-signaal die ik met een MIDI-merger samenvoeg. En die gaat dan weer met een ROLAND-UM-ONE naar mn PC.

De kosten van het gehele midificeren zijn denk ik zo'n €150,-. €60,- voor de MIDI-merger, €40,- voor de Roland, €10,- voor 10 PCB's en dan de componenten nog. En uiteraard een hoop uurtjes :P .

Dit is de code:
  Code:
#define S0   2
#define S1   3
#define S2   4

#define I1  5
#define I2  6
#define I3  7
#define I4  8
#define I5  9
#define I6  10
#define I7  11
#define I8  12

int inputNieuw[64] = {0};
int inputOud[64] = {0};
int i,j,k;
int offset = 36;
int kanaal = 3; // 0-15
int commando = 0x90; // NoteOn

void setup() {
  Serial.begin(31250);  // Set MIDI baud rate (31250)
  //Serial.println("MIDI controller gestart");

  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
 
  pinMode(I1, INPUT);
  pinMode(I2, INPUT);
  pinMode(I3, INPUT);
  pinMode(I4, INPUT);
  pinMode(I5, INPUT);
  pinMode(I6, INPUT);
  pinMode(I7, INPUT);
  pinMode(I8, INPUT);

  digitalWrite(S0, LOW);
  digitalWrite(S1, LOW);
  digitalWrite(S2, LOW);

  commando |= kanaal;
}

void loop() {
  for(i=0; i<8; i++)  // 8 digitale inputs afgaan
  {
    for(j=0; j<8; j++)  // 8 combinaties voor de select pinnen
      {
        setSelectpins(j);
        inputNieuw[i*8+j] = digitalRead(I1+i);
        //Serial.print(inputNieuw[i*8+j]);  // gebruik om te debuggen. Zet baudrate dan op 9600. ontcommentaar ook de Serial.println() aan het eind van de loop
      }
  }
 
  for(k=0; k<64; k++)
  {
    if(inputNieuw[k] != inputOud[k])  // alleen als de input is veranderd een MIDI transfer doen
    {
      if(inputNieuw[k] == LOW) MIDItransfer(commando, offset+k, 127);
      else MIDItransfer(commando, offset+k, 0);
    }
  }

copy(inputNieuw, inputOud, 64);
//Serial.println();
}

void MIDItransfer(int cmd, int pitch, int velocity) {
  Serial.write(cmd);
  Serial.write(pitch);
  Serial.write(velocity);
}

void copy(int* src, int* dst, int len) {
    memcpy(dst, src, sizeof(src[0])*len);
}

void setSelectpins(int combinatie)
{
  if((combinatie&0b001) != 0) digitalWrite(S0, HIGH); else digitalWrite(S0, LOW);
  if((combinatie&0b010) != 0) digitalWrite(S1, HIGH); else digitalWrite(S1, LOW);
  if((combinatie&0b100) != 0) digitalWrite(S2, HIGH); else digitalWrite(S2, LOW);
}



En nog wat foto's:

Afbeelding
Afbeelding
Afbeelding
Afbeelding
Afbeelding
Afbeelding

Als iemand interesse heeft in de bestanden van het PCB om het zelf te bestellen hoor ik het wel!

Berichten: 99

Geregistreerd: 22 jun 2018 07:59

Bericht 12 jun 2019 08:38

Re: Midificeren met Arduino

Zeker Bastiaan! Ik hou je op de hoogte.

Nou moe Corjan... had ik dit 2 maanden eerder gezien dan had ikzelf wat minder hoeven puzzelen :lol: Maar dit ziet er erg netjes uit zeg! Ik ben zelf niet zo bekend met het matrix verhaal dus was op shift-in uitgekomen. Maar nu ik al deze informatie ziet met source code en al begin ik toch echt te twijfelen! Ook de pcbtjes die je heb laten ontwikkelen zien er super goed uit!

Welke Midi merger gebruik je hiervoor? Ik zie ook niet zo snel waar je die Arduino nou in dit verhaal heb verstopt...
Met vriendelijke groet,
Johan.

van Harmonium naar Hauptwerk

Berichten: 15

Geregistreerd: 02 okt 2018 14:33

Bericht 12 jun 2019 16:09

Re: Midificeren met Arduino

Volgens mij is shiftin vrijwel hetzelfde als multiplexers. Als ik het zo zie is het enige verschil dat shiftin een clock nodig heeft en je bij een multiplexer de in/uitgang kiest door select pinnen. Matrix was voor mij geen optie, omdat ik de bestaande contacten van mijn klavieren gebruik; 1 geleidende staaf over heel de breedte van het klavier waar dan per toets een veertje op gedrukt wordt. Dus tenzij ik de staaf een aantal keer onderbreek heb ik niks aan een matrix... Nu sluit ik de geleidende staaf aan op de GND van het PCB en op elke input een toets. Dat werkt op zich prima, maar bij een paar toetsen hoor je af en toe een hapering. Waarschijnlijk een beetje geoxideerd of op een andere manier wat minder goed contact.
Wat de arduino betreft, ik gebruik alleen de chip (in het midden met 28 pinnen). Die programmeer ik eerst in een arduino uno en dan zet ik de chip in het PCB. In het schema is het dat grote component aan de rechterkant. Links daarvan zie je de 8 multiplexers die dan weer naar alle 64 pinnen gaan. En die hebben allemaal een pullup weerstand.
Om alle MIDI-signalen samen te voegen gebruik ik een ESI MikroMerge, maar die zijn geloof ik niet meer te koop. Toen ik hem kocht was hij al haast nergens meer verkrijgbaar. Maar ik denk dat je die ook zelf wel kunt maken, ik zal het eens proberen.

Berichten: 99

Geregistreerd: 22 jun 2018 07:59

Bericht 17 jun 2019 21:41

Re: Midificeren met Arduino

Ah oke, het plaatje is nu compleet. Dank voor je antwoorden, het is me duidelijk!

Ik wil de Arduino gelijk gebruiken als VST link in Hauptwerk, dus dan gaat jouw printje niet werken, maar bedankt voor de info en antwoorden!
Met vriendelijke groet,
Johan.

van Harmonium naar Hauptwerk

Berichten: 2

Geregistreerd: 25 jun 2012 21:23

Bericht 13 aug 2019 11:58

Re: Midificeren met Arduino

Corjan Veenema schreef:Dit is de code:
<.>
Als iemand interesse heeft in de bestanden van het PCB om het zelf te bestellen hoor ik het wel!

Dat ziet er heel professioneel uit Corjan! Ik heb zeker interesse in de PCB bestanden, op dit moment werkt mijn orgelpedaal met een doepfer ctm64. Die bestaat uit acht keer een Shift-and-Store Register (CD4094BE) en een PIC16F73 microprocessor. De ctm64 zit aan een roland UM1. Het lijkt me wel leuk om die te vervangen door iets zelfgemaakts. Zit nog te twijfelen tussen teensy en arduino. Met teensy kan ik direct usb-midi uitsturen en heb ik de roland niet meer nodig, maar met arduino kan ik van dit nette ontwerp gebruik maken en hoef ik niet zelf het wiel uit te vinden.

Hoe zit het met de latency? Stabiliteit?

Ik ben door de code heen gegaan en was benieuwd waarom je bepaalde keuzes maakt. Het is wel een boel tekst geworden. :oops:

Je verandert 64 keer de selectpins. Werkt het ook als je dat maar 8 keer doet?
  Code:
for(j=0; j<8; j++)  // 8 combinaties voor de select pinnen
{
   setSelectpins(j);
   for(i=0; i<8; i++)  // 8 digitale inputs afgaan
      {
      inputNieuw[i*8+j] = digitalRead(I1+i);
      //Serial.print(inputNieuw[i*8+j]);  // gebruik om te debuggen. Zet baudrate dan op 9600. ontcommentaar ook de Serial.println() aan het eind van de loop
      }
}

Je verstuurt alleen note-on commando's en verandert het volume afhankelijk van de nieuwe status. (127 bij off, 0 bij on, dus indrukken van een toets zet het signaal laag?)
Wat gebeurt er als je note-on en note-off gebruikt?
  Code:
byte noteOn = kanaal | 144;
byte noteOff = kanaal | 128;
for(k=0; k<64; k++)
{
   if(inputNieuw[k] != inputOud[k])  // alleen als de input is veranderd een MIDI transfer doen
   {
      if(inputNieuw[k] == LOW) MIDItransfer(noteOn, offset+k, 127);
      else MIDItransfer(noteOff, offset+k, 127);
   }
}

Kan je alles in 2 loops ipv 3 doen of wordt dat onstabiel?
  Code:
for(j=0; j<8; j++)  // 8 combinaties voor de select pinnen
{
   setSelectpins(j);
   for(i=0; i<8; i++)  // 8 digitale inputs afgaan
      {
      k=i*8+j
      inputNieuw[k] = digitalRead(I1+i);
      if(inputNieuw[k] != inputOud[k])  // alleen als de input is veranderd een MIDI transfer doen
      {
         if(inputNieuw[k] == LOW) MIDItransfer(144, offset+k, 127);
         else MIDItransfer(128, offset+k, 127);
      }
      //Serial.print(inputNieuw[i*8+j]);  // gebruik om te debuggen. Zet baudrate dan op 9600. ontcommentaar ook de Serial.println() aan het eind van de loop
      }
}

Serial.write verwacht drie keer een byte, maar je geeft hem drie keer een int. Wat gebeurt er als je drie bytes in 1 keer naar de poort stuurt?
  Code:
byte command[3] = {0};       //ruimte reserveren
command[2] = 127;            //volume verandert nergens
if(inputNieuw[k] != inputOud[k])  // alleen als de input is veranderd een MIDI transfer doen
{
   command[1] = offset+k;
   if(inputNieuw[k] == LOW)
   {
      command[0]=noteOn;
   }
   else
   {
      command[0]=noteOff;
   }
   Serial.write(command,3); // alle drie tegelijk om delay te minimaliseren
}


Ik blijf het apart vinden dat arduino een bij een digital read een 16 bits waarde teruggeeft ipv een bit of een byte, maar daar moeten we het maar mee doen. Betekent wel dat je per loop 16x meer informatie moet kopiëren dan strikt noodzakelijk.

Pin 2,3 en 4 zitten trouwens op dezelfde bus, dus je zou eventueel nog wat snelheid kunnen winnen door ze tegelijk te setten.
  Code:
void setSelectpins(int combinatie)
{
  //PORTD bestuurt digital pin 0-7. Zie https://www.arduino.cc/en/Reference/PortManipulation
  //om bijvoorbeeld digital pin 3 hoog te zetten en de rest laag zijn twee commandos nodig
  //1) alles laag:
  //PORTD = PORTD & B11100011; //we komen niet aan pin 0,1,5,6,7
  //2) pin 3 hoog:
  //PORTD = PORTD | B00001000; //we komen niet aan de overige pinnen
 
  //nu zetten we de combinatie in twee commandos
  PORTD = PORTD & B11100011; //we komen niet aan pin 0,1,5,6,7
  PORTD = PORTD | (combinatie<<2) //shift de bitjes 2 naar links.
}

Berichten: 46

Geregistreerd: 30 nov 2015 14:39

Bericht 19 aug 2019 17:23

Re: Midificeren met Arduino

Mijn pedaal werkt sinds oktober 2016 zonder problemen op de arduino, het is een beetje werk, net niet helemaal plug & play, maar naar mijn idee de moeite geheel waard

Berichten: 15

Geregistreerd: 02 okt 2018 14:33

Bericht 09 sep 2019 16:59

Re: Midificeren met Arduino

rolf schreef:Met teensy kan ik direct usb-midi uitsturen en heb ik de roland niet meer nodig, maar met arduino kan ik van dit nette ontwerp gebruik maken en hoef ik niet zelf het wiel uit te vinden.


Tja, ik bedacht me na uitvoeren van dit project ook dat ik net zo goed een USB interface had kunnen maken i.p.v. een midi-interface. Maar als je de UM1 al hebt maakt het natuurlijk niet zo heel veel meer uit.

rolf schreef:Je verandert 64 keer de selectpins. Werkt het ook als je dat maar 8 keer doet?

Je hebt gelijk, dat kan inderdaad. Ik weet alleen niet of het uitlezen van een input sneller is dat het setten van een output.

rolf schreef:Je verstuurt alleen note-on commando's en verandert het volume afhankelijk van de nieuwe status. (127 bij off, 0 bij on, dus indrukken van een toets zet het signaal laag?)
Wat gebeurt er als je note-on en note-off gebruikt?


Ik weet het niet meer zeker, maar volgens mij heeft Hauptwerk daar moeite mee. Het is echter al een tijdje geleden dat ik dit gemaakt heb dus helemaal helder heb ik het niet meer. Maar ik geloof dat een noteOn met velocity 0 automatisch als noteOff geintepreteerd wordt.

rolf schreef:Kan je alles in 2 loops ipv 3 doen of wordt dat onstabiel?

Ook dat kan, het voordeel van de 3 loops is dat de hele array met statussen van de toetsen in 1 keer gestuurd wordt. Zodoende zit er minder tijd tussen het sturen van de status van de laagste noot en die van de hoogste. Maar ik denk niet dat je het hoort. De latency is met de huidige code overigens al niet merkbaar. Ik merk het niet in ieder geval ;).

Als ik code schrijf is die vaak meer functioneel dan efficiënt ;). Maar het kan inderdaad sneller als je command als array verstuurt en de setSelectpins op registerniveau aanstuurt.

Als je nog steeds interesse hebt in de PCB bestanden ziet ik wel een PBtje tegemoet.

Berichten: 2

Geregistreerd: 25 jun 2012 21:23

Bericht 23 mei 2022 21:38

Re: Midificeren met Arduino

Tot mijn spijt heb ik nooit meer netjes geantwoord op het bericht van Corjan. :oops:

Afgelopen jaren heb ik niets meer met het hele project gedaan. Mijn zelfgeknutselde 4 manuaals hauptwerkorgel stond al die jaren vrijwel ongebruikt. Sinds enkele dagen heb ik echter een oud analoog orgeltje (Content K-350) dat klein genoeg is voor de woonkamer en waarop ik nu weer dagelijks speel. Dus ik dacht weer terug aan het mogelijk midificeren en wat ik daarvoor had ontworpen en gesoldeerd. Dus bij het graven kwam ik dit topic tegen.

Uiteindelijk ben ik verder gegaan met de teensy3.2 en het direct genereren van midi over usb. Dit om de latency zo laag mogelijk te houden, en een usb->midi adapter uit te sparen. Hieronder het resultaat:
Afbeelding
Afbeelding
Afbeelding
Zoals te zien is het een heel klein bordje geworden dat makkelijk is weg te werken.
De code om het mee aan te sturen had ik ook nog liggen.
  Code:
/////////////////////
// Pin Definitions //
/////////////////////
const int SELECTPINS[3] = {2, 3, 4};
const int LINEPINS[8] = {14,15,16,17,18,19,20,21};
const int CHANNEL = 1;     //midichannel
const int NOTEOFFSET = 60; //lowest note, 60=C4
const int LOWLIM = 32;
const int HIGHLIM = 2048;
bool value[64]; //is note on or off
int inputValue; //value to read
void setup() {
  for (int i=0;i<7;i++){
    pinMode(LINEPINS[i], INPUT_PULLUP); //pin 01-08 , 09-16 , etc.
  }
  for (int i=0; i<3; i++)
  {
    pinMode(SELECTPINS[i], OUTPUT);
    digitalWrite(SELECTPINS[i], LOW);
  }
  for (int i=0;i<64;i++){
    value[i]=false;
  }
}
void loop() {
  // put your main code here, to run repeatedly:
  for (byte pin=0; pin<=7; pin++) { // Select one pin on every chip
    selectMuxPin(pin);
    delayMicroseconds(100);
    for (byte line=0; line<=7; line++){ // Scan all eight chips
      inputValue = 0;
      for (int i = 0;i<4;i++){
        inputValue += analogRead(LINEPINS[line]); // read the line 4 times
      }
      if (inputValue<LOWLIM&!value[pin+8*line]){ // if pulled to ground = connection = noteOn
        value[pin+8*line]=true;
        usbMIDI.sendNoteOn(NOTEOFFSET+pin+8*line, inputValue, CHANNEL);  // 60-67 = C4-G4
      }
      if (inputValue>HIGHLIM&value[pin+8*line]){ // Input Pull-up
        value[pin+8*line]=false;
        usbMIDI.sendNoteOff(NOTEOFFSET+pin+8*line, inputValue/128, CHANNEL);  // 60-67 = C4-G4
      }
    }
  }

  // MIDI Controllers should discard incoming MIDI messages.
  // http://forum.pjrc.com/threads/24179-Teensy-3-Ableton-Analog-CC-causes-midi-crash
  while (usbMIDI.read()) {
    // ignore incoming messages
  }
}
void selectMuxPin(byte pin)
{
  for (int i=0; i<3; i++)
  {
    if (pin & (1<<i))
      digitalWrite(SELECTPINS[i], HIGH);
    else
      digitalWrite(SELECTPINS[i], LOW);
  }
}


Het daadwerkelijk midificeren van zo'n oud analoog orgel is waarschijnlijk lastig. Alle connectoren van de manualen en het pedaal zitten op de printplaat met dit soort connectoren:
Afbeelding
Voor het bovenste manuaal gaat het om 4x12 en 1x14 =62 draadjes. Met 5 octaven, c-c, zijn dat 61 toetsen, en 1 "massa" waarmee ze verbinding maken. In theorie zou ik daar mijn 64-kanaals teensymidi op moeten kunnen solderen, maar omdat er ook nog een hoop analoge signalen door dat orgel gaan ben ik benieuwd of het zo makkelijk zal gaan. Is er hier iemand die er ervaring mee heeft?

Keer terug naar Speeltafels (o.a. bouw)

Wie is er online

Gebruikers op dit forum: Geen geregistreerde gebruikers. en 15 gasten




Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF. phpBB.nl Vertaling

 

Copyright (c) 2008 PCorgan.com. All rights reserved. Mail: info@PCorgan.com