Pages: 1 2 3 [4] 5   Go Down
Author Topic: Poti an analogen Pin als MIDI ausgeben  (Read 6195 times)
0 Members and 1 Guest are viewing this topic.
WW
Offline Offline
Jr. Member
**
Karma: 0
Posts: 59
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Woher kannst du diesen ganzen Stuff? Hast du das gelernt oder hast du beruflich damit zu tun?
Nein und nein.
Ich bin über Umwege und durch 'Zufall' vor ungefähr 4 Jahren über den Arduino gestolpert und bin einfach sehr begeistert von der ganze Sache, Hardware, IDE und vor allem der Idee dahinter.
Arduino macht alle, wenn sie bereit sind etwas Schweiß zu investieren, zu "Ingenieuren". Die Lernkurve ist nicht wirklich steil und es macht einfach Spaß.
Deshalb habe ich die ganze Zeit versucht Dich dazu zu bringen, daß Du Dich mehr damit beschäftigst. Du wirst eine Menge Spaß mit dem Arduino haben, da bin ich mir ziemlich sicher, und nebenbei wirst Du einiges lernen. smiley-wink

Es gibt ein Zitat von Kung-tse (bei uns auch Konfuzius genannt) das sehr schön zum ganzen Projekt 'Arduino' passt:

Was du mir sagst, das vergesse ich.
Was du mir zeigst, daran erinnere ich mich.
Was du mich tun lässt, das verstehe ich.

Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 54
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ja das ist wirklich ein zutreffendes Zitat. Mir macht diese ganze Sache viel Spaß es kostet mich natürlich unheimlich viel Nerven, da ich mehr der Typ bin der mit dem Kopf durch die Wand will. Ja ich denke auch das das eine Tolle Sache ist mit dem Arduino man kann so einiges damit anstellen.

Klar denke ich mir "da hast du dir als Einsteiger aber viel vorgenommen" aber ich denke alles ist machbar wenn wann es will.

Ich finde es ganz gut nicht alles vorgekaut zu bekommen und an dieser Stelle nochmals vielen Dank für den Support.

Eine Frage habe ich im Moment aber noch:

Wenn ich das Mux Breakout benutze, dann benötige ich weiterhin das Serial_Midi_Converter oder? Wenn ich habe das MuxShield benutze brauche ich dieses Tool nicht mehr?

Grüße
AK-NAK47
Logged

WW
Offline Offline
Jr. Member
**
Karma: 0
Posts: 59
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Doch Du brauchst das Tool weiterhin, die Mux-Hardware hat doch nichts mit der Kommunikation zw. Arduino und Computer/Ableton Live zu tun.
An der Software kommst Du nur mit einem MIDI-zu-USB-Adapter vorbei, was natürlich nur geht, wenn der Arduino über MIDI-Hardware verfügt.

http://www.thomann.de/de/midi-interfaces.html
http://www.musikhaus-korn.de/de/MIDI-USB-1X1-INTERFACE-Kabel.html
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 54
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das heisst wenn ich einen Mux verwende und das Tool nicht benutzen will benötige ich ein Midi / USB Interface.

Ich weiss nicht ob du das Gerät Arduinome kennst, da kommen die Signale allerding über die Digitalen Eingänge des Arduinos. Ich denke das macht den Unterschied.
Logged

WW
Offline Offline
Jr. Member
**
Karma: 0
Posts: 59
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hab mir Arduinome mal kurz angeschaut. OK, sie schicken Daten über USB, was aber hängt am anderen Ende? Also was läuft auf dem Computer an dem das Teil hängt.
Ob die Daten von den digitalen I/Os oder den analogen PINs kommen ist aber für die Kommunikation wieder egal.
« Last Edit: March 23, 2012, 04:01:17 pm by mime » Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 54
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ja da hast du recht um ein Arduinome mit eine Software wie Abelton laufen zu lassen benötigt man das tool arduinome serial, ich gehe jetzt davon aus das hinter dieser exe datei bzw. diesem tool selbiges wie beim midi_converter verbirgt, oder zumindest etwas sehr ähnliches.

Logged

WW
Offline Offline
Jr. Member
**
Karma: 0
Posts: 59
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Es gäbe noch die Möglichkeit, wenn Du einen Uno hast, den 8U2 mit einer MIDI-Firmware zu flashen.
http://arduino.cc/playground/Main/InterfacingWithHardware#USB
Da sind gleich zwei und hier noch eine:
http://hunt.net.nz/users/darran/weblog/52882/Arduino_UNO_MIDI_USB_version_02.html
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 54
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ja das könnte unter umständen funktionieren.
Da das duemilanove sowieso abdankt könnte man auch auf das von dir genannte uno board setzen. Das sieht vielversprechend aus und ich benötige kein zusatz tool.
Logged

WW
Offline Offline
Jr. Member
**
Karma: 0
Posts: 59
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bedenke aber, daß Du den Uno dann nicht mehr über die IDE/USB programmieren kannst. Du musst dann jedesmal den 8U2 flashen, oder den M328 über ISCP statt USB flashen. Und Du brauchst natürlich einen Programmer.
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 54
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich sehe schon, irgendwas ist immer.  smiley

Ich brauch da ne möglichst simple lösung für die idee...! Zumindest eine die für mich machbar ist.
Logged

