Guest User

Untitled

a guest
Sep 9th, 2026
607
0
317 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.83 KB | None | 0 0
  1. #!/usr/bin/env python3
  2.  
  3. import sys
  4. import signal
  5. import jack
  6.  
  7.  
  8. # ============================================================
  9. # Einstellungen
  10. # ============================================================
  11.  
  12. CLIENT_NAME = "PC-to-CC"
  13. CC_NUMBER = 20
  14.  
  15. # Program Change -> CC value
  16. PC_MAPPING = {
  17.     0: 1,
  18.     1: 8,
  19.     2: 16,
  20.     3: 24,
  21.     4: 32,
  22.     5: 40,
  23.     6: 48,
  24.     7: 56,
  25.     8: 64,
  26.     9: 72,
  27.     10: 80,
  28.     11: 88,
  29.     12: 96,
  30.     13: 104,
  31.     14: 112,
  32.     15: 128,
  33.  
  34.  
  35.  
  36.  
  37. }
  38.  
  39.  
  40. # ============================================================
  41. # JACK Client erzeugen
  42. # ============================================================
  43.  
  44. client = jack.Client(CLIENT_NAME)
  45.  
  46. midi_in = client.midi_inports.register("MIDI-In")
  47. midi_out = client.midi_outports.register("MIDI-Out")
  48.  
  49.  
  50. # ============================================================
  51. # MIDI-Verarbeitung
  52. # ============================================================
  53.  
  54. @client.set_process_callback
  55. def process(frames):
  56.  
  57.     # JACK MIDI-Ausgabepuffer für diesen Zyklus leeren
  58.     midi_out.clear_buffer()
  59.  
  60.     # Eingehende MIDI-Events lesen
  61.     for offset, data in midi_in.incoming_midi_events():
  62.  
  63.         data = bytes(data)
  64.  
  65.         # Program Change = 0xC0 ... 0xCF
  66.         if len(data) >= 2 and (data[0] & 0xF0) == 0xC0:
  67.  
  68.             channel = data[0] & 0x0F
  69.             program = data[1]
  70.  
  71.             # Ist dieser PC gemappt?
  72.             if program not in PC_MAPPING:
  73.                 continue
  74.  
  75.             cc_value = PC_MAPPING[program]
  76.  
  77.             # Control Change = 0xB0 ... 0xBF
  78.             cc_message = bytes([
  79.                 0xB0 | channel,
  80.                 CC_NUMBER,
  81.                 cc_value
  82.             ])
  83.  
  84.             midi_out.write_midi_event(
  85.                 offset,
  86.                 cc_message
  87.             )
  88.  
  89.  
  90. # ============================================================
  91. # JACK Shutdown
  92. # ============================================================
  93.  
  94. @client.set_shutdown_callback
  95. def shutdown(status, reason):
  96.     print()
  97.     print("JACK wurde beendet.")
  98.     sys.exit(0)
  99.  
  100.  
  101. # ============================================================
  102. # Start
  103. # ============================================================
  104.  
  105. print()
  106. print("================================")
  107. print(" PC-to-CC")
  108. print("================================")
  109. print()
  110.  
  111. print()
  112. print("JACK Client:")
  113. print("  PC-to-CC")
  114. print()
  115. print("MIDI Ports:")
  116. print("  PC-to-CC:MIDI-In")
  117. print("  PC-to-CC:MIDI-Out")
  118. print()
  119. print("Ctrl+C zum Beenden.")
  120. print()
  121.  
  122. try:
  123.     client.activate()
  124.  
  125. except jack.JackError as e:
  126.     print("Fehler beim Starten von JACK:")
  127.     print(e)
  128.     sys.exit(1)
  129.  
  130.  
  131. try:
  132.     signal.pause()
  133.  
  134. except KeyboardInterrupt:
  135.     print()
  136.     print("Beende PC-to-CC ...")
  137.  
  138. finally:
  139.     client.deactivate()
  140.     client.close()
  141.  
Advertisement
Add Comment
Please, Sign In to add comment