Avatar
gregormirek10:

Jsem začátečník a vyrobil jsem midi footkontroler.

Vše jsem rozběhal, ale teď mám problém a jsem v koncích.

Co potřebuji poradit, PROSÍM !!! :
Zde je odkaz kde to řeším také.

https://github.com/…DI/issues/20#…

Přijímám midi data a potřebuji ale poslat NRPN na místo Control change nebo note.

Příklad.
Pokud např .přijmu Control change CC#80 /to je hex 0x50/
tak chci odeslat na

“serial1. write “

příkaz v NRPN /0xB0,0x63,0x­7D,0xB0,0x62,0x58,0xB0,0­x06,0x00,0xB0,0x26,0x01/

Dostal jsem tento kod,ale už neví jak dál.

void MIDI_poll()
{
byte outBuf[ 3 ];
uint8_t size;
do {
if( (size=Midi.Rec­vData(outBuf)) > 0 ){
if((outBuf[0] & 0xf0) == 0xb0){ //CC received?
//Send sysex to serial code here
}
}
}while(size>0);
}

Please write your code in ‚//Send sysex to serial code here‘ line

Pokud by zde byla dobrá duše a pomohla mi prosím s kodem.

Děkuji Mirek

 
Odpovědět 11.3.2015 9:47
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:

Ahoj,

zkusil bych na to jít nějak takhle:

static unsigned char NRPNBuffer [] = {
  0xB0,0x63,0x7D,0xB0,0x62,0x58,0xB0,
  0x06,0x00,0xB0,0x26,0x01}
...
void MIDI_poll()
{
  byte outBuf[ 3 ];
  uint8_t size;
  do {
    if( (size=Midi.RecvData(outBuf)) > 0 ){
      if((outBuf[0] & 0xf0) == 0xb0){
        //CC received?
        Serial.write(NRPNBuffer, sizeof(NRPNBuffer));
      }
    }
  } while(size>0);

  return;
}

Nevím ale, zda CC bude mít hodnotu 0xb0 (tzn. zda se to na ten můj zápis na COM port vůbec dostane), protože mi přijde, že se ty neshoduješ s komentářem v tom kódu. Ale příslušný protokol/formát příchodu dat do tvého Arduina neznám.

Nahoru Odpovědět 11.3.2015 22:12
2 + 2 = 5 for extremely large values of 2
Avatar
Odpovídá na Martin Dráb
gregormirek10:

Výborně.:)
Díky moc za reakci.Asi to bude ono.
Ty midi CC budou např tohle je CC 80. nebo to můžou být noty,to je jedno.

