Bautagebuch: Midifizierung Orgelpedal

  • Seite 2 von 2
05.04.2024 23:18
#16
avatar

Ja der flush ist wirklich noch drinnen. In dem Kontext ist das aber nicht so relevant. Mit zwei Beinen wirst du es nicht hinbekommen zu viele Ereignisse zu generieren. Auf einem Manual ist das viel problematischer. Aber danke für den Hinweis. Ich werde es entfernen.

Der Delay ist recht willkürlich gewählt, hat sich bei mir vom Gefühl bewährt. Das simuliert eine gewisse Trägheit. Ich hatte es auch einmal mit einem zufälligen Delay. Erstaunlich wie man Millisekunden dich spüren kann beim Spielen.

Naja und das nächste Projekt ist die Überarbeitung des Oberteil, da dieser nicht mehr zum Pedal passt... Ob ich den alten anpasse oder etwas simples neu baue weiß ich noch nicht... Aber das ist eben die unendliche Geschichte...


 Antworten

 Beitrag melden
06.04.2024 09:55
#17
So

Der Delay hält dir aber das komplette Programm an. Wenn du z.B. Doppelpedal spielst erklingen die Töne im Abstand von 100ms, weil die Verarbeitung des nächsten Tastendrucks angehalten wird. Je nachdem, was der Arduino noch so machen kann, ist er für die Zeit des Delays gelähmt. Ich habe für etwas vergleichbares daher mit millis() gearbeitet. Man setzt also bei Tastendruck einen Zeitstempel und überprüft anschließend im Loop wann die Bedingungen (Zeitverzögerung) stimmen. Dann erst wird im Loop die NoteOn-Funktion ausgelöst. Das habe ich sowohl für die Simulation eines "pneumatischen" Schwellers, als auch einer elektropneumatischen Register-/Setzeranlage.


 Antworten

 Beitrag melden
06.04.2024 10:43
#18
avatar

Hattest du den Code irgendwann man hochgeladen? Ich würde mir deine Lösung gerne mal anschauen wie du es gemacht hast.


 Antworten

 Beitrag melden
06.04.2024 11:05
#19
So

Hier mein momentan eingesetztes Setting. Der Code ist in Teilen alt, würde ich heute anders machen, wenn ich von Grund auf neu anfangen würde. Aber solange es tut, gab es keinen Grund, es zu ändern. Ignorier bitte den Midi-Flush.

Da es bei mir nur zwei Fuß-/Daumenpistons (sind parallel geschaltet) betrifft, habe ich es nicht generisch gelöst. Willst du das für die gesamte Klaviatur, wäre natürlich ein anderer Code schöner und übersichtlicher. Wobei mir da die Original-Verzögerung der Sample Sets reicht. Bei der Spieltraktur wollte ich mir keine Pneumatik installieren

Diese Art der Implementierung habe ich gemacht, weil diese Fußpistons über den Arduino laufen, auf dem auch die Pedaltasten hängen. Mir war klar, dass es sich stört, habe es aber trotzdem mal mit Delay probiert. Und da war es schon massiv. Gleichzeitiges Pedalspiel und mal schnell Setzer weiterdrücken ging nicht. Gut, ich habe da auch mit 150ms, und dann 175ms gearbeitet, aber das ist von deinen 100ms auch nicht so weit weg. Das merkt man schon.

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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
 
#include "MIDIUSB.h"
 

int delaypiston = 175; //Verzögerung in Millisekunden, die die Fußpistons haben sollen
int currentmillisPistonOn = 0;
int midikey88on = 0;
int midikey89on = 0;
 

 
/** Funktionen für MIDI ***************************************************/
void noteOn(byte channel, byte pitch, byte velocity) {
midiEventPacket_t noteOn = { 0x09, 0x90 | channel, pitch, velocity };
MidiUSB.sendMIDI(noteOn);
}
 
void noteOff(byte channel, byte pitch, byte velocity) {
midiEventPacket_t noteOff = { 0x08, 0x80 | channel, pitch, velocity };
MidiUSB.sendMIDI(noteOff);
}
 
bool MidiButton(int pin, byte midisig, bool keyAlt) { //Button-Pin, Noten-Nummer
bool key = digitalRead(pin);
if (midisig == 88) {
if (keyAlt == HIGH && key == LOW) {
keyAlt = key;
midikey88on = 1;
currentmillisPistonOn = millis();
return keyAlt;
}
if (keyAlt == LOW && key == HIGH) {
keyAlt = key;
return keyAlt;
}
}
if (midisig == 89) {
if (keyAlt == HIGH && key == LOW) {
keyAlt = key;
midikey89on = 1;
currentmillisPistonOn = millis();
return keyAlt;
}
if (keyAlt == LOW && key == HIGH) {
keyAlt = key;
return keyAlt;
}
}
 
else {
if (keyAlt == HIGH && key == LOW) {
noteOn(0, midisig, 64);
MidiUSB.flush();
keyAlt = key;
delay(10);
return keyAlt;
}
 
if (keyAlt == LOW && key == HIGH) {
noteOff(0, midisig, 64);
MidiUSB.flush();
keyAlt = key;
delay(10);
return keyAlt;
}
}
}
 
