テラByteの時代にキロByte

shader又はdemosceneに関係する事

shaderシンセ用の自作クラスを使ってみる。その2

以前、書いたダイヤルで周波数を変える奴。
glSynth.pyはここ

from glSynth import *

class MainWindow(GLSynth):
    def __init__(self, parent=None):
        super().__init__()
        self.freq = 0
        self.setVolume(0.8)

    def shaderScript(self):
        return '''
uniform float freq;         

float adsr(float t, vec4 e, float s)
{  
    return max(0.0,
      min(1.0, t/max(0.0001, e.x)) 
        - min((1.0 - s) ,max(0.0, t - e.x)*(1.0 - s)/max(0.0001, e.y))
        - max(0.0, t - e.z)*s/max(0.0001, e.w));
}

void main(){
    //gain = vec2( sin((440.0+freq)*6.2831*iTime) * step(iTime,iGateTime) );
    gain = vec2( sin((440.0+freq)*6.2831*iTime) * adsr(iTime,vec4(0.005, 0.08, 0.5, 0.1), iGateTime));
}
'''

    def initializeWindow(self):
        self.dial = QDial();            self.layout.addWidget(self.dial)
        self.dial.setSliderPosition(50)
        self.dial.valueChanged.connect(self.dial_valueChanged)

    def setUniform(self):
        glUniform1f(glGetUniformLocation(self.program, "freq"), self.freq)

    def dial_valueChanged(self, v):
        self.freq = (v - 50) * 30

    #def keyPressEvent(self, e):
    #    super().keyPressEvent(e)

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())