if((outBuf[0] & 0xf0) ==0xb0,0x50,0x7f);{

Chci se ještě zeptat.

Když budu mít těch NRPN víc,stačí připsat jen

const byte nrpnStopandplayRecording[] = {0xB0,0x63,0x7D,0xB0,0x62,0x58,0xB0,0x06,0x00,0xB0,0x26,0x00}
const byte nrpnStartRecording[] = {0xB0,0x63,0x7D,0xB0,0x62,0x58,0xB0,0x06,0x00,0xB0,0x26,0x01}// a další NRPN;

a potom opsat a doplnit jinýma hodnotama CC midi, přepsat nazvy v Serial1.write ?

if((outBuf[0] & 0xf0) == 0xb0){ //CC received?
         //Send sysex to serial code here
         if(outBuf[1] == 0x01 && outBuf[2] == 0x00){
           Serial1.write(nrpnStartRecording, sizeof(nrpnStartRecording));
Editováno 11.3.2015 22:36
 
Nahoru Odpovědět 11.3.2015 22:34
Avatar
Odpovídá na gregormirek10
gregormirek10:

Jo tady je původní kod který funguje ,ale přeposílá jen midi z usb midi controleru připojeného k Arduinu. do Serial 5 Din standart midi konektoru.

Já ,ale potřebuji ještě poslat z usbcotr. midi příkaz CC a poslat ho do Serial out ,ale v NRPN,protože můj Kemper amp přijímá NRPN pro Looper.Nedali tam blbci Midi commandy.

https://github.com/…wa/USBH_MIDI

/*
 *******************************************************************************
 * USB-MIDI to Legacy Serial MIDI converter
 * Copyright 2012-2014 Yuuichi Akagawa
 *
 * Idea from LPK25 USB-MIDI to Serial MIDI converter
 *   by Collin Cunningham - makezine.com, narbotic.com
 *
 * for use with USB Host Shield 2.0 from Circuitsathome.com
 * https://github.com/felis/USB_Host_Shield_2.0
 *******************************************************************************
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>
 *******************************************************************************
 */

#include <Usb.h>
#include <usbh_midi.h>

#ifdef USBCON
#define _MIDI_SERIAL_PORT Serial1
#else
#define _MIDI_SERIAL_PORT Serial
#endif
//////////////////////////
// MIDI Pin assign
// 2 : GND
// 4 : +5V(Vcc) with 220ohm
// 5 : TX
//////////////////////////

USB  Usb;
USBH_MIDI  Midi(&Usb);

void MIDI_poll();
void doDelay(unsigned long t1, unsigned long t2, unsigned long delayTime);

void setup()
{
  Serial1.begin(31250);

  //Workaround for non UHS2.0 Shield
  pinMode(7,OUTPUT);
  digitalWrite(7,HIGH);

  if (Usb.Init() == -1) {
    while(1); //halt
  }//if (Usb.Init() == -1...
  delay( 200 );
}

void loop()
{
  unsigned long t1;

  Usb.Task();
  t1 = micros();
  if( Usb.getUsbTaskState() == USB_STATE_RUNNING )
  {
    MIDI_poll();
  }
  //delay(1ms)
  doDelay(t1, micros(), 1000);
}

// Poll USB MIDI Controler and send to serial MIDI
void MIDI_poll()
{
    byte outBuf[ 3 ];
    uint8_t size;

    do {
      if( (size=Midi.RecvData(outBuf)) > 0 ){
        //MIDI Output
       Serial1.write(outBuf, size);
      }
    }while(size>0);
}

// Delay time (max 16383 us)
void doDelay(unsigned long t1, unsigned long t2, unsigned long delayTime)
{
    unsigned long t3;

    if( t1 > t2 ){
      t3 = (4294967295 - t1 + t2);
    }else{
      t3 = t2 - t1;
    }

    if( t3 < delayTime ){
      delayMicroseconds(delayTime - t3);
    }
}

\---

Editováno 11.3.2015 22:45
 
Nahoru Odpovědět 11.3.2015 22:43
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na gregormirek10
Martin Dráb:

Jo, tak nějak to můžeš rozšiřovat. Fungovat by to mělo.

Jinak ano, já jsem se k "Arduinu" dostal teprve nedávno (Intel Galileo Gen2) a mám z toho dost rozporuplné pocity, třeba z těch knihoven.

Nahoru Odpovědět 11.3.2015 23:07
2 + 2 = 5 for extremely large values of 2
Avatar
gregormirek10:

Tak opět.
Nefunguje.:(
Jsou nějaké error hlášky

#include <usbh_midi.h>
#include <MIDI.h>
#include <midi_Defs.h>
#include <midi_Message.h>
#include <midi_Namespace.h>
#include <midi_Settings.h>
#include <Usb.h>
#include <usbh_midi.h>

#ifdef USBCON
#define _MIDI_SERIAL_PORT Serial1
#else
#define _MIDI_SERIAL_PORT Serial
#endif
//////////////////////////
// MIDI Pin assign
// 2 : GND
// 4 : +5V(Vcc) with 220ohm
// 5 : TX
//////////////////////////

USB  Usb;
USBH_MIDI  Midi(&Usb);

void MIDI_poll();
void doDelay(unsigned long t1, unsigned long t2, unsigned long delayTime);

void setup()
{
  Serial1.begin(31250);

  //Workaround for non UHS2.0 Shield
  pinMode(7,OUTPUT);
  digitalWrite(7,HIGH);

  if (Usb.Init() == -1) {
    while(1); //halt
  }//if (Usb.Init() == -1...
  delay( 200 );
}

void loop()
{
  unsigned long t1;

  Usb.Task();
  t1 = micros();
  if( Usb.getUsbTaskState() == USB_STATE_RUNNING )
  {
    MIDI_poll();
  }
  //delay(1ms)
  doDelay(t1, micros(), 1000);
}

const byte nrpnStartRecording[] = {0xB0,0x63,0x7D,0xB0,0x62,0x58,0xB0,0x06,0x00,0xB0,0x26,0x01};
// Poll USB MIDI Controler and send to serial MIDI
void MIDI_poll()
{
    byte outBuf[ 3 ];
    uint8_t size;

    do {
      if( (size=Midi.RecvData(outBuf)) > 0 ){
        if((outBuf[0] & 0xf0) ==(0xb0,0x50,0x7f));{ //CC received?
         if(outBuf[1] == 0x01 && outBuf[2] == 0x00){
            Serial1.write(nrpnStartRecording, sizeof(nrpnStartRecording));
      }
    }while(size>0);

    return;
}

// Delay time (max 16383 us)
void doDelay(unsigned long t1, unsigned long t2, unsigned long delayTime)
{
    unsigned long t3;

    if( t1 > t2 ){
      t3 = (4294967295 - t1 + t2);
    }else{
      t3 = t2 - t1;
    }

    if( t3 < delayTime ){
      delayMicroseconds(delayTime - t3);
    }
}

USB_MIDI_conver­ter.ino: In function 'void MIDI_poll()':
USB_MIDI_conver­ter:76: error: a function-definition is not allowed here before '{' token
USB_MIDI_conver­ter:88: error: expected `}' at end of input
USB_MIDI_conver­ter:88: error: expected `while' at end of input
USB_MIDI_conver­ter:88: error: expected `(' at end of input
USB_MIDI_conver­ter:88: error: expected primary-expression at end of input
USB_MIDI_conver­ter:88: error: expected `)' at end of input
USB_MIDI_conver­ter:88: error: expected `;' at end of input
USB_MIDI_conver­ter:88: error: expected `}' at end of input

 
Nahoru Odpovědět 12.3.2015 12:02
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na gregormirek10
Jan Vargovský:

Středník za ifem. Plus ti tam chybí konec složené závorky.

 
Nahoru Odpovědět  +1 12.3.2015 12:26
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na gregormirek10
David Čápka:

Neodpustím si okomentovat souvětí "Nefunguje.:( Jsou nějaké error hlášky". Tak si je snad přečti, ne? Máš tam detailně popsáno co se překladači nezdá.

Nahoru Odpovědět 12.3.2015 12:35
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na David Čápka
gregormirek10:

:)
Chápu Vaše rozhořčení ITci :)

1.Jsem uplný začátěčník!
2.Jsem truhlář :) :)
3.Klidě zaplatím nějaký honorář za konzultaci,protože ,sice se chci naučit trochu programovat Arduino,ale primárně potřebuji rozchodit tuhle sr... abych mohl posílat NRPN data do /Efektu/
Jsem totiž tak trochu muzikant a proto to potřebuji tohle rozchodit.

