804 lines
23 KiB
Python
804 lines
23 KiB
Python
#!/usr/bin/python3
|
|
# -*- coding: utf-8 -*-
|
|
|
|
'''
|
|
ScrollDisp
|
|
v0.7.0
|
|
|
|
An example of an unicornhat hack for Launchpad Mini or Bhoreal.
|
|
|
|
This is a custom version of scrolldisp.py that display text on unicornhat
|
|
with use of bhorunicornhat to use with a Bhoreal or a Launchpad mini mk2
|
|
|
|
Default device is the launchpad.
|
|
|
|
|
|
Command line to display 2 chars:
|
|
|
|
To display 'OK' :
|
|
python3 scrolldisp.py OK
|
|
|
|
To display a rainbow :
|
|
python3 scrolldisp.py ~R
|
|
|
|
See the end of this script for more option like scrolling or use a bhoreal in command line.
|
|
|
|
|
|
As a Library :
|
|
|
|
Display(text, color=(255,255,255), delay=0.2, mididest ='launchpad')
|
|
|
|
DisplayScroll(text, color=(255,255,255), delay=0.2, mididest = 'launchpad')
|
|
|
|
Remember there is Cls functions
|
|
launchpad.Cls()
|
|
bhoreal.Cls()
|
|
|
|
'''
|
|
|
|
#from unicorn_hat_sim import unicornhat as u
|
|
|
|
from . import bhorunicornhat as u
|
|
import time, math, sys
|
|
|
|
class ScrollDisp:
|
|
columns = []
|
|
mappings = {'!': [" ",
|
|
"#",
|
|
"#",
|
|
"#",
|
|
"#",
|
|
" ",
|
|
"#",
|
|
" "],
|
|
'\'': [" ",
|
|
"#",
|
|
"#",
|
|
" ",
|
|
" ",
|
|
" ",
|
|
" ",
|
|
" "],
|
|
'(': [" ",
|
|
" #",
|
|
"# ",
|
|
"# ",
|
|
"# ",
|
|
"# ",
|
|
" #",
|
|
" "],
|
|
')': [" ",
|
|
"# ",
|
|
" #",
|
|
" #",
|
|
" #",
|
|
" #",
|
|
"# ",
|
|
" "],
|
|
',': [" ",
|
|
" ",
|
|
" ",
|
|
" ",
|
|
" ",
|
|
" ",
|
|
" #",
|
|
"# "],
|
|
'-': [" ",
|
|
" ",
|
|
" ",
|
|
" ",
|
|
"###",
|
|
" ",
|
|
" ",
|
|
" "],
|
|
'.': [" ",
|
|
" ",
|
|
" ",
|
|
" ",
|
|
" ",
|
|
" ",
|
|
"#",
|
|
" "],
|
|
'0': [" ",
|
|
" ## ",
|
|
"# #",
|
|
"# #",
|
|
"# #",
|
|
"# #",
|
|
" ## ",
|
|
" "],
|
|
'1': [" ",
|
|
" # ",
|
|
"## ",
|
|
" # ",
|
|
" # ",
|
|
" # ",
|
|
"###",
|
|
" "],
|
|
'2': [" ",
|
|
" ## ",
|
|
"# #",
|
|
" #",
|
|
" # ",
|
|
" # ",
|
|
"####",
|
|
" "],
|
|
'3': [" ",
|
|
"####",
|
|
" #",
|
|
" # ",
|
|
" #",
|
|
"# #",
|
|
" ## ",
|
|
" "],
|
|
'4': [" ",
|
|
"# #",
|
|
"# #",
|
|
"####",
|
|
" #",
|
|
" #",
|
|
" #",
|
|
" "],
|
|
'5': [" ",
|
|
"####",
|
|
"# ",
|
|
"### ",
|
|
" #",
|
|
"# #",
|
|
" ## ",
|
|
" "],
|
|
'6': [" ",
|
|
" ## ",
|
|
"# ",
|
|
"### ",
|
|
"# #",
|
|
"# #",
|
|
" ## ",
|
|
" "],
|
|
'7': [" ",
|
|
"####",
|
|
" #",
|
|
" # ",
|
|
" # ",
|
|
" # ",
|
|
" # ",
|
|
" "],
|
|
'8': [" ",
|
|
" ## ",
|
|
"# #",
|
|
" ## ",
|
|
"# #",
|
|
"# #",
|
|
" ## ",
|
|
" "],
|
|
'9': [" ",
|
|
" ## ",
|
|
"# #",
|
|
" ###",
|
|
" #",
|
|
" #",
|
|
" ## ",
|
|
" "],
|
|
':': [" ",
|
|
" ",
|
|
" ",
|
|
"#",
|
|
" ",
|
|
" ",
|
|
"#",
|
|
" "],
|
|
'A': [" ",
|
|
" ## ",
|
|
"# #",
|
|
"# #",
|
|
"####",
|
|
"# #",
|
|
"# #",
|
|
" "],
|
|
'B': [" ",
|
|
"### ",
|
|
"# #",
|
|
"### ",
|
|
"# #",
|
|
"# #",
|
|
"### ",
|
|
" "],
|
|
'C': [" ",
|
|
" ## ",
|
|
"# #",
|
|
"# ",
|
|
"# ",
|
|
"# #",
|
|
" ## ",
|
|
" "],
|
|
'D': [" ",
|
|
"### ",
|
|
"# #",
|
|
"# #",
|
|
"# #",
|
|
"# #",
|
|
"### ",
|
|
" "],
|
|
'E': [" ",
|
|
"####",
|
|
"# ",
|
|
"### ",
|
|
"# ",
|
|
"# ",
|
|
"####",
|
|
" "],
|
|
'F': [" ",
|
|
"####",
|
|
"# ",
|
|
"### ",
|
|
"# ",
|
|
"# ",
|
|
"# ",
|
|
" "],
|
|
'G': [" ",
|
|
" ## ",
|
|
"# #",
|
|
"# ",
|
|
"# ##",
|
|
"# #",
|
|
" ## ",
|
|
" "],
|
|
'H': [" ",
|
|
"# #",
|
|
"# #",
|
|
"####",
|
|
"# #",
|
|
"# #",
|
|
"# #",
|
|
" "],
|
|
'I': [" ",
|
|
"###",
|
|
" # ",
|
|
" # ",
|
|
" # ",
|
|
" # ",
|
|
"###",
|
|
" "],
|
|
'J': [" ",
|
|
" ###",
|
|
" #",
|
|
" #",
|
|
" #",
|
|
"# #",
|
|
" ## ",
|
|
" "],
|
|
'K': [" ",
|
|
"# #",
|
|
"# # ",
|
|
"## ",
|
|
"## ",
|
|
"# # ",
|
|
"# #",
|
|
" "],
|
|
'L': [" ",
|
|
"# ",
|
|
"# ",
|
|
"# ",
|
|
"# ",
|
|
"# ",
|
|
"###",
|
|
" "],
|
|
'M': [" ",
|
|
"# #",
|
|
"####",
|
|
"# #",
|
|
"# #",
|
|
"# #",
|
|
"# #",
|
|
" "],
|
|
'N': [" ",
|
|
"# #",
|
|
"## #",
|
|
"# ##",
|
|
"# #",
|
|
"# #",
|
|
"# #",
|
|
" "],
|
|
'O': [" ",
|
|
" ## ",
|
|
"# #",
|
|
"# #",
|
|
"# #",
|
|
"# #",
|
|
" ## ",
|
|
" "],
|
|
'P': [" ",
|
|
"### ",
|
|
"# #",
|
|
"### ",
|
|
"# ",
|
|
"# ",
|
|
"# ",
|
|
" "],
|
|
'Q': [" ",
|
|
" ## ",
|
|
"# #",
|
|
"# #",
|
|
"# #",
|
|
"# # ",
|
|
" # #",
|
|
" "],
|
|
'R': [" ",
|
|
"### ",
|
|
"# #",
|
|
"### ",
|
|
"## ",
|
|
"# # ",
|
|
"# #",
|
|
" "],
|
|
'S': [" ",
|
|
" ###",
|
|
"# ",
|
|
" # ",
|
|
" # ",
|
|
" #",
|
|
"### ",
|
|
" "],
|
|
'T': [" ",
|
|
"#####",
|
|
" # ",
|
|
" # ",
|
|
" # ",
|
|
" # ",
|
|
" # ",
|
|
" "],
|
|
'U': [" ",
|
|
"# #",
|
|
"# #",
|
|
"# #",
|
|
"# #",
|
|
"# #",
|
|
" ## ",
|
|
" "],
|
|
'V': [" ",
|
|
"# # ",
|
|
"# # ",
|
|
"# # ",
|
|
"# # ",
|
|
"# # ",
|
|
" # ",
|
|
" "],
|
|
'W': [" ",
|
|
"# #",
|
|
"# #",
|
|
"# #",
|
|
"# # #",
|
|
"## ##",
|
|
"# #",
|
|
" "],
|
|
'X': [" ",
|
|
"# #",
|
|
"# #",
|
|
" # ",
|
|
" # ",
|
|
"# #",
|
|
"# #",
|
|
" "],
|
|
'Y': [" ",
|
|
"# #",
|
|
"# #",
|
|
"# #",
|
|
" # ",
|
|
" # ",
|
|
" # ",
|
|
" "],
|
|
'Z': [" ",
|
|
"####",
|
|
" #",
|
|
" # ",
|
|
" # ",
|
|
"# ",
|
|
"####",
|
|
" "],
|
|
'[': [" ",
|
|
"##",
|
|
"# ",
|
|
"# ",
|
|
"# ",
|
|
"# ",
|
|
"##",
|
|
" "],
|
|
']': [" ",
|
|
"##",
|
|
" #",
|
|
" #",
|
|
" #",
|
|
" #",
|
|
"##",
|
|
" "],
|
|
'_': [" ",
|
|
" ",
|
|
" ",
|
|
" ",
|
|
" ",
|
|
" ",
|
|
" ",
|
|
"####"],
|
|
'a': [" ",
|
|
" ",
|
|
" ## ",
|
|
" #",
|
|
" ###",
|
|
"# #",
|
|
" ###",
|
|
" "],
|
|
'b': [" ",
|
|
"# ",
|
|
"# ",
|
|
"### ",
|
|
"# #",
|
|
"# #",
|
|
"### ",
|
|
" "],
|
|
'c': [" ",
|
|
" ",
|
|
" ## ",
|
|
"# #",
|
|
"# ",
|
|
"# #",
|
|
" ## ",
|
|
" "],
|
|
'd': [" ",
|
|
" #",
|
|
" #",
|
|
" ###",
|
|
"# #",
|
|
"# #",
|
|
" ###",
|
|
" "],
|
|
'e': [" ",
|
|
" ",
|
|
" ## ",
|
|
"# #",
|
|
"####",
|
|
"# ",
|
|
" ## ",
|
|
" "],
|
|
'f': [" ",
|
|
" ## ",
|
|
"# #",
|
|
"# ",
|
|
"## ",
|
|
"# ",
|
|
"# ",
|
|
" "],
|
|
'g': [" ",
|
|
" ",
|
|
" ## ",
|
|
"# #",
|
|
" ###",
|
|
" #",
|
|
"### ",
|
|
" "],
|
|
'h': [" ",
|
|
"# ",
|
|
"# ",
|
|
"# # ",
|
|
"## #",
|
|
"# #",
|
|
"# #",
|
|
" "],
|
|
'i': [" ",
|
|
" # ",
|
|
" ",
|
|
"## ",
|
|
" # ",
|
|
" # ",
|
|
"###",
|
|
" "],
|
|
'j': [" ",
|
|
" #",
|
|
" ",
|
|
" #",
|
|
" #",
|
|
" #",
|
|
"# #",
|
|
" # "],
|
|
'k': [" ",
|
|
"# ",
|
|
"# #",
|
|
"# # ",
|
|
"## ",
|
|
"# # ",
|
|
"# #",
|
|
" "],
|
|
'l': [" ",
|
|
"## ",
|
|
" # ",
|
|
" # ",
|
|
" # ",
|
|
" # ",
|
|
"###",
|
|
" "],
|
|
'm': [" ",
|
|
" ",
|
|
"## # ",
|
|
"# # #",
|
|
"# #",
|
|
"# #",
|
|
"# #",
|
|
" "],
|
|
'n': [" ",
|
|
" ",
|
|
"### ",
|
|
"# #",
|
|
"# #",
|
|
"# #",
|
|
"# #",
|
|
" "],
|
|
'o': [" ",
|
|
" ",
|
|
" ## ",
|
|
"# #",
|
|
"# #",
|
|
"# #",
|
|
" ## ",
|
|
" "],
|
|
'p': [" ",
|
|
" ",
|
|
"### ",
|
|
"# #",
|
|
"# #",
|
|
"### ",
|
|
"# ",
|
|
"# "],
|
|
'q': [" ",
|
|
" ",
|
|
" ###",
|
|
"# #",
|
|
"# #",
|
|
" ###",
|
|
" #",
|
|
" #"],
|
|
'r': [" ",
|
|
" ",
|
|
"# ##",
|
|
"## ",
|
|
"# ",
|
|
"# ",
|
|
"# ",
|
|
" "],
|
|
's': [" ",
|
|
" ",
|
|
" ###",
|
|
"# ",
|
|
" ## ",
|
|
" #",
|
|
"### ",
|
|
" "],
|
|
't': [" ",
|
|
" # ",
|
|
"####",
|
|
" # ",
|
|
" # ",
|
|
" # ",
|
|
" ##",
|
|
" "],
|
|
'u': [" ",
|
|
" ",
|
|
"# #",
|
|
"# #",
|
|
"# #",
|
|
"# #",
|
|
" ## ",
|
|
" "],
|
|
'v': [" ",
|
|
" ",
|
|
"# #",
|
|
"# #",
|
|
" # # ",
|
|
" # # ",
|
|
" # ",
|
|
" "],
|
|
'w': [" ",
|
|
" ",
|
|
"# #",
|
|
"# #",
|
|
"# # #",
|
|
"# # #",
|
|
" # # ",
|
|
" "],
|
|
'x': [" ",
|
|
" ",
|
|
"# #",
|
|
"# #",
|
|
" ## ",
|
|
"# #",
|
|
"# #",
|
|
" "],
|
|
'y': [" ",
|
|
" ",
|
|
"# #",
|
|
"# #",
|
|
" ###",
|
|
" #",
|
|
"# #",
|
|
" ## "],
|
|
'z': [" ",
|
|
" ",
|
|
"####",
|
|
" # ",
|
|
" # ",
|
|
"# ",
|
|
"####",
|
|
" "]
|
|
}
|
|
sharpnotes = {
|
|
'A': [" #",
|
|
" ## ",
|
|
"# #",
|
|
"# #",
|
|
"####",
|
|
"# #",
|
|
"# #",
|
|
" "],
|
|
'C': [" #",
|
|
" ## ",
|
|
"# #",
|
|
"# ",
|
|
"# ",
|
|
"# #",
|
|
" ## ",
|
|
" "],
|
|
'D': [" #",
|
|
"### ",
|
|
"# #",
|
|
"# #",
|
|
"# #",
|
|
"# #",
|
|
"### ",
|
|
" "],
|
|
'F': [" #",
|
|
"### ",
|
|
"# ",
|
|
"### ",
|
|
"# ",
|
|
"# ",
|
|
"# ",
|
|
" "],
|
|
'G': [" #",
|
|
" ## ",
|
|
"# #",
|
|
"# ",
|
|
"# ##",
|
|
"# #",
|
|
" ## ",
|
|
" "]
|
|
}
|
|
def append_mapping(self, char, color):
|
|
#self.append_space()
|
|
bitmap = self.mappings[char]
|
|
n = len(bitmap[0])
|
|
for x in range(n):
|
|
self.columns.append([(color if bitmap[i][x] == '#' else (0,0,0)) for i in range(8)])
|
|
|
|
def append_rainbow(self):
|
|
for x in range(8):
|
|
r = int((math.cos(x * math.pi / 4) + 1) * 127)
|
|
g = int((math.cos((x - 8.0 / 3.0) * math.pi / 4) + 1) * 127)
|
|
b = int((math.cos((x + 8.0 / 3.0) * math.pi / 4) + 1) * 127)
|
|
self.columns.append([(r,g,b) for i in range(8)])
|
|
|
|
def append_space(self, n=1):
|
|
for x in range(n):
|
|
self.columns.append([(0,0,0) for i in range(8)])
|
|
|
|
def append_buffer(self):
|
|
self.append_space(9)
|
|
|
|
def append_letter(self, char, color=None):
|
|
if char == ' ':
|
|
self.append_space(2)
|
|
elif char == 0:
|
|
self.append_rainbow()
|
|
elif char in self.mappings.keys():
|
|
self.append_mapping(char, color)
|
|
else:
|
|
self.columns.append([(255,255,255),(255,255,255),(255,255,255),(255,255,255),(255,255,255),(255,255,255),(255,255,255),(255,255,255)])
|
|
print("unknown char {0} ({1})".format(char, ord(char)))
|
|
|
|
|
|
def append_sharpnote(self, text, color=(255,255,255)):
|
|
|
|
# Note
|
|
# Should be a better test for A-G letter.
|
|
if text[0] in self.mappings.keys():
|
|
bitmap = self.sharpnotes[text[0]]
|
|
|
|
n = len(bitmap[0])
|
|
for x in range(n):
|
|
self.columns.append([(color if bitmap[i][x] == '#' else (0,0,0)) for i in range(8)])
|
|
|
|
|
|
# Octave
|
|
if text[2] in self.mappings.keys():
|
|
self.append_letter(text[2], color)
|
|
|
|
|
|
def append_string(self, text, color=(255,255,255)):
|
|
i = 0
|
|
while i < len(text):
|
|
if text[i] == '~':
|
|
i += 1
|
|
if text[i] == 'R': #rainbow
|
|
self.append_letter(0)
|
|
else:
|
|
self.append_letter(text[i], color)
|
|
i += 1
|
|
|
|
def set_text(self, text, color=(255,255,255)):
|
|
self.columns = []
|
|
#self.append_buffer()
|
|
|
|
if len(text) == 3 and text[1] == "#":
|
|
self.append_sharpnote(text)
|
|
else:
|
|
self.append_string(text)
|
|
|
|
self.append_buffer()
|
|
|
|
def __init__(self, text=""):
|
|
self.set_text(text)
|
|
|
|
def start(self, delay=0.1):
|
|
|
|
u.set_pixels(self.columns[0:8])
|
|
u.show()
|
|
time.sleep(delay)
|
|
|
|
def startScroll(self, delay=0.1):
|
|
|
|
for x in range(len(self.columns) - 8):
|
|
u.set_pixels(self.columns[x:x+8])
|
|
u.show()
|
|
time.sleep(delay)
|
|
|
|
|
|
def Display(text, color=(255,255,255), delay=0.2, mididest ='launchpad'):
|
|
disp = ScrollDisp()
|
|
#print(text)
|
|
|
|
if mididest == 'bhoreal':
|
|
u.dest(mididest,180)
|
|
else:
|
|
u.dest(mididest,270)
|
|
|
|
disp.set_text(text, color)
|
|
disp.start(delay)
|
|
|
|
def DisplayScroll(text, color=(255,255,255), delay=0.2, mididest = 'launchpad'):
|
|
disp = ScrollDisp()
|
|
if mididest == 'bhoreal':
|
|
u.dest(mididest,180)
|
|
else:
|
|
u.dest(mididest,270)
|
|
disp.set_text(text, color)
|
|
disp.startScroll(delay)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
from libs import midi3
|
|
|
|
# Implemented for script compatibility but actually do nothing on supported devices
|
|
u.brightness(0.5)
|
|
|
|
# 2 chars with no scrolling
|
|
Display(' '.join(sys.argv[1:]))
|
|
|
|
|
|
# text with scrolling
|
|
# DisplayScroll(' '.join(sys.argv[1:]))
|
|
|
|
|
|
|
|
# To use with a Bhoreal just add mididest = 'bhoreal' in Display()
|
|
# or DisplayScroll()
|
|
|
|
# Display(' '.join(sys.argv[1:]), mididest = 'bhoreal')
|