From f5bce3472853950408dbe1cde61a28e550c7f95f Mon Sep 17 00:00:00 2001 From: icaema Date: Sun, 5 Nov 2023 14:18:19 -0500 Subject: [PATCH] yay tracking --- .gitignore | 55 +++++++++++++++++ requirements.txt | 5 ++ termrender.py | 110 +++++++++++++++++++++++++++++++++ termrender_audio.py | 144 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 314 insertions(+) create mode 100644 .gitignore create mode 100644 requirements.txt create mode 100644 termrender.py create mode 100644 termrender_audio.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e4b1250 --- /dev/null +++ b/.gitignore @@ -0,0 +1,55 @@ +# Distribution / packaging +.Python +build +develop-eggs +dist +downloads +eggs +.eggs +lib +lib64 +parts +sdist +var +wheels +share/python-wheels +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +.python-version + +# Environments +.env +.venv +env +venv +ENV +env.bak +venv.bak +pyvenv.cfg +bin diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..55e7ed8 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +cffi==1.16.0 +colorama==0.4.6 +just-playback==0.1.7 +pycparser==2.21 +tinytag==1.10.1 diff --git a/termrender.py b/termrender.py new file mode 100644 index 0000000..fddb51b --- /dev/null +++ b/termrender.py @@ -0,0 +1,110 @@ +import time, math +from colorama import Fore, Back, Style +import functools +printr = functools.partial(print, end="") + +############### +FRAMERATE=30 +HEIGHT=24 +WIDTH=80 +############### + +FRAME_NO=0 +def clearBuffer(): + global screen_buffer,screen_buffer_color + screen_buffer = [[" "]*WIDTH for y in range(HEIGHT)] +def clearBufferColor(): + global screen_buffer,screen_buffer_color + screen_buffer_color = [[Style.RESET_ALL]*WIDTH for y in range(HEIGHT)] +def clearAllBuffers(): + clearBuffer() + clearBufferColor() +def clearScreen(): + printr('\033[2J') + +def render(clear=True): + if clear: + clearScreen() + for y in range(HEIGHT): + for x in range(WIDTH): + printr(screen_buffer_color[y][x]) + printr(screen_buffer[y][x]) + print() #print \n + +def renderLoop(): + trackers() + draw() + render() +def framerateMaker(func, perSec): + interval = 1.0 / perSec + while True: + start_time = time.time() + func() + elapsed = time.time() - start_time + if elapsed < interval: + time.sleep(interval-elapsed) +################ + +class RenderException(Exception): + pass + +def printBuffer(x, y, val): + global screen_buffer + string=str(val) + if len(string) > WIDTH-x: + raise RenderException("Too Long") + for i, l in enumerate(string): + screen_buffer[y][x+i]=l + +def clearLine(y): + global screen_buffer + screen_buffer[y]=[" "]*WIDTH + +def drawBox(x,y,width,height,char): + if x+width > WIDTH or y+height > HEIGHT: + raise RenderException("Box too BIG") + for w_x in range(width): + for w_y in range(height): + if (w_x==0 or w_x==width-1) or (w_y==0 or w_y==height-1): + screen_buffer[y+w_y][x+w_x] = char + +#################### +def trackers(): + global FRAME_NO + FRAME_NO+=1 + +def main(): + setup() + try: + framerateMaker(renderLoop, FRAMERATE) + pass + except KeyboardInterrupt: + pass + teardown() + + + +def setup(): + print("Setup") + print("Clearing") + clearScreen() + clearAllBuffers() + pass + + +def teardown(): + global dat + print("Teardown") + print("Teardown Complete") + pass + + +def draw(): + global FRAME_NO,screen_buffer,screen_buffer_color + clearAllBuffers() + drawBox(0,0,WIDTH,HEIGHT,'#') + printBuffer(1,1,str(FRAMERATE)+'fps '+str(FRAME_NO)) + + +if __name__ == "__main__": + main() diff --git a/termrender_audio.py b/termrender_audio.py new file mode 100644 index 0000000..f1cdf9f --- /dev/null +++ b/termrender_audio.py @@ -0,0 +1,144 @@ +import time +import math +import functools +printr = functools.partial(print, end="") + +from just_playback import Playback +playback = Playback() + +from colorama import Fore, Back, Style + +############### +BPM=112 +BEAT_SUB=16 + +FRAMERATE=(BPM*BEAT_SUB/60) +HEIGHT=24 +WIDTH=64 +############### +FRAME_NO=0 +MUSIC_TIME=[0 for i in range(int(math.log2(BEAT_SUB)))] +############### + +def clearBuffer(): + global screen_buffer,screen_buffer_color + screen_buffer = [[" "]*WIDTH for y in range(HEIGHT)] +def clearBufferColor(): + global screen_buffer,screen_buffer_color + screen_buffer_color = [[Style.RESET_ALL]*WIDTH for y in range(HEIGHT)] +def clearAllBuffers(): + clearBuffer() + clearBufferColor() +def clearScreen(): + printr('\033[2J') +def render(clear=True): + if clear: + clearScreen() + for y in range(HEIGHT): + for x in range(WIDTH): + printr(screen_buffer_color[y][x]) + printr(screen_buffer[y][x]) + print() #print \n + +def renderLoop(): + trackers() + draw() + render() + +def framerateMaker(func, perSec): + interval = 1.0 / perSec + while True: + start_time = time.time() + func() + elapsed = time.time() - start_time + if elapsed < interval: + time.sleep(interval-elapsed) + +################ + +def printBuffer(x, y, val): + global screen_buffer + string=str(val) + if len(string) > WIDTH-x: + return + for i, l in enumerate(string): + screen_buffer[y][x+i]=l + pass + +def clearLine(y): + global screen_buffer + screen_buffer[y]=[" "]*WIDTH + pass + + +#################### +def trackers(): + global FRAME_NO + global MUSIC_TIME + FRAME_NO+=1 + MUSIC_TIME[0]=(FRAME_NO//BEAT_SUB)//4 + MUSIC_TIME[1]=(FRAME_NO//BEAT_SUB//1)%4 + MUSIC_TIME[2]=(FRAME_NO//(BEAT_SUB//2))%8 + MUSIC_TIME[3]=(FRAME_NO//(BEAT_SUB//4))%16 + #MUSIC_TIME[1]=(FRAME_NO//(BEAT_SUB*int(math.log2(BEAT_SUB//8))))%4 +# MUSIC_TIME[2]=(FRAME_NO//8)%8 +# for i in range(len(MUSIC_TIME)): +# MUSIC_TIME[i]=(FRAME_NO//2**(i+1)) % 2**(i) + +def main(): + setup() + try: + framerateMaker(renderLoop, FRAMERATE) + pass + except KeyboardInterrupt: + pass + teardown() + + + +def setup(): + global playback + print("Setup") + print("Clearing") + clearScreen() + clearAllBuffers() + #playback.load_file('') + #playback.play() + + +def teardown(): + print("Teardown") + print("Stopping Playback") + #playback.stop() + print("Teardown Complete") + pass + + +cursorX=1 +cooldown=[0]*4*4 +def draw(): + global screen_buffer,screen_buffer_color + global MUSIC_TIME + global cursorX,cooldown + clearAllBuffers() + for y in range(HEIGHT): + for x in range(WIDTH): + if x == 0 or x == WIDTH-1: + screen_buffer[y][x]='#' + if y == 0 or y == HEIGHT-1: + screen_buffer[y][x]='#' + printBuffer(0,3,"1234567890123456789012345678901234567890123456789012345678901234") + printBuffer(0,4,"0 1 2 3 4 5 6 ") + clearLine(5) + if cursorX >= WIDTH: + cursorX=0 + screen_buffer[5][cursorX] = "x" + + printBuffer(1,1,FRAME_NO) + printBuffer(6,1,FRAMERATE) + printBuffer(1,2,MUSIC_TIME) + cursorX=cursorX+1 + + +if __name__ == "__main__": + main()