miredis/libs/alink.py

141 lines
3.0 KiB
Python

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# -*- mode: Python -*-
'''
alink v0.2
Ableton Link bridge to OSC & Redis
LICENCE : CC
Sam Neurohack
Needs link.cpython library. Comes with some precompiled libraries.
To build it :
git clone --recursive https://github.com/gonzaloflirt/link-python.git
Make sure python 3 is installed on your system.
mkdir build
cd build
cmake ..
cmake --build .
'''
from libs import midix
import sys
prevphase = 0
bpm = 120
def Start():
global lnk
from libs import link
print("Link ENABLED")
lnk = link.Link(120)
lnk.enabled = True
lnk.startStopSyncEnabled = True
linked = True
def RedOSC(tempo_str, beats_str):
print()
print("Link : BPM " +tempo_str+" Beat "+str(beats_str) + ' \r')
#sys.stdout.flush()
# redis key : "/beat" value : currentbeat
if midix.toKey('/beat', beats_str)==True:
pass
#print("redis :", '/beat', beats_str)
# OSC : /midi/cc midichannel ccnumber value
midix.SendOSC('/beat', [beats_str])
#print("osc :",'/beat', [beats_str])
# redis key : "/bpm" value : newbpm
if midix.toKey('/bpm', bpm)==True:
pass
#print("redis :", '/bpm', bpm)
# OSC : /bpm newbpm
midix.SendOSC('/bpm', [bpm])
#print("osc :",'/bpm', [bpm])
def BeatEvent():
global lnk, prevphase
lnkstr = lnk.captureSessionState()
link_time = lnk.clock().micros();
tempo_str = '{0:.2f}'.format(lnkstr.tempo())
bpm = float(tempo_str)
#beatstep.SendOSCUI('/bpm', [bpm])
beats_str = '{0:.2f}'.format(lnkstr.beatAtTime(link_time, 0))
playing_str = str(lnkstr.isPlaying()) # always False ???
phase = lnkstr.phaseAtTime(link_time, 4)
# new beat ?
if int(phase) != prevphase:
prevphase = int(phase)
RedOSC(tempo_str, beats_str)
currentbeat = float(beats_str)
#midix.SendAU('/aurora/beats', beats_str)
#AllStatus("Beat "+str(beats_str))
# New external bpm saved in redis key ?
redbpm = float(midix.fromKey("/bpm"))
if bpm != redbpm:
print("New external BPM -> Link", redbpm)
newtempo(redbpm)
# Change current Link Tempo.
def newtempo(tempo):
global lnk
if linked == True:
lnk.enabled = False
lnk.startStopSyncEnabled = False
lnk = link.Link(tempo)
lnk.enabled = True
lnk.startStopSyncEnabled = True
bpm = tempo
print("New BPM to Link", bpm)
RedOSC(str(tempo), "0.0")
'''
# redis key : "/bpm" value : newbpm
if midix.toKey('/bpm', bpm)==True:
print("redis :", '/bpm', bpm)
# OSC : /bpm newbpm
midix.SendOSC('/bpm', [bpm])
print("osc :",'/bpm', [bpm])
'''
else:
print("Link is disabled")
# increase or decrease BPM
def BPMAdj(val1, keyname):
# + 1
if val1 == 1:
newtempo(bpm+1)
# -1
if val1 == 127 and bpm > 0:
newtempo(bpm-1)