corrscope/ovgenpy/ovgenpy.py

119 wiersze
3.0 KiB
Python
Czysty Zwykły widok Historia

# -*- 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
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
from ovgenpy.triggers import TriggerConfig, CorrelationTrigger
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):
wave_dir: str
# TODO: if wave_dir is present, it should overwrite List[WaveConfig].
# wave_dir will be commented out when writing to file.
2018-07-12 22:27:26 +00:00
master_wave: Optional[str]
fps: int
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,
trigger=CorrelationTrigger.Config(
trigger_strength=0.1,
responsiveness=0.1,
falloff_width=0.5,
2018-07-13 12:37:22 +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))
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
)
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}')