WW
Offline Offline
Jr. Member
**
Karma: 0
Posts: 59
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Für die Entwicklung kannst Du das Programm ja weiter verwenden, oder ist das so schlimm? Und wenn alles fertig ist, flasht Du den 8U2 auf MIDI und brauchst es nicht mehr.
« Last Edit: March 23, 2012, 07:49:14 pm by mime » Logged

WW
Offline Offline
Jr. Member
**
Karma: 0
Posts: 59
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich hab noch mal am Code gewerkelt.
* Kanal dann doch wieder 0 - 15
* Funktion um MIDI Nachricht zu senden
* Vordefinierte Konstanten für einiges, was man so senden kann

Code:
/* Variablen */
byte volume, lastVolume, balance, lastBalance;
byte channel = 0;     // Hier Kanal festlegen (0 - 15)
int threshold = 2;

/* MIDI Nachrichten */
/* Status Bytes = erstes Byte */
const byte polyphonicAftertouch = 0xA0;
const byte controlChange = 0xB0;
const byte programChange = 0xC0;
const byte channelAftertouch = 0xD0;
const byte pitchWheelControl = 0xE0;
/* Ein-Byte-Nachrichten */
const byte midiStart = 0xFA;       
const byte midiContinue = 0xFB;
const byte midiStop = 0xFC;

/* Daten Bytes = zweites Byte */
const byte ccChannelVolume = 0x07;  // Control change channel volume
const byte ccBalance = 0x08;        // Control change balance

/* Pinbelegung */
const int volumePot = A0;   // Poti für die Lautstärke
const int balancePot = A1;  // Poti für die Balance

void setup() {
  Serial.begin(38400);      // MIDI Baud-Rate 31250
}

void loop(){
/* Lies und sende Lautstärke */
  volume = knobFunction(volumePot);
  if(volume != lastVolume) {
    lastVolume = volume;
    //Serial.print("volume: ");
    //Serial.println(volume);
    sendMidiMessage(controlChange, ccChannelVolume, volume);
  }
/* Lies und sende Balance */
  balance = knobFunction(balancePot);
  if(balance != lastBalance) {
    lastBalance = balance;
    //Serial.print("balance: ");
    //Serial.println(balance);
   sendMidiMessage(controlChange, ccBalance, balance);   
   }
}

/* Funktionen */
int knobFunction(const int pin)
{
  static int prevRead[6] = {0, 0, 0, 0, 0, 0};   
  int output = analogRead(pin)/8;    
  if (abs(output - prevRead[0])  >= threshold)
    {prevRead[pin] = output;}
  else
    {output = prevRead[pin];}
  return output;
}

void sendMidiMessage (byte statusByte, byte dataByte, byte valueByte ) {
  Serial.write(statusByte + channel);
  Serial.write(dataByte);
  Serial.write(valueByte);
}
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 54
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hi mime,

konnte bislang nicht den code ausprobieren, sieht aber edel aus.  smiley
Morge das erste was ich nach der Arbeit ausprobieren werde. Coole Sache.

Hast du sonst irgendwas mit Musik zu tun?

Grüße
Ak-Nak47

Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 54
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,

habe jetzt 6 potis angeschlossen, wollte den Code ändern so dass auf jeden Poti "ccChannelVolume" gesetzt wird. Irgendwie nimmt er das aber nicht...!

Der gegebene Code sieht folgendermaßen aus:

Code:
/* Pinbelegung */
const int volumePot = A0;   // Poti für die Lautstärke
const int balancePot = A1;  // Poti für die Balance

Nun müsste ich wenn ich jeden Poti als "volumePot" haben will den Code do so ändern:

Code:
/* Pinbelegung */
const int volumePot = A0;   // Poti für die Lautstärke
const int volumePot= A1;  // Poti für die 2 Lautstärke

oder wenn es möglich ist:

Code:
/* Pinbelegung */
const int volumePot = A0;A1;A2; ...   // Poti für die Lautstärke

Oder bin ich verkehrt?


Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
Code:
/* Pinbelegung */
const int volumePot = A0;   // Poti für die Lautstärke
const int volumePot= A1;  // Poti für die 2 Lautstärke

oder wenn es möglich ist:

Code:

/* Pinbelegung */
const int volumePot = A0;A1;A2; ...   // Poti für die Lautstärke
So geht es leider nicht. "VolumePot" ist eine Variable, also ein Platzhalter für EINEN Wert.
Eigentlich stehen die Werte A0 und A1 ... nur für bestimmte Pin-Nummern des Arduino.
Was Du machst ist folgendes:

1) Merke Dir, das volumePot für das erste analog Pin steht.
2) Merke Dir, das volumePot für das zweite analog Pin steht
...
Was soll sich Dein Programm denn nun merken? Das erste oder das zweite Pin?

Du kannst entweder ein Array nehmen:
Code:
int volumePot[3]= { A0 , A1, A2};
//zugriff über index des array - achtung zählung beginnz bei 0
... analogRead(volumePot[0]);
...  analogRead(volumePot[1]);
...  analogRead(volumePot[2]);

oder Du definierst Dir 3 verschiedene Variablen
Code:
int volumePot1= A1;
int volumePot2= A2;
int volumePot3= A3;
//zugriff über einzelne Variable
... analogRead(volumePot1);
...  analogRead(volumePot2);
...  analogRead(volumePot3);
Logged

Pages: 1 2 3 [4] 5   Go Up
Jump to: