Skip to content

Commit

Permalink
Ver(1.5): Improve error handling, fix lib-dylink
Browse files Browse the repository at this point in the history
  • Loading branch information
duangsuse committed Apr 26, 2020
1 parent 9b8db00 commit 7583fc4
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 31 deletions.
10 changes: 5 additions & 5 deletions hachiko_bapu/funutils.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from ctypes.util import find_library

from sys import platform as sys_platform
from os.path import isfile
from os.path import isfile, abspath
from itertools import chain

def require(value, p, message):
Expand All @@ -27,10 +27,10 @@ def findLibrary(name, lib_names, solver=lambda name: [f"./{name}.dll"]) -> str:
paths = filter(isNotNone, map(find_library, lib_names))
for dlls in map(solver, lib_names):
paths = chain(paths, filter(isfile, dlls))
try:
return str(next(paths)) #< appended dll scan
except StopIteration:
raise ImportError(f"couldn't find the {name} library")

path = next(paths, None) #< appended dll scan
if path == None: raise ImportError(f"couldn't find the {name} library")
else: return abspath(str(path))

def createLibrary(path, mode = 1):
lib = CDLL(path)
Expand Down
37 changes: 16 additions & 21 deletions hachiko_bapu/hachi.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/bin/env python3
# -*- coding: utf-8 -*-

from typing import Callable, Optional, TypeVar; T = TypeVar("T")
from typing import Any, Callable, Optional, TypeVar; T = TypeVar("T")

from argparse import ArgumentParser, FileType
from time import time
Expand All @@ -27,13 +27,7 @@ def splitAs(type, transform = int, delim = ","):
askMethod = env("ASK_METHOD", str, "tk")
playDuration = env("PLAY_DURATION", splitAs(list, transform=float), [0.3, 0.5, 1.5])

from pkg_resources import resource_filename
def resInstrumentSf2(name = "instrument.sf2") -> str:
try: sfont = resource_filename(__name__, name)
except ModuleNotFoundError: sfont = name
return env("SFONT", str, sfont)

INSTRUMENT_SF2 = resInstrumentSf2()
INSTRUMENT_SF2 = env("SFONT", str, resourcePath("instrument.sf2"))
sampleRate = env("SAMPLE_RATE", int, 44100)
sfontPreset = 0 #< used twice

Expand All @@ -50,18 +44,19 @@ def readOctave(octa):
octave, n = octa.rstrip(f"b'{digits}").split("_")
return OCTAVE_NAMES.index(octave)*OCTAVE_MAX_VALUE + int(n)

def blockingAsk(name:str, transform:Callable[[str],T], default:T, placeholder:Optional[str] = None) -> T:
def blockingAskThen(onDone:Callable[[T], Any], name:str, transform:Callable[[str],T], placeholder:Optional[str] = None):
if askMethod == "input":
if placeholder != None: print(placeholder)
answer = input(f"{name}?> ")
return transform(answer) if answer != "" else default
if answer != "": onDone(transform(answer))
elif askMethod == "tk":
from tkinter import Tk
from tkinter.simpledialog import askstring
tk = Tk()
answer = askstring(f"Asking for {name}", f"Please input {name}:", initialvalue=placeholder)
tk = Tk(); tk.withdraw() #< born hidden

answer = askstring(f"Asking for {name}", f"Please input {name}:", initialvalue=placeholder or "")
tk.destroy()
return transform(answer) if answer != None else default
if answer != None: onDone(transform(answer))
else: raise ValueError(f"unknown asking method {askMethod}")

app = ArgumentParser(prog="hachi", description="Simple tool for creating pitch timeline",
Expand All @@ -80,14 +75,14 @@ def actions(self, ctx, k):
rm = self.items.pop()
ctx.show(f"!~{rm} #{len(self.items)}")
elif k == 'r':
try:
n = blockingAsk("n", int, len(self.items), placeholder=dumps(self.items))
ctx.slides(playDuration[1], *map(lambda i: f"!{i}", self.items[-n:]), "!done")
play = lambda n: ctx.slides(playDuration[1], *map(lambda i: f"!{i}", self.items[-n:]), "!done")
try: blockingAskThen(play, "n", int, str(len(self.items)))
except ValueError: ctx.show("Invalid Count")
elif k == 'k':
try:
answer = blockingAsk("list", loads, None)
if answer != None and isinstance(answer, list): self.items = answer
def save(answer):
if isinstance(answer, list): self.items = answer
else: ctx.show(f"Not List: {answer}")
try: blockingAskThen(save, "list", loads, dumps(self.items))
except JSONDecodeError: ctx.show("Load Failed")

class AsSrt(AsList):
Expand Down Expand Up @@ -144,7 +139,7 @@ def playSec(n_sec, pitch):

def baseSlide(n):
nonlocal note_base
note_base += n
note_base = (note_base + n) % 128 #< cyclic coerceLT
playSec(playDuration[0], note_base)
ctx.show(dumpOctave(note_base))

Expand Down Expand Up @@ -222,7 +217,7 @@ def guiReadTimeline(pitchz, reducer, play = None, caption = "Add Timeline", seek

def nextPitch():
try: return next(pitchz)
except StopIteration: raise NonlocalReturn("done")
except StopIteration: raise NonlocalReturn()
def splitNote():
synth.noteSwitch(nextPitch())
def giveSegment():
Expand Down
15 changes: 11 additions & 4 deletions hachiko_bapu/hachitools.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,26 @@
from typing import Any, Callable, Optional, TypeVar; T = TypeVar("T")

from threading import Timer
from os import environ
from pkg_resources import resource_filename

SEC_MS = 1000

def grayColor(n): return (n,n,n)
def grayColor(n:int): return (n,n,n)

def env(name, transform, default):
def env(name:str, transform:Callable[[str],T], default:T) -> T:
return transform(environ[name]) if name in environ else default

def timeout(n_sec, op):
def resourcePath(path) -> str:
try: return resource_filename(__name__, path)
except ModuleNotFoundError: return path

def timeout(n_sec:float, op):
timer = Timer(n_sec, op); timer.start()
return timer

class NonlocalReturn(Exception):
def __init__(self, value):
def __init__(self, value = None):
super().__init__(value)
@property
def value(self): return self.args[0]
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ def parse_requirements(requirements):
return list(filter(lambda s: s.strip() != "", items))

setup(
name="hachiko-bapu", version="0.1.4",
name="hachiko-bapu", version="0.1.5",
python_requires=">=3.5",
author="duangsuse", author_email="fedora-opensuse@outlook.com",
url="https://github.com/duangsuse-valid-projects/Hachiko",
Expand Down

0 comments on commit 7583fc4

Please sign in to comment.