plɹoM ollǝH

ǝldɯᴉs puɐ llɐɯs ʇᴉ dǝǝʞ

PySide2 + librosa + pyaudio + numpy, play audio repeatedly

import librosa
import numpy as np
import pyaudio
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
import sys

class Widget(QWidget):
    def __init__(self):
        super().__init__()
        self._audio = pyaudio.PyAudio()
        self._wave = librosa.load('test.wav', sr=16000, mono=True)
        self._wave_pos = 0
        self._wave_len = len(self._wave[0])
        self._stream = None
        self._auto_replay()

    def _auto_replay(self):
        if self._stream is None or not self._stream.is_active():
            self._wave_pos = 0
            self._stream = self._audio.open(
            format=pyaudio.paFloat32, channels=1, rate=16000, output=True, stream_callback=self._on_streaming)
        QTimer.singleShot(1000, self._auto_replay)

    def _on_streaming(self, _data, frames, _time, status_flags):
        left = self._wave_pos
        right = min(self._wave_pos + frames, self._wave_len - 1)
        data = np.ndarray.tobytes(self._wave[0][left: right])
        self._wave_pos += frames
        if self._wave_pos >= self._wave_len:
            return data, pyaudio.paComplete
        return data, pyaudio.paContinue

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = Widget()
    main.show()
    sys.exit(app.exec_())

QFileSystemModel + QListView Auto Scrolling on Init

QFileSystemModelにはdirectoryLoadedというSignalがあるのでそこで処理する

default_path = '*****'

def on_directory_loaded():
    i = self._model.index(default_path)
    view.setCurrentIndex(i)
    view.scrollTo(i, QAbstractItemView.EnsureVisible)

model = QFileSystemModel()
model.directoryLoaded.connect(on_directory_loaded)
index = model.setRootPath(*****)
view = QListView()
view.setModel(model)
view.setRootIndex(index)
view.show()

pyside scoped signal blocking

IMPLEMENTS

class ScopedBlockSignals:
    def __init__(self, obj):
        self.obj = obj

    def __enter__(self):
        self._recursiveSet(self.obj, True)

    def __exit__(self, _exc_type, _exc_val, _exc_tb):
        self._recursiveSet(self.obj, False)

    def _recursiveSet(self, obj, flag):
        obj.blockSignals(flag)
        for c in obj.children():
            self._recursiveSet(c, flag)

HOW TO USE

widget = QLineEdit()
widget.textChanged.connect(lambda x: print(x))
with ScopedBlockSignals(widget):
    widget.setText('hoge')
widget.setText('fuga')

RESULT

fuga

歪曲収差 glsl

void mainImage( out vec4 fragColor, in vec2 fragCoord ) {
    vec2 uv = fragCoord.xy / iResolution.xy;
    vec2 v = uv - vec2(0.5);    
    float k1 = 1.5;
    float k2 = 0.5;
    float r1 = length(v);
    float r2 = r1 * (1.0 + k1*(r1 * r1) + k2*(r1 * r1 * r1 * r1));
    float phi = atan(v.y, v.x);
    vec2 uv2 = vec2(0.5) + vec2(cos(phi), sin(phi)) * r2;
    fragColor = texture(iChannel0, vec2(uv2.x, uv.y));
}

clang-formatをVisual Studioで

Visual Studio2017で対応されてるのでAStyleから乗り換え
実行されるタイミングがよくわからんので編集中のコード整形に加えて
ビルドイベントで全ソースなめてフォーマットするイベントを追加しておく

1. Windowsバイナリをインストール

Pre-Built BinariesからWindows (64-bit)を選択してDL PATHに追加チェックいれてインストールしておく LLVM Download Page

2.Visual Studioの設定

ツール⇒オプション⇒テキスト エディタ―⇒C/C++⇒書式設定⇒clang-formatサポートを有効にする

3.プロジェクトに.clang-formatファイルを追加

プロジェクト⇒新しい項目の追加⇒Visual C++⇒書式設定⇒.clang-format

4.ビルドイベント設定

プロジェクト⇒プロパティ⇒ビルドイベント⇒ビルド前のイベント

clang-format -style=file -i *.cpp *.hpp