Midifizierung eines pneumatischen Spieltisches

  • Seite 10 von 10
17.02.2025 23:14
avatar  Montre
#136
avatar

Gibt es im Arduino keine Interrupts, in denen man Tasten-Ereignisse verarbeiten kann? Dann könnte man sich die Abfrage-Schleifen sparen.


 Antworten

 Beitrag melden
17.02.2025 23:37 (zuletzt bearbeitet: 17.02.2025 23:39)
#137
avatar

Zitat von Montre im Beitrag #136
Gibt es im Arduino keine Interrupts, in denen man Tasten-Ereignisse verarbeiten kann? Dann könnte man sich die Abfrage-Schleifen sparen.

Das sollte ohne Probleme gehen. https://docs.arduino.cc/language-referen...ttachInterrupt/

Aber für eine Matrix abfragen wäre es ja Quatsch, vielleicht sogar unbrauchbar. Ich selbst habe noch nie damit gearbeitet, aber zum Auslesen der Matrix muss ich ohnehin die Pins schalten in einer Schleife und wenn dann auf Pin 4 ein Interrupt erfasst wird, dann weiß ich ja nicht welcher Zeilentreiber gerade dann aktiv geschaltet war. Zusätzlich braucht das Schalten ohnehin einen Moment. Dann ist eine Abfrage nach dem Zustand kein großer Mehraufwand mehr. Solche Interrupts sind meines Wissens nach eher für Zeitkritische Dinge sinnvoll, wo auf keinen Fall eine Information verloren gehen darf. Beispiel Drehzahl messen. Da wäre es fatal, wenn das Programm gerade mal ein Signal verpasst.


 Antworten

 Beitrag melden
18.02.2025 18:17
avatar  Montre
#138
avatar

Zitat von Christian_Hofmann im Beitrag #137
Solche Interrupts sind meines Wissens nach eher für Zeitkritische Dinge sinnvoll, wo auf keinen Fall eine Information verloren gehen darf

Zum Beispiel beim Orgel spielen?

Ich bin der Meinung, wenn keine Tasten gedrückt wird, dann braucht der Arduino auch nichts machen. Wenn ein Ereignis anliegt, dann kann man ja den vorgestellten Code verwenden.


 Antworten

 Beitrag melden
18.02.2025 20:48
avatar  Bkoeln
#139
avatar

Hallo zusammen,
ja ich weiß es gibt Arduinos mit mehr Pins und USB Anschluss direkt. Hab auch noch einen Mega 2450 runliegen.
Als gebürtiger und aufgewachsener Schwabe reizt es mich halt zu sehen , was ich in den kleinen billigen Nano-Clon so reinkriege. Die entwickelten Programme laufen ja mit kleinen Anpassungen dann auch auf den größeren Arduinos. Was da letztendlich zum Einsatz kommt weiß ich auch noch nicht genau.
Heute habe ich erstmal Elektronikteile bestellt.
Als nächstes will ich ich sehen wie ich die Analogen Eingänge für Schweller-Walze etc. Einbauen kann.
Bis dann und einen schönen Abend


 Antworten

 Beitrag melden
18.02.2025 20:53
#140
So

Ich habe vor kurzem etwas mit dem Pro Micro herumexperimentiert. Das ist ein auf dem Arduino Micro basierender Klon, nur noch etwas kleiner. Der ist auf 5V-Basis (besser für analoge Anwendungen, als 3,3V) und kann trotzdem MIDI-USB. Das Ding könnte man gut für eine standalone Pedal-Midifizierung inkl. Schwellpedalen verwenden. Der hat genau 12 I/O Pins für eine 8x4 Matrix und dann noch eine Handvoll analoge Eingänge.


 Antworten

 Beitrag melden
19.02.2025 00:28
avatar  Bkoeln
#141
avatar

Welchen Code muss man Midi denn geben für einen analogen Wert? Habt ihr das vorgesehen bei euch?


 Antworten

 Beitrag melden