Už mě poslal do řiti jeden Japonec ,co napsal ten kód,takže to hodím z okna a raději budu hrát:)

Editováno 12.3.2015 13:23
 
Nahoru Odpovědět 12.3.2015 13:20
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na gregormirek10
David Čápka:

U chyby máš napsané vždy číslo řádku a znak, který se mu nezdá :) O programování na Arduinu tu máme výukový seriál, můžeš i kontaktovat jeho autora, třeba ti nějakou tu konzultaci poskytne.

Nahoru Odpovědět 12.3.2015 13:34
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na Jan Vargovský
gregormirek10:

Ty chy se projevý už při napsání tohohle řádku.

if((outBuf[0] & 0xf0) ==(0xb0,0x50,0x7f)){//MIDI Output
Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět 12.3.2015 13:36
Avatar
gregormirek10:

Už nebudu otravovavat.
Chyby jsem opravil,ale ten kod nefunguje.
Díky moc za pomoc

 
Nahoru Odpovědět 12.3.2015 14:13
Avatar
Odpovídá na gregormirek10
Libor Šimo (libcosenior):

Ale veď neotravuješ.
Píšeš, že si chyby opravil, to znamená, že ti už žiadne nevypisuje?
Pri programovaní musíš mať trpezlivosť a niekedy veeeeľa hľadať. ;-)

Nahoru Odpovědět 12.3.2015 14:23
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Libor Šimo (libcosenior)
gregormirek10:

Nevypisuje už žádné chyby.
Pokud tam nechám starý kod tak funguje,ale po přidání Cc handle kodu nic.
Jsem trpělivý,hrabu se v tom už tři dny, opravdu cely dny, třeba 7-8 hodin.
Pročetl jsem už snad 100 sketchů na netu.Opravdu jsrm se tomu věnoval.
Nechci aby to vypadalo,že si napišu na fórum a někdo de chytne a vyřeší to.

 
Nahoru Odpovědět 12.3.2015 15:10
Avatar
Odpovídá na gregormirek10
Libor Šimo (libcosenior):

Tu je tutoriál: http://www.itnetwork.cz/…e-pc/arduino
Obráť sa na autora, verím, že ti poradí. ;-)

Nahoru Odpovědět 12.3.2015 15:22
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na gregormirek10
Martin Dráb:

No, tak si třeba nech vypsat (na COm port), jaká data ti přesně přijdou. Mi přijde, že taky zápasíš trochu s C/C++, což pak není zrovna dobrou volbou hrabat se v Arduinu či něčem, co se hůře ladí.

Nahoru Odpovědět 12.3.2015 16:08
2 + 2 = 5 for extremely large values of 2
Avatar
Odpovídá na Martin Dráb
gregormirek10:

Souhlasím.
Přiznávám,že mě to porazilo:)
Díky za reakce

 
Nahoru Odpovědět 12.3.2015 19:00
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 17 zpráv z 17.