void sendControlChange(byte channel, byte controller, byte value) {
midiEventPacket_t event = { 0x0B, 0xB0 | channel, controller, value };
MidiUSB.sendMIDI(event);
}
 
/****************************************************************************/
 

void setup() {
Serial.begin(115200); //Muss ggf. auskommentiert werden, wenn 0 und 1 belegt
pinMode(A0, INPUT_PULLUP);
pinMode(A1, INPUT_PULLUP);
 
}
 
void loop() {
 
//####Sequenzer vor und zurück############
key88Alt = MidiButton(A0, 88, key88Alt);
key89Alt = MidiButton(A1, 89, key89Alt);
 
if (millis() - currentmillisPistonOn >= delaypiston) { //diese Verzögerung imitiert eine elektropneumatische Setzeranlage, ohne das Programm via delay zu stoppen
if (midikey88on == 1) {
noteOn(0, 88, 64);
MidiUSB.flush();
midikey88on = 0;
delay(10);
noteOff(0, 88, 64);
MidiUSB.flush();
}
if (midikey89on == 1) {
noteOn(0, 89, 64);
MidiUSB.flush();
midikey89on = 0;
delay(10);
noteOff(0, 89, 64);
MidiUSB.flush();
}
}
}
 

 


 Antworten

 Beitrag melden
06.04.2024 11:37
#20
avatar

Danke, das ist eine gute Lösung.

Zitat von Soubasse im Beitrag #19
Hier mein momentan eingesetztes Setting. Der Code ist in Teilen alt, würde ich heute anders machen, wenn ich von Grund auf neu anfangen würde. Aber solange es tut, gab es keinen Grund, es zu ändern.

Never Change a running System kennen wir doch alle :) Der Wille etwas zu verbessern ist da, aber die Angst etwas, dass funktioniert kaputt zu machen ist größer :)

Ich experimentiere gerade mit einer Fassung, die Bounce2 nutzt. Einfach einen Button für jede Taste erstellen, dann im Loop die Tasten durchgehen. Gab es eine Änderung, dann bei Gedrückt NoteOn bei losgelassen NoteOFF. Der Code wird dadurch halbiert und man muss sich um nichts wie entprellen kümmern. Nachteil ist eben, wenn in der Bibliothek etwas fehlerhaft ist, dann ist man aufgeschmissen und natürlich auch abhängig von dieser.


 Antworten

 Beitrag melden
07.04.2024 13:00 (zuletzt bearbeitet: 07.04.2024 13:03)
#21
avatar

Nun ist es ja so gekommen, wie es kommen musste. Man baut einmal alles um und stolpert über ein Problem, welches die ganze Zeit da war, aber nicht aufgefallen ist.

Da ich inzwischen Sweelinq nutze, habe ich meine 40 Schalter einmal mit Sweelinq verbunden um endlich wieder ohne Display spielen zu können. Dabei musste ich aber feststellen dass einige Register sich ständige aktiviert und deaktiviert haben. Also habe ich mir die Midi Ausgabe einmal angesehen und was Sweelinq tut ist korrekt, was der Pi Pico tut hingegen nicht. Das Programm war augenscheinlich okay und dieses Zucken trat nur bei bestimmten Kombinationen auf.

Dann ist mir ein kleines Detail aufgefallen in meiner Schaltung. Ich nutze als Grundlage eine alte Platine eines Manuals, da hier bereits alle Dioden und so weiter enthalten waren und ich nur noch meine Kabel anlöten musste. Ich hatte das ganze fälschlich als 8x8 Matrix interpretiert, angeschlossen und programmiert. Es handelt sich jedoch um eine 8x5 Matrix. Die beiden anderen Pins sind zwar auch mit Schaltern verbunden, haben aber eine andere Funktion dir von dem Gerät aus dem die Platine kommt genutzt wird. Das lief jetzt auf einem Arduino so zwei Jahre ohne Probleme, auf meinem Pi Pico mit GrandOrgue ist es nicht aufgefallen (vermutlich weil GO es nicht so schnell umgesetzt hat)... Naja irgendwann fällt einem eben alles mal auf die Füße. Das war auch ein guter Zeitpunkt einmal die Steuerung neu zu schreiben :)

Warum das Problem auf meinem Arduino nicht aufgefallen ist, kann ich mir aber tatsächlich nicht erklären. Vermutlich weil ich die Matrix in einer Schleife so abgefragt habe, dass es keine Auswirkungen hatte. Die Keypad Funktion von Adafruit zum abfragen einer Matrix schein diese wohl anders abzufragen, so dass in jedem Durchgang zwei widersprüchliche Zustände ermittelt wurden und jedes Event dann gesondert gesendet wurde...

Bild entfernt (keine Rechte)


 Antworten

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