Sampled Instrument Player with static and monolithic design. All instruments are built-in.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

118 lines
3.2 KiB

#! /usr/bin/env python3
# -*- coding: utf-8 -*-
Copyright 2022, Nils Hilbricht, Germany ( )
Most of this file is trivial code and does not reach the "Schaffenshöhe" for Urheberrecht.
If it is:
This is practically intended as my Public Domain software.
However, there is no such thing as public domain in Germany.
Released under WTFPL License
This program is free software. It comes without any warranty, to
the extent permitted by applicable law.
You can redistribute it and/or modify it under the
terms of the Do What The Fuck You Want To Public License, Version 2,
as published by Sam Hocevar. See for more details.
def nothing(*args, **kwargs):
from functools import lru_cache #
cache_unlimited = lru_cache(maxsize=None)
#use as @cache_unlimited decorator
def dictdiff(a, b):
"""We use dicts for internal export packages. Compare two of them for changes"""
result = {}
for key, value in a.items():
if not b[key] == value:
result[key] = (value, b[key])
return result
import itertools
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = itertools.tee(iterable)
next(b, None)
return zip(a, b)
def onlyOne(iterable):
true_found = False
for v in iterable:
if v:
# a True was found!
if true_found:
# found too many True's
return False
# found the first True
true_found = True
# found zero or one True value
return true_found
class EndlessGenerator(object):
"""used to turn a single
parameter into an endless list of paramters.
DO NOT for loop over this object.
It will never stop. Use it with next(instance)"""
def __init__(self, value):
self.value = value
def __iter__(self):
return self
def __next__(self):
return self.value
def flatList(lst):
"""Take a nested list of any depth and make it a flat, plain
list with only one level"""
for elem in lst:
if type(elem) in (list, tuple):
for i in flatList(elem):
yield i
yield elem
def compress(input, inputLowest, inputHighest, outputLowest, outputHighest):
return (input-inputLowest) / (inputHighest-inputLowest) * (outputHighest-outputLowest) + outputLowest
def listToUniqueKeepOrder(seq):
seen = set()
seen_add = seen.add
return [x for x in seq if not (x in seen or seen_add(x))]
def padhexa(self, s:str):
"""Like zfill, but for hex number strings"""
return '0x' + s[2:].zfill(2)
import inspect
from pprint import pprint
def whoCalled():
"""If you want to use this only once, better use breakpoint()"""
pprint (inspect.stack())
def provokecrash():
"""Obviously for testing"""
import ctypes
p = ctypes.pointer(ctypes.c_char.from_address(5))
p[0] = b'x'
def humanReadableFilesize(num, suffix="B"):
for unit in ["", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi"]:
if abs(num) < 1024.0:
return f"{num:3.1f}{unit}{suffix}"
num /= 1024.0
return f"{num:.1f}Yi{suffix}"