Midi: Velocity aendern

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Micki
User
Beiträge: 34
Registriert: Freitag 20. März 2020, 09:17

Hallo Forum,

ich moechte in einer eingehenden MIDO-Message den Velocity-Wert aendern, sodass am Ausgang der Wert kleiner ist. Am besten ueber einen Faktor.
Ich habe versucht im main-part ein msgneu zu definieren, ist mir aber nicht gelungen.
Habt ihr eine Idee?

Das ist mein Rumpf-Programm:

Code: Alles auswählen

import time
from collections import deque
import mido
from mido import Message

mido.get_input_names()
mido.get_output_names()
mido.backends.rtmidi

inport = mido.open_input('Impulse:Impulse MIDI 1 20:0')
outport = mido.open_output('E-MU Xmidi 2x2 MIDI 1')

msglog = deque()
echo_delay = 0
velocity = 64

while True:

    msg = inport.receive()
    msglog.append({"msg": msg, "due": time.time() + echo_delay})
    print(msg)
    outport.send(msglog.popleft()["msg"])
    
    
Liebe Gruesse
Norbert
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Micki: Ich habe da ein deja vu — die ersten drei Zeilen nach den Importen sind sinnfrei und die `deque` auch immer noch, denn Du machst damit ja nichts ausser einen Wert in einem Wörterbuch verpackt da rein zu stecken und dann sofort wieder raus zu holen. Ohne den zusätzlichen Wert in dem Wörterbuch zu verwenden. Warum machst Du das?

Letztlich ist das äquivalent zu dem hier:

Code: Alles auswählen

#!/usr/bin/env python3
import mido


def main():
    with mido.open_input("Impulse:Impulse MIDI 1 20:0") as inport:
        with mido.open_output("E-MU Xmidi 2x2 MIDI 1") as outport:
            while True:
                message = inport.receive()
                print(message)
                outport.send(message)


if __name__ == "__main__":
    main()
Wenn Du den Velocity-Wert einer Nachricht ändern willst, dann musst Du halt genau das machen. Der ist bei den entsprechenden Nachrichten ja als Attribut vorhanden und kann sowohl abgefragt als auch gesetzt werden. Also abfragen, mit Faktor multiplizieren, in ganze Zahl wandeln, und wieder setzen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Micki
User
Beiträge: 34
Registriert: Freitag 20. März 2020, 09:17

Hi Blackjack,

das mit der depue hab ich gemacht, um erstmal zu empfangen und die 3 Zeilen hab ich geschrieben, damit der Raspi rtst mal weiß, wo r hingucken soll. Aber ok, da hab ich was gelernt.

Was du weiter schreibst, habe ich ja versucht, hat aber nicht geklappt. Es wäre unheimlich toll, wenn du das ergänzen könntest, damit ich die veränderten Werte senden kann. 💐🌈
Micki
User
Beiträge: 34
Registriert: Freitag 20. März 2020, 09:17

@BlackJack,
ich habe weiter geforscht und habe eine neue Version. Da du immer gute Tipps hast, wuerde ich dich bitten, einmal darueber zu schauen. Bestimmt gibt es noch was zu verbessern.

Beste Gruess
Micki

Code: Alles auswählen

#!/usr/bin/env python3
import mido
velo = 64
faktor = 0.9

def main():
    with mido.open_input("Impulse:Impulse MIDI 1 20:0") as inport:
        with mido.open_output("E-MU Xmidi 2x2 MIDI 1") as outport:
            while True:
                message = inport.receive()
                if message.type == 'note_on':
                    velo = int(message.velocity*faktor)
                    messneu = mido.Message(type=message.type, note=message.note, channel=message.channel, velocity=velo)
                    outport.send(messneu)
                
                else:
                    outport.send(message)


if __name__ == "__main__":
    main()
[ /code]
__deets__
User
Beiträge: 14537
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn du statt der Zuweisung an messneu einfach wieder an message zuweist, kannst du dir den else-Zweig sparen, und einfach immer outport.send(message) machen. Und eigentlich ist die ganze Fallunterscheidung sinnlos, denn mir waere nicht ein einziger Fall bekannt, bei der eine Note-Off eine Velocity ungleich 0 gehabt haette. Was soll das auch aussagen? Tatsaechlich ist es sogar so, dass ein Note-On mit Velocity 0 als Note-Off interpretiert wird, weil viele Geraete das so ausgeben. Das folgt dem Standard.

https://www.midi.org/forum/228-writing- ... ty-note-on

Und wie der Koelner sagt: "Dreimol Null es Null es Null. Denn mer woren en d'r Kayjass en d'r Schull"

Warum nennst du deine Variable "Fahrrad auf schweizerisch"? Warum nicht "velocity"?

Da faktor eine Konstante ist, sollte es auch gross geschrieben werden. Und die hart-kodierten Strings zum oeffnen der Devices sind auch ein Fall fuer Konstanten, die man auf die Modulebene zieht.
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

`velo=64` wird nirgends benutzt und kann weg. Was da neu gemessen wird, habe ich nicht verstanden, von daher sind Abkürzungen nur ein ewiger Quell von Misverständnissen.
Micki
User
Beiträge: 34
Registriert: Freitag 20. März 2020, 09:17

@Sirius:
Danke für deine Antwort.

Es werden ja nicht nur note on/off Signale gesendet, sondern auch Controller-, SysEx- und Programchange-Daten, deren Werte nicht verändert werden (sollen). Note_Off-Befehle haben nicht immer die Velocity 0. Das wird von modernen Klangerzeuger auch genutzt. Aber wenn du einen besseren Vorschlag hast, würde ich mich über ein paar Scriptzeilen freuen.

Den Default-Wert für velo habe ich gesetzt, weil ich schonmal eine Fehlermeldung (not defined) erhalten habe. Aber das werde ich gleich testen.

messneu (neue message, nicht neuer Messwert 😂) habe ich verwendet, weil ich über print gecheckt habe, was die Inhalte (zB von message) sind. Ich will ja den gleichen Kanal, den gleichen Typ, die gleiche Note aber die veränderte Velocity senden. Und das klappt. Wenn ich den Begriff "Velocity" als Variable verwende, bekomme ich Verwirrungen mit der Velocity als Attribut von message = input.receive.

Nur mit message zu arbeiten werde ich auch gleich nochmal testen.

Vielen Dank für deine Hinweise!
Micki
User
Beiträge: 34
Registriert: Freitag 20. März 2020, 09:17

@Sirius:
👍💐 klappt alles ! DANKE !
Antworten