19.02.2025 17:52
#142
So

Den Analog-Pin muss als Input deklariert sein. Dann kannst du ihn mit Analogread auslesen. Bei der Hardware-Verkabelung musst du je nach Arduino die 3,3V oder 5V auf den Poti des Schwellers geben und den Ausgang des Potis an den Analog-Pin. Dort wird dann gemessen, wieviel von den max. möglichen 3,3V/5V noch ankommen. Das wird in einen Wert zwischen 0 und 1023 übersetzt, den du in eine Variable schreibst. Zumindest gehe ich mit diesem Zwischenschritt vor. Ich glaube man kann diesen und den folgenden auch zusammenfassen. Aber diese Optimierungsfummelei überlasse ich anderen.

Als nächstes musst du den 0...1023 Wert in 0...127 für MIDI übersetzen bzw. mappen. Vorher solltest du mittels seriellem Monitor herausfinden, was die Max- und Min-Werte deines Schwellers sind. Bei mir ist das je Schwellpedal anders, z.B. 80 als unterer Wert (statt 0) und 930 als oberer (statt 1023). Dann mappe ich halt, mit etwas Puffer, 80 auf 0 und 930 auf 127.

Danach MIDI-Sendebefehl.

Ich habe bei mir noch eine Spielerei eingebaut. Die Pfeifenorgel an der ich regelmäßig spiele hat einen pneumatischen Schwellkasten. Bei Schwelltritt-Betätigung bläst sich ein kleiner Balg auf und betätigt die Jalousie. Dadurch geht das alles etwas schwammig und verzögert. Aber so kenne ich es halt und mag es auch. Das habe ich mir im Code nachgebaut. Sprich mit dem Schwelltritt gibt man quasi einen Zielwert vor, und das Programm schleppt dann in der MIDI-Umsetzung etwas nach.

Probiere es gern aus und behalte oder verwirf es :-)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
 
#include <MIDI.h>
 
//MIDI_CREATE_DEFAULT_INSTANCE(); //für Arduino Due
MIDI_CREATE_INSTANCE(HardwareSerial, Serial1, MIDI); //für Arduino MEGA Ports 18 und 19 (0 und 1 wären Standard, spielen bei USB-Anschluss Benutzung jedoch verrückt)
 
//################################################
//###########Pins und Variablen Schweller#########
//################################################
int pinSW = A12;
int analogPinSW = 12;
//ggf. für weitere Schweller analog ergänzen
 
//Variablen Schweller allgemein
const unsigned long repeat = 50; // Zeit in ms, die gewartet wird, bis die Schweller-Schleife erneut durchläuft
int PotT = 40; //Entprellwert Schweller
int channel;
int controller = 11; //Controller Nummer, 11=Expression Pedal
int value;
 
//Variablen Schweller SW
int MapSW;
int LastMapSW = 127; //ganz auf
unsigned long lastrepeatSW; // gespeicherte millis-Zeit des letzten Schweller-Durchlaufs
int DiffMapSW = 4; //Differenzwert zwischen Ist und Soll, ab dem keine weitere Schweller-Bewegung mehr stattfindet, quasi Entprellwert
int DiffSW = 5; //Wert, um den der MIDI-Wert beim Schweller addiert/subtrahiert wird
 
//ggf. für weitere Schweller analog ergänzen
 
int CCchanOW = 3; //Kanal 3 für Schweller OW
int CCchanSW = 4; //Kanal 4 für Schweller SW
int CCchanCW = 5; //Kanal 5 für Schweller CW
 
void setup() {
 
MIDI.begin(MIDI_CHANNEL_OMNI); // Initialize the Midi Library.
MIDI.turnThruOff();
 
pinMode(pinOW, INPUT);
pinMode(pinSW, INPUT);
pinMode(pinCW, INPUT);
}
 
