Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
gregormirek10:11.3.2015 9:47

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
Tvůrce
Avatar
Martin Dráb:11.3.2015 22:12

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:11.3.2015 22:34

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:11.3.2015 22:43

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
Tvůrce
Avatar
Odpovídá na gregormirek10
Martin Dráb:11.3.2015 23:07

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:12.3.2015 12:02

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ý
Tvůrce
Avatar
Odpovídá na gregormirek10
Jan Vargovský:12.3.2015 12:26

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

 
Nahoru Odpovědět
12.3.2015 12:26
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na gregormirek10
David Hartinger:12.3.2015 12:35

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
You are the greatest project you will ever work on.
Avatar
Odpovídá na David Hartinger
gregormirek10:12.3.2015 13:20

:)
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 Hartinger
Vlastník
Avatar
Odpovídá na gregormirek10
David Hartinger:12.3.2015 13:34

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
You are the greatest project you will ever work on.
Avatar
Odpovídá na Jan Vargovský
gregormirek10:12.3.2015 13:36

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:12.3.2015 14:13

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):12.3.2015 14:23

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:12.3.2015 15:10

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):12.3.2015 15:22

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
Tvůrce
Avatar
Odpovídá na gregormirek10
Martin Dráb:12.3.2015 16:08

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:12.3.2015 19:00

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

 
Nahoru Odpovědět
12.3.2015 19:00
Avatar
Odpovídá na gregormirek10
Uplnej Vypatlanec:4.4.2017 13:39

jestli to vy rostaci nebude tim, ze dys testujete prikaz CC, tak mate test na rovnost 0xb0 chacha, co takhle 0xC0 ?! u //CC received ?!

podekuj tomu joudovi ze zacatku, vsici to vopisujete, a me stacilo 5 vterin

spravne if ( ( outBuf[0] & 0xF0 ) == 0xC0 )

tak zas nekdy

 
Nahoru Odpovědět
4.4.2017 13:39
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 18 zpráv z 18.