投稿日: May 30, 2018 10:59:30 AM
時間変化にカーブを、というのをやろうと思ったんですがもうまとめておいた方がよさそうだったので先にスクリプトつくりました。
エンベロープジェネレーター以外にもカーブは便利に使えそうだったので独立させてみました。
curve.py
import math as m FS = 0 SF = 1 FSF = 2 SFS = 3 LINER = 4def curve(type,value): if type == FS: return fastSlow(value) if type == SF: return slowFast(value) if type == FSF: return fastSlowFast(value) if type == SFS: return slowFastSlow(value) if type == LINER: return value def fastSlow(value): return m.sin( m.radians( 90 * value ) )def slowFast(value): return 1 - m.sin( m.radians( 90 - 90 * value ) )def fastSlowFast(value): return 1 - m.cos( m.radians( 90 * value + 45 ) ) / 0.7071067811865476 / 2 - 0.5def slowFastSlow(value): return 1 - m.cos( m.radians( 180 * value ) ) / 2 - 0.5
クラスにすると使うのが面倒くさそうだったのでべったり平たく実装。
使い方はこんなかんじに。
>>> from bareaudio import curve >>> curve.curve( curve.FS, 0.2 ) 0.04894348370484647
定数的にタイプを定義しておいたので、早い= F 遅い= Sで早くはじまって遅くおわるのはFS、逆はSF、はやいおそいはやいFSF、おそいはやいおそいSFSって感じで覚えやすいかなと。悩んだ末にLINERも入れておいた。正直渡す必要が無くて値をそのまま使えば良い。
値は 0.0~1.0 で渡す。
#!/usr/bin/python3from bareaudio import curve f = open("curve.csv","w") f.write("SF,FS,FSF,SFS\n") data = [0.0] * 4for i in range(100): data[0] = curve.curve( curve.SF , i/100 ) data[1] = curve.curve( curve.FS , i/100 ) data[2] = curve.curve( curve.FSF, i/100 ) data[3] = curve.curve( curve.SFS, i/100 ) f.write(str(data)[1:-1] + "\n") f.close()
こんな感じにCSVを出力して結果をグラフで見てみよう。gnuplotは・・・いつも使い方忘れちゃうんだよね。
LibreOfficeさまさまですわ。
こんな感じになりました。
LINERは省いてあります。
これでエンベロープジェネレーターとかその他いろいろなところで便利にカーブを使えるようになったわけですね。
・・・SFとFSのカーブが逆ですね…。スクリプトとレポジトリの方は直しておきました。