void loop() {
 
//#####Schweller-Werte auslesen und mappen#####
 
//Schweller III.. Manual (Schwellwerk)
int CurSW = analogRead(analogPinSW);
if (CurSW > 930) CurSW = 930;
if (CurSW < 80) CurSW = 80;
MapSW = map(CurSW, 80, 930, 0, 127);
 

//#####Schweller-Werte als MIDI senden#####
 

//einfache Variante
MIDI.sendControlChange(controller, MapSW, CCchanSW)
 

//entprellte, einfache Variante
if (abs(MapSW - LastMapSW) >= DiffMapSW) { //Entprellen bzgl. Bewegungsdifferenz, damit nicht beim kleinen Antippen der Schweller sofort bewegt wird
MIDI.sendControlChange(controller, LastMapSW, CCchanSW); // Set the value of controller 10 on channel 0 to 65
}
 

 
//entprellte, "pneumatische" Variante
if (abs(MapSW - LastMapSW) >= DiffMapSW) { //Bewegungsdifferenz
if (millis() - lastrepeatSW >= repeat) { //Verlangsamung des MIDI-Sende-Intervalls
if (MapSW < LastMapSW) { //für Schweller schließen
LastMapSW = LastMapSW - DiffSW; //neuer Ziel-MIDI-Wert wird nicht mit einem Schlag, sondern schrittweise erreicht, d.h. schleppt hinterher
if (LastMapSW < 0) LastMapSW = 0;
if (abs(MapSW - LastMapSW) <= DiffMapSW) LastMapSW = MapSW;
MIDI.sendControlChange(controller, LastMapSW, CCchanSW); // Set the value of controller 10 on channel 0 to 65
}
if (MapSW > LastMapSW) { //für Schweller wieder öffnen
LastMapSW = LastMapSW + DiffSW;
if (LastMapSW > 127) LastMapSW = 127;
if (abs(MapSW - LastMapSW) <= DiffMapSW) LastMapSW = MapSW;
MIDI.sendControlChange(controller, LastMapSW, CCchanSW); // Set the value of controller 10 on channel 0 to 65
}
lastrepeatSW = millis();
}
}
 
}
 


 Antworten

 Beitrag melden
19.02.2025 20:36
avatar  Bkoeln
#143
avatar

Vielen Dank,
in der Zwischenzeit bin ich auch ne Runde schlauer geworden.
Der elektrische Anschluss der Potis ist ja üblich.
Man sendet Hex B + Kanal, 07 für Lautstärke und den Wert zwischen 0-127. Dazu komme ich durch Division durch 8.
An meiner Orgel sind die einzelnen Potis auf veschieden Kanäle aufgeteilt sodass die Software das unterscheiden kann.
Bei Grand Orgue kann man problemlos den Range der WErte mit erfassen, sodass im Programm keine Rücksicht auf die Maximal- und Minimalwerte genommen werden muss, das macht man einfach bei der Registrierung der Potis.
Einen schönen Abend noch
Bernd


 Antworten

 Beitrag melden
19.02.2025 22:20
#144
So

Ich nutze 11 Expression Pedal, statt 07 Volume.

Bzgl. Erfassen der Range. Du kannst die "Auflösung" des Schwelltritts halt verbessern, wenn du die 0-127 auf die tatsächlichen Werte aufteilst. Ansonsten hast du ggf. nur MIDI 20-105, die dann von GO oer HW in 0-127 "übersetzt" werden.


 Antworten

 Beitrag melden
26.02.2025 15:11
avatar  Bkoeln
#145
avatar

Das ist in der Tat eine wichtiger Aspekt den ich noch nicht bedacht habe.
In der Zwischenzeit habe ich meinem Nano beigebracht Analoge WErte zu erfassen und als MiDi zu senden.
Gerade hat der Praxistest funktioniert.
Gruß
Bernd


 Antworten

 Beitrag melden
Bereits Mitglied?
Jetzt anmelden!
Mitglied werden?
Jetzt registrieren!