apcmini.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. #! /usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. """
  4. SPDX-License-Identifier: GPL-2.0-only
  5. (c) micha@librelight.de
  6. """
  7. import sys
  8. sys.stdout.write("\x1b]2;APCmini\x07")
  9. import os
  10. sys.path.append(os.getcwd() + '/..')
  11. import time
  12. import socket, struct
  13. import random
  14. import lib.chat as chat
  15. if 0:
  16. # z.b. Windows
  17. # 10 MB RAM
  18. from interfaces.midi.lib.pygamemidi_wraper import pygamemidi
  19. midi = pygamemidi(out=2,inp=3)
  20. else:
  21. # 4 MB RAM , only tested on linux
  22. import lib.simplemidi_wraper as smidi
  23. device = smidi.list_device(filter="APC_MINI")
  24. _id = device[-1][-1]
  25. midi = smidi.simplemidi("/dev/snd/midiC{}D0".format(_id) ) #,inp="/dev/midi1")
  26. cli = None
  27. class dummyChat():
  28. def __init__(self):
  29. pass
  30. def send(self,*arg,**args):
  31. print("dummyChat",self,arg,args)
  32. #c = chat.tcp_sender()
  33. c = dummyChat()
  34. def send(msg):
  35. print("send",msg)
  36. c.send(msg)
  37. BLACK = 0
  38. YELLOW = 5
  39. YELLOW_BLINK = 6
  40. GREEN = 1
  41. GREEN_BLINK = 2
  42. RED = 3
  43. RED_BLINK = 4
  44. def main():
  45. release = 0
  46. if 0:
  47. r = 225
  48. for i in range(4):
  49. for i in range(r):
  50. print(i)
  51. midi.write([144,40+i,GREEN])
  52. time.sleep(0.2)
  53. for i in range(r):
  54. print(i)
  55. midi.write([144,40+i,BLACK])
  56. time.sleep(0.2)
  57. for i in range(r):
  58. print(i)
  59. midi.write([144,40+i,RED])
  60. time.sleep(1.52)
  61. for i in range(r):
  62. print(i)
  63. midi.write([144,60+i,BLACK])
  64. time.sleep(0.5)
  65. while True:
  66. if release:
  67. release = 0
  68. for i in range(4):
  69. midi.write([144,60+i,YELLOW])
  70. midi.write([144,52+i,YELLOW])
  71. midi.write([144,44+i,YELLOW])
  72. midi.write([144,36+i,YELLOW])
  73. midi.write([144,24+i,RED])
  74. midi.write([144,24+i+4,RED])
  75. midi.write([144,56+i,GREEN])
  76. midi.write([144,8+i,GREEN])
  77. midi.write([144,12+i,GREEN])
  78. #midi.write([144,82,YELLOW])
  79. #time.sleep(.5)
  80. #midi.write([144,82,BLACK])
  81. rows = [56,48,40,32,24,16,8,0,64,48]
  82. midi_function = {
  83. "Off": (128,144),
  84. "On ":(144,160),
  85. "PLY":(160,176),
  86. "CC ":(176,192),
  87. "PC ":(192,208),
  88. "CA ":(208,223),
  89. "QtrFrame":(241,242),
  90. "tclock":(248,249),
  91. }
  92. # cut byte
  93. # x=174;((x)^(x>>4<<4))
  94. # int(bin(151)[-4:],2)+1
  95. #nibl = x=174;((x)^(x>>4<<4))
  96. #nibl = int(bin(151)[-4:],2)+1
  97. ch = -123
  98. if midi.poll():
  99. midi_date = midi.read(1)
  100. #print("MIDI",midi_date)
  101. if 1:# midi_date[0] >= 128 midi_date[0] <= 143:
  102. ch = int(bin(midi_date[0])[-4:],2)+1
  103. for fn,v in midi_function.items():
  104. if midi_date[0] >= v[0] and midi_date[0] < v[1]:
  105. FN = fn
  106. break
  107. r_old = 0
  108. row = 0
  109. for r in rows:
  110. #print(r_old,r)
  111. if r_old and midi_date[1] >= r_old and midi_date[1] < r:
  112. row = midi_data[1] - r+1
  113. print("jo")
  114. r_old=r
  115. nibl = int(bin(midi_date[1])[2:][-4:],2)+1
  116. _bin2 = bin(midi_date[1])
  117. _bin2 = _bin2[2:]
  118. _bin2 = _bin2.rjust(8,"0")
  119. _bin2 = int(_bin2[1:5],2)
  120. _bin = bin(midi_date[1])
  121. _bin = _bin[2:]
  122. _bin = _bin.rjust(8,"0")
  123. _bin = _bin[-3:] # 3 bit
  124. value = ""
  125. btn = int(midi_date[1]) #btn_row*btn_col
  126. if FN == "CC ":
  127. _bin2 =str(int(_bin2)+1000)
  128. value = midi_date[-1]
  129. btn += 1000
  130. if FN == "On ":
  131. value = 1
  132. midi.write([144,midi_date[1],YELLOW])
  133. if FN == "Off":
  134. value = 0
  135. release = 1
  136. midi.write([144,midi_date[1],BLACK])
  137. btn_row = int(_bin2)+1
  138. btn_col =int(_bin,2)+1
  139. #print(row,"in:",FN,"ch",ch,"raw",midi_date,_bin,btn_row,btn_col,[value])
  140. #print([btn_row,btn_col,btn,value])
  141. print([btn,value])
  142. main()
  143. node = 244
  144. node2 = 0
  145. while 1:
  146. inp = raw_input("end")
  147. try:
  148. inp = inp.split(" ")
  149. midi.write(inp)
  150. midi.write(inp)
  151. except:pass