2018-07-13 13:57:00 +00:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
2018-07-14 06:54:14 +00:00
|
|
|
import time
|
2018-07-12 22:27:26 +00:00
|
|
|
from pathlib import Path
|
2018-07-14 09:06:07 +00:00
|
|
|
from typing import NamedTuple, Optional, List, Any
|
2018-07-12 22:27:26 +00:00
|
|
|
|
|
|
|
import click
|
|
|
|
|
2018-07-14 06:54:14 +00:00
|
|
|
from ovgenpy.renderer import MatplotlibRenderer, RendererConfig
|
2018-07-14 09:06:07 +00:00
|
|
|
from ovgenpy.triggers import TriggerConfig, CorrelationTrigger
|
2018-07-14 03:58:00 +00:00
|
|
|
from ovgenpy.wave import WaveConfig, Wave
|
2018-07-12 22:27:26 +00:00
|
|
|
|
2018-07-13 00:48:51 +00:00
|
|
|
|
2018-07-14 06:54:14 +00:00
|
|
|
RENDER_PROFILING = True
|
|
|
|
|
|
|
|
|
2018-07-12 22:27:26 +00:00
|
|
|
class Config(NamedTuple):
|
2018-07-13 11:48:14 +00:00
|
|
|
wave_dir: str
|
2018-07-13 13:55:17 +00:00
|
|
|
# TODO: if wave_dir is present, it should overwrite List[WaveConfig].
|
|
|
|
# wave_dir will be commented out when writing to file.
|
2018-07-13 11:48:14 +00:00
|
|
|
|
2018-07-12 22:27:26 +00:00
|
|
|
master_wave: Optional[str]
|
|
|
|
|
|
|
|
fps: int
|
|
|
|
|
2018-07-14 03:58:00 +00:00
|
|
|
trigger: TriggerConfig # Maybe overriden per Wave
|
|
|
|
render: RendererConfig
|
2018-07-13 02:29:05 +00:00
|
|
|
|
|
|
|
|
2018-07-12 22:27:26 +00:00
|
|
|
Folder = click.Path(exists=True, file_okay=False)
|
|
|
|
File = click.Path(exists=True, dir_okay=False)
|
|
|
|
|
2018-07-13 12:37:22 +00:00
|
|
|
_FPS = 60 # f_s
|
2018-07-12 22:27:26 +00:00
|
|
|
|
2018-07-13 02:30:07 +00:00
|
|
|
|
2018-07-12 22:27:26 +00:00
|
|
|
@click.command()
|
|
|
|
@click.argument('wave_dir', type=Folder)
|
2018-07-13 02:29:05 +00:00
|
|
|
@click.option('--master-wave', type=File, default=None)
|
2018-07-13 12:37:22 +00:00
|
|
|
@click.option('--fps', default=_FPS)
|
2018-07-12 22:27:26 +00:00
|
|
|
def main(wave_dir: str, master_wave: Optional[str], fps: int):
|
|
|
|
cfg = Config(
|
|
|
|
wave_dir=wave_dir,
|
|
|
|
master_wave=master_wave,
|
|
|
|
fps=fps,
|
2018-07-14 09:06:07 +00:00
|
|
|
trigger=CorrelationTrigger.Config(
|
|
|
|
trigger_strength=0.1,
|
|
|
|
|
|
|
|
responsiveness=0.1,
|
|
|
|
falloff_width=0.5,
|
2018-07-13 12:37:22 +00:00
|
|
|
),
|
2018-07-13 13:55:17 +00:00
|
|
|
render=RendererConfig( # todo
|
2018-07-13 11:05:31 +00:00
|
|
|
1280, 720,
|
2018-07-13 02:29:05 +00:00
|
|
|
samples_visible=1000,
|
|
|
|
rows_first=False,
|
|
|
|
ncols=1
|
|
|
|
)
|
2018-07-12 22:27:26 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
ovgen = Ovgen(cfg)
|
|
|
|
ovgen.write()
|
|
|
|
|
|
|
|
|
|
|
|
COLOR_CHANNELS = 3
|
|
|
|
|
2018-07-13 02:30:07 +00:00
|
|
|
|
2018-07-12 22:27:26 +00:00
|
|
|
class Ovgen:
|
|
|
|
def __init__(self, cfg: Config):
|
|
|
|
self.cfg = cfg
|
|
|
|
self.waves: List[Wave] = []
|
|
|
|
|
|
|
|
def write(self):
|
2018-07-13 02:30:07 +00:00
|
|
|
self.load_waves() # self.waves =
|
2018-07-12 22:27:26 +00:00
|
|
|
self.render()
|
|
|
|
|
|
|
|
def load_waves(self):
|
|
|
|
wave_dir = Path(self.cfg.wave_dir)
|
|
|
|
|
|
|
|
for idx, path in enumerate(wave_dir.glob('*.wav')):
|
|
|
|
wcfg = WaveConfig(
|
2018-07-13 02:29:05 +00:00
|
|
|
wave_path=str(path)
|
2018-07-12 22:27:26 +00:00
|
|
|
)
|
2018-07-13 12:37:22 +00:00
|
|
|
|
2018-07-12 22:27:26 +00:00
|
|
|
wave = Wave(wcfg, str(path))
|
2018-07-14 09:06:07 +00:00
|
|
|
trigger = self.cfg.trigger(
|
2018-07-13 12:37:22 +00:00
|
|
|
wave=wave,
|
2018-07-14 00:52:58 +00:00
|
|
|
scan_nsamp=wave.smp_s // self.cfg.fps, # TODO multiply by a thing
|
2018-07-14 09:06:07 +00:00
|
|
|
)
|
|
|
|
wave.set_trigger(trigger)
|
2018-07-12 22:27:26 +00:00
|
|
|
self.waves.append(wave)
|
|
|
|
|
|
|
|
def render(self):
|
|
|
|
# Calculate number of frames (TODO master file?)
|
|
|
|
fps = self.cfg.fps
|
|
|
|
nframes = fps * self.waves[0].get_s()
|
|
|
|
nframes = int(nframes) + 1
|
|
|
|
|
2018-07-13 00:48:51 +00:00
|
|
|
renderer = MatplotlibRenderer(self.cfg.render, self.waves)
|
2018-07-12 22:27:26 +00:00
|
|
|
|
2018-07-14 06:54:14 +00:00
|
|
|
if RENDER_PROFILING:
|
2018-07-13 11:05:31 +00:00
|
|
|
begin = time.perf_counter()
|
|
|
|
|
2018-07-12 22:27:26 +00:00
|
|
|
# For each frame, render each wave
|
|
|
|
for frame in range(nframes):
|
2018-07-13 00:48:51 +00:00
|
|
|
time_seconds = frame / fps
|
2018-07-12 22:27:26 +00:00
|
|
|
|
2018-07-13 00:48:51 +00:00
|
|
|
center_smps = []
|
2018-07-12 22:27:26 +00:00
|
|
|
for wave in self.waves:
|
2018-07-13 00:48:51 +00:00
|
|
|
sample = round(wave.smp_s * time_seconds)
|
2018-07-12 22:27:26 +00:00
|
|
|
trigger_sample = wave.trigger.get_trigger(sample)
|
2018-07-13 00:48:51 +00:00
|
|
|
center_smps.append(trigger_sample)
|
2018-07-12 22:27:26 +00:00
|
|
|
|
2018-07-13 07:41:11 +00:00
|
|
|
print(frame)
|
2018-07-13 00:48:51 +00:00
|
|
|
renderer.render_frame(center_smps)
|
2018-07-12 22:27:26 +00:00
|
|
|
|
2018-07-14 06:54:14 +00:00
|
|
|
if RENDER_PROFILING:
|
2018-07-13 11:05:31 +00:00
|
|
|
dtime = time.perf_counter() - begin
|
|
|
|
render_fps = nframes / dtime
|
|
|
|
print(f'FPS = {render_fps}')
|