Szintetizátor+ARDUINO(Usb)+Pc

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
Avatar
nyitraitomi
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2010. július 17. szombat, 6:00

Szintetizátor+ARDUINO(Usb)+Pc

Hozzászólás Szerző: nyitraitomi »

Sziasztok!

Egy régi szintetizátort szeretnék "felturbózni" arduinoval, úgy hogy az egy használható midibillentyűzet legyen.
Tehát adott egy 61 billentyűs szintetizátor aminek a billentyűzetét használom fel.
Adott az arduino. Adott a pc megfelelő szoftverekkel, hogy az arduinot midi billentyűzetnek lássa. Mivel az interneten nem igazán találtam kielégítő magyarázatot rá akkor most itt kérdeznék.
Milyen módon tudom a leggyorsabban beolvasni egy 8x8 -as mátrixbillentyűzet állapotát? Mindenfelé shift regisztereket alkalmaznak, de nem lenne gyorsabb enélkül? Illetve tud valaki erre példát?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Szintetizátor+ARDUINO(Usb)+Pc

Hozzászólás Szerző: Robert »

8x8-as mátrix az AVR 2 portja kellene. Az alapelv: mint a 4x4 billmátrix. Amúgy a shiftregiszter tényleg a gyorsabb.
AVR-ből akkor a Leonardo lenne?
Avatar
nyitraitomi
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2010. július 17. szombat, 6:00

Re: Szintetizátor+ARDUINO(Usb)+Pc

Hozzászólás Szerző: nyitraitomi »

Avr dunio/r3
Egyébként beszereztem már a 74HC595 -ös shift-regisztereket, és úgynézki működik. A mátrix viszont ha minden igaz 6x11. A billentyűzetre még nem kötöttem rá, az lesz a következő lépés. Majd a végeredményről beszámolok, mert szerintem lesz még néhány buktató.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Szintetizátor+ARDUINO(Usb)+Pc

Hozzászólás Szerző: Robert »

Így csak soros-midi lesz. Nem natív USB-s direktmidi....
Avatar
nyitraitomi
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2010. július 17. szombat, 6:00

Re: Szintetizátor+ARDUINO(Usb)+Pc

Hozzászólás Szerző: nyitraitomi »

Értem. Illetve nem mert nem tudom pontosan mi a különbség. Akkor ez hogyan működik vagy hol lehet információt találni róla? Annyira már működik most, hogy szól a számítógépen, de azért lenne mit faragni a több billentyű egyszerre lenyomás terén.
Avatar
nyitraitomi
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2010. július 17. szombat, 6:00

Re: Szintetizátor+ARDUINO(Usb)+Pc

Hozzászólás Szerző: nyitraitomi »

Igazából most az a gondom, hogy késik a hang. Hogyan tudom kideríteni, hogy mi okozhatja ezt? Arduino, vagy a számítógép szoftverei?
Avatar
nyitraitomi
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2010. július 17. szombat, 6:00

Re: Szintetizátor+ARDUINO(Usb)+Pc

Hozzászólás Szerző: nyitraitomi »

Ez fut az arduinón
https://github.com/evankale/ArduinoMidi ... PullUp.ino

Kód: Egész kijelölése

 #define NUM_ROWS 6
#define NUM_COLS 11

#define NOTE_ON_CMD 0x90
#define NOTE_OFF_CMD 0x80
#define NOTE_VELOCITY 127

//MIDI baud rate
#define SERIAL_RATE 31250

// Pin Definitions

// Row input pins
const int row1Pin = 2;
const int row2Pin = 3;
const int row3Pin = 4;
const int row4Pin = 5;
const int row5Pin = 6;
const int row6Pin = 7;

// 74HC595 pins
const int dataPin = 8;
const int latchPin = 9;
const int clockPin = 10;

boolean keyPressed[NUM_ROWS][NUM_COLS];
uint8_t keyToMidiMap[NUM_ROWS][NUM_COLS];

// bitmasks for scanning columns
int bits[] =
{ 
  B11111110,
  B11111101,
  B11111011,
  B11110111,
  B11101111,
  B11011111,
  B10111111,
  B01111111
};

void setup()
{
  int note = 31;

  for(int colCtr = 0; colCtr < NUM_COLS; ++colCtr)
  {
    for(int rowCtr = 0; rowCtr < NUM_ROWS; ++rowCtr)
    {
      keyPressed[rowCtr][colCtr] = false;
      keyToMidiMap[rowCtr][colCtr] = note;
      note++;
    }
  }

  // setup pins output/input mode
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(latchPin, OUTPUT);

  pinMode(row1Pin, INPUT);
  pinMode(row2Pin, INPUT);
  pinMode(row3Pin, INPUT);
  pinMode(row4Pin, INPUT);
  pinMode(row5Pin, INPUT);
  pinMode(row6Pin, INPUT);

  Serial.begin(SERIAL_RATE);
}

