[enh] clitools : adds a color redilysis filter
This commit is contained in:
parent
b0c28e1510
commit
a06e3ba07e
186
clitools/filters/redilysis_colors.py
Normal file
186
clitools/filters/redilysis_colors.py
Normal file
@ -0,0 +1,186 @@
|
|||||||
|
|
||||||
|
#!/usr/bin/python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# -*- mode: Python -*-
|
||||||
|
|
||||||
|
|
||||||
|
'''
|
||||||
|
|
||||||
|
redilysis colors
|
||||||
|
v0.1.0
|
||||||
|
|
||||||
|
A complex effect that depends on redis keys for audio analysis
|
||||||
|
|
||||||
|
see https://git.interhacker.space/teamlase/redilysis for more informations
|
||||||
|
about the redilysis project
|
||||||
|
|
||||||
|
LICENCE : CC
|
||||||
|
|
||||||
|
by cocoa
|
||||||
|
|
||||||
|
|
||||||
|
'''
|
||||||
|
from __future__ import print_function
|
||||||
|
import argparse
|
||||||
|
import ast
|
||||||
|
import os
|
||||||
|
import math
|
||||||
|
import random
|
||||||
|
import redis
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
name = "filters::redilysis_colors"
|
||||||
|
|
||||||
|
def debug(*args, **kwargs):
|
||||||
|
if( verbose == False ):
|
||||||
|
return
|
||||||
|
print(*args, file=sys.stderr, **kwargs)
|
||||||
|
def msNow():
|
||||||
|
return time.time()
|
||||||
|
|
||||||
|
# The list of available modes => redis keys each requires to run
|
||||||
|
oModeList = {
|
||||||
|
}
|
||||||
|
|
||||||
|
def rgb2int(rgb):
|
||||||
|
return int('0x%02x%02x%02x' % tuple(rgb),0)
|
||||||
|
|
||||||
|
def int2rgb(intcode):
|
||||||
|
#hexcode = hex(intcode)[2:]
|
||||||
|
hexcode = '{0:06X}'.format(intcode)
|
||||||
|
return tuple(int(hexcode[i:i+2], 16) for i in (0, 2, 4))
|
||||||
|
#return tuple(map(ord,hexcode[1:].decode('hex')))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
CHAOS = 1
|
||||||
|
REDIS_FREQ = 100
|
||||||
|
|
||||||
|
# General Args
|
||||||
|
argsparser = argparse.ArgumentParser(description="Redilysis filter")
|
||||||
|
argsparser.add_argument("-f","--fps",help="Frame Per Second",default=30,type=int)
|
||||||
|
argsparser.add_argument("-v","--verbose",action="store_true",help="Verbose")
|
||||||
|
# Redis Args
|
||||||
|
argsparser.add_argument("-i","--ip",help="IP address of the Redis server ",default="127.0.0.1",type=str)
|
||||||
|
argsparser.add_argument("-p","--port",help="Port of the Redis server ",default="6379",type=str)
|
||||||
|
argsparser.add_argument("-s","--redis-freq",help="Query Redis every x (in milliseconds). Default:{}".format(REDIS_FREQ),default=REDIS_FREQ,type=int)
|
||||||
|
# Modes And Common Modes Parameters
|
||||||
|
#argsparser.add_argument("-m","--modelist",required=False,help="Comma separated list of modes to use from: {}".format("i, ".join(oModeList.keys())),type=str)
|
||||||
|
argsparser.add_argument("-c","--chaos",help="How much disorder to bring. High value = More chaos. Default {}".format(CHAOS), default=CHAOS, type=float)
|
||||||
|
|
||||||
|
args = argsparser.parse_args()
|
||||||
|
fps = args.fps
|
||||||
|
ip = args.ip
|
||||||
|
port = args.port
|
||||||
|
redisFreq = args.redis_freq / 1000
|
||||||
|
verbose = args.verbose
|
||||||
|
chaos = float(args.chaos)
|
||||||
|
optimal_looptime = 1 / fps
|
||||||
|
|
||||||
|
max_width = 800
|
||||||
|
max_height = 800
|
||||||
|
|
||||||
|
redisKeys = ["rms","spectrum_10","spectrum_120"]
|
||||||
|
|
||||||
|
debug(name,"Redis Keys:{}".format(redisKeys))
|
||||||
|
redisData = {}
|
||||||
|
redisLastHit = msNow() - 99999
|
||||||
|
r = redis.Redis(
|
||||||
|
host=ip,
|
||||||
|
port=port)
|
||||||
|
|
||||||
|
|
||||||
|
def refreshRedis():
|
||||||
|
global redisData
|
||||||
|
for key in redisKeys:
|
||||||
|
try:
|
||||||
|
redisData[key] = ast.literal_eval(r.get(key).decode('ascii'))
|
||||||
|
except :
|
||||||
|
debug("Error when reading redis key '{}".format(key))
|
||||||
|
|
||||||
|
def gauss(x, mu, sigma):
|
||||||
|
return( math.exp(-math.pow((x-mu),2)/(2*math.pow(sigma,2))/math.sqrt(2*math.pi*math.pow(sigma,2))))
|
||||||
|
|
||||||
|
|
||||||
|
spect10Correct = [
|
||||||
|
|
||||||
|
6.0,
|
||||||
|
1.5,
|
||||||
|
1.0,
|
||||||
|
1.0,
|
||||||
|
1.0,
|
||||||
|
1.0,
|
||||||
|
1.0,
|
||||||
|
0.8,
|
||||||
|
0.6,
|
||||||
|
0.5,
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
def default( pl ):
|
||||||
|
global redisData
|
||||||
|
spect = redisData["spectrum_10"]
|
||||||
|
debug(name, "spect:{}".format(spect))
|
||||||
|
new_list = []
|
||||||
|
|
||||||
|
# We want to color points that are on left and right when high is strong
|
||||||
|
# i.e. the farther the distance from spectrum, the higher notes have influence
|
||||||
|
# power = 0-1
|
||||||
|
# x = 800 spec[2]= 6.0 spec[7]=0.0 power=0.0
|
||||||
|
# x = 0 spec[2]= 6.0 spec[7]=0.0 power=0.0
|
||||||
|
# x = 0 spec[2]= 1.0 spec[7]=0.5 power=1.0
|
||||||
|
|
||||||
|
# dist 0 = 1
|
||||||
|
# 400 - 400 : maxW/2 -x
|
||||||
|
# 399 = -1 : x - 400
|
||||||
|
# 401 = 1
|
||||||
|
# x = 400 spec[2]= 6.0 spec[7]=0.0 power=1.0
|
||||||
|
# x = 400 spec[2]= 1.0 spec[7]=0.5 power=0.0
|
||||||
|
|
||||||
|
for i, point in enumerate(pl):
|
||||||
|
ocolor = pl[i][2]
|
||||||
|
if ocolor == 0 :
|
||||||
|
new_list.append(point)
|
||||||
|
continue
|
||||||
|
colorTuple = int2rgb(ocolor)
|
||||||
|
x = point[0]
|
||||||
|
dist = abs(x - max_width/2)
|
||||||
|
key = int(2* dist / max_width * 8)
|
||||||
|
power = spect[key] / spect10Correct[key] * chaos
|
||||||
|
color = []
|
||||||
|
for i in colorTuple:
|
||||||
|
new_color = int(i * power)
|
||||||
|
if new_color > 255 :
|
||||||
|
new_color = 255
|
||||||
|
if new_color < 0 :
|
||||||
|
new_color = 0
|
||||||
|
color.append( new_color )
|
||||||
|
color = rgb2int(tuple(color))
|
||||||
|
|
||||||
|
point[2] = color
|
||||||
|
new_list.append(point)
|
||||||
|
#debug(name,"x:{}\t dist:{}\t key:{}\t power:{}\t ocolor:{}\t color:{}".format(point[0], dist, key,power, ocolor, pl[i][2]))
|
||||||
|
debug( name,"rms_noise output:{}".format(new_list))
|
||||||
|
return new_list
|
||||||
|
|
||||||
|
|
||||||
|
try:
|
||||||
|
while True:
|
||||||
|
refreshRedis()
|
||||||
|
start = time.time()
|
||||||
|
line = sys.stdin.readline()
|
||||||
|
if line == "":
|
||||||
|
time.sleep(0.01)
|
||||||
|
line = line.rstrip('\n')
|
||||||
|
pointsList = ast.literal_eval(line)
|
||||||
|
# Do the filter
|
||||||
|
pointsList = default(pointsList)
|
||||||
|
print( pointsList, flush=True )
|
||||||
|
looptime = time.time() - start
|
||||||
|
# debug(name+" looptime:"+str(looptime))
|
||||||
|
if( looptime < optimal_looptime ):
|
||||||
|
time.sleep( optimal_looptime - looptime)
|
||||||
|
# debug(name+" micro sleep:"+str( optimal_looptime - looptime))
|
||||||
|
except EOFError:
|
||||||
|
debug(name+" break")# no more information
|
||||||
|
|
Loading…
Reference in New Issue
Block a user