void loop()
{
  for (int colCtr = 0; colCtr < NUM_COLS; ++colCtr)
  {
    //scan next column
    scanColumn(colCtr);

    //get row values at this column
    int rowValue[NUM_ROWS];
    rowValue[0] = !digitalRead(row1Pin);
    rowValue[1] = !digitalRead(row2Pin);
    rowValue[2] = !digitalRead(row3Pin);
    rowValue[3] = !digitalRead(row4Pin);
    rowValue[4] = !digitalRead(row5Pin);
    rowValue[5] = !digitalRead(row6Pin);

    // process keys pressed
    for(int rowCtr=0; rowCtr<NUM_ROWS; ++rowCtr)
    {
      if(rowValue[rowCtr] != 0 && !keyPressed[rowCtr][colCtr])
      {
        keyPressed[rowCtr][colCtr] = true;
        noteOn(rowCtr,colCtr);
      }
    }

    // process keys released
    for(int rowCtr=0; rowCtr<NUM_ROWS; ++rowCtr)
    {
      if(rowValue[rowCtr] == 0 && keyPressed[rowCtr][colCtr])
      {
        keyPressed[rowCtr][colCtr] = false;
        noteOff(rowCtr,colCtr);
      }
    }
  }
}

void scanColumn(int colNum)
{
  digitalWrite(latchPin, LOW);

  if(0 <= colNum && colNum <= 7)
  {
    shiftOut(dataPin, clockPin, MSBFIRST, B11111111); //right sr
    shiftOut(dataPin, clockPin, MSBFIRST, bits[colNum]); //left sr
  }
  else
  {
    shiftOut(dataPin, clockPin, MSBFIRST, bits[colNum-8]); //right sr
    shiftOut(dataPin, clockPin, MSBFIRST, B11111111); //left sr
  }
  digitalWrite(latchPin, HIGH);
}

void noteOn(int row, int col)
{
  Serial.write(NOTE_ON_CMD);
  Serial.write(keyToMidiMap[row][col]);
  Serial.write(NOTE_VELOCITY);
}

void noteOff(int row, int col)
{
  Serial.write(NOTE_OFF_CMD);
  Serial.write(keyToMidiMap[row][col]);
  Serial.write(NOTE_VELOCITY);
Ez így jó?
Usb-n megy az adat.
Avatar
nyitraitomi
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2010. július 17. szombat, 6:00

Re: Szintetizátor+ARDUINO(Usb)+Pc

Hozzászólás Szerző: nyitraitomi »

Nos gyakorlatilag teljesen tökéletesen működik.
A hangkártya volt a ludas, amit ASIO -val meghajtva a 500-600 ms-os késés max 3 ms lett.
Amint időhöz jutok leírom ide a legelejétől a végéig.
Avatar
nyitraitomi
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2010. július 17. szombat, 6:00

Re: Szintetizátor+ARDUINO(Usb)+Pc

Hozzászólás Szerző: nyitraitomi »

Nos ez alapján indultam el: http://www.youtube.com/watch?v=lXX8v-ZW6Tk
Annyi külömbséggel, hogy én nem használtam midi csatlakozót, hiszen az arduino már amúgy is küldi az adatokat az usb-n a pc-re. Virtuális midi kábel szoftver(hairless midiserial(bemenetként az arduino sorosportját kell beállítani)+loop midi(midi portok)+virtuális szintetizátor(pl.: Fl Studio).
Ha késik a hang akkor ASIO4All nagyon fontos! A buffer méretet addíg kell csökkenteni, amíg elfogadható lesz a hang késése. Ha nagyon kicsire állítjuk elveszhet a polifónia.
Sok sikert!
dckillman
Biztosítékgyilkos
Hozzászólások: 61
Csatlakozott: 2013. október 7. hétfő, 11:23

Re: Szintetizátor+ARDUINO(Usb)+Pc

Hozzászólás Szerző: dckillman »

Sziasztok.

Próbálok midi szintit összehozni ez alapján.
http://www.instructables.com/id/Arduino ... /?ALLSTEPS

A problémám az hogy midi parancsként több hangot küld azaz egy leütés alapján több midi hang kerül rögzítésre a gépen.
Pl.A0 bemenetre van kötve a piezo.Ha megütöm a piezzot akkor nem csak az 57 hang kerül rögzítésre hanem több hang is.így neház felvenni használható dallamot.

Hogyan lehet ezt megoldani?

Köszönöm a segítséget
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Szintetizátor+ARDUINO(Usb)+Pc

Hozzászólás Szerző: Robert »

Nem lehet hogy rezonálnak a holmik és a többi hangot is leütésnek veszi?
dckillman
Biztosítékgyilkos
Hozzászólások: 61
Csatlakozott: 2013. október 7. hétfő, 11:23

Re: Szintetizátor+ARDUINO(Usb)+Pc

Hozzászólás Szerző: dckillman »

Egy piezo van csak használatban .mindentől függetlenül(levegőben van).
dckillman
Biztosítékgyilkos
Hozzászólások: 61
Csatlakozott: 2013. október 7. hétfő, 11:23

Re: Szintetizátor+ARDUINO(Usb)+Pc

Hozzászólás Szerző: dckillman »

Kicsit off de a szinti része ez is.
Ennek a felforrasztása kábelesre során ügyelni kell valamire?Hogyan kell szakszerűen?

http://www.hestore.hu/prod_10034292.html
Válasz küldése