Osci RenderでLuaを使う
ソースコードから確認するには、osci-render.jucer内に記載されている
JUCE用のアプリケーションProjucerから開いて View > Show Project Settings / あるいは同ファイルのソースコードのヘッダーからも確認可能
使用フレームワーク : JUCE (C++ のオーディオ系開発用フレームワーク)
VSTとかスタンドアロンアプリとかが開発しやすくなる
Osci Render Lua
Lua Version : 5.4.5 (Source/lua/lua.h)
初めての人はこれで概要をつかめる
もうちょっと細かいLuaのドキュメント
リンク先は公式というより他の方にフォークされたもので、執筆時点ではフォーク版の方が最新情報に更新されているため掲載。場合によっては作者(James H Ball氏)のWiki(Github)を参照するといいかもしれない。 Lua
Osci RenderにおけるLua
音源としてのLua -Osci Render-
<Create File>からLuaファイルを作成する場合
音源をスクリプトで一から作成していくパターン
入力音源がすでにあり、それを調理していくための立ち位置
{ x , y, z }が入力として最初に与えられている
音源としてのLuaが波形処理な座標系だとすれば
エフェクトとしてのLuaは画像処理的な座標系
座標系(スタイル)が違う
もともと使えるLua変数(LuaParser.cpp の setGlobalVariablesに記載)
step
初期値:1
1sampleにつき1ずつ数値が増えていく
つまり、サンプルレートが48000s/sの場合、1秒間に48000回数値が増えていく
たとえばprint ( step / sample_rate )でコンソール画面を見ると、1秒間に1ずつ増えていく様子が分かる
※ちなみにコンソール画面は分かりづらいが、Luaのコードを書く部分の下に<LuaConsole>というタブがあるので、それをクリックするとコンソール画面が開く
https://gyazo.com/6297938d719ad9e881175c69b658cdfc
公式ではoutdatedな変数として見なされている。かわりにphaseやfrequency、sample_rateを使うといい。
phase
初期値:0
周波数に応じて一定の周期でループする
周波数が高くなれば周期が速くなり、周波数が低くなれば周期が遅くなる
なにがいいかといえば、たとえばサイン波を作りたいときに、stepを使うと画面上で設定する周波数によらず一定だが、phaseであれば同期されるので、直感的にわかりやすい
値は 0 ~ 2π の間で、2πを越えると0にリセットされる
ソースコード(LuaParser.cpp)にある数式を簡単に見ると
( phase ) += 2π × freq / sampleRate
となっており
<0 ~ 2π>を1ループとして、それが周波数freqの分だけ1秒間に繰り返される
例えば わかりやすく 1Hz としてやると、0 ~ 2π ( 0 ~ 6.28 )のループが1秒ごとに繰り返される
https://gyazo.com/288e82fb46ad55cbd0f20bb00747ccf0
sample_rate
初期値:0
そのサンプルレートが変数として使える
frequency
初期値:0
Osci Render上で設定した周波数が変数として使える
x
y
z
Osci Render のLua関数
sliderと組み合わせればアニメーションも可能
osci_line()
https://gyazo.com/1b563ee83a070b9dec9180fe2545c606
code:osci_line
a = slider_a *2 -1
b = slider_b *2 -1
c = slider_c *2 -1
d = slider_d *2 -1
start = { a, b }
finish = { c, d }
line = osci_line(phase, start, finish)
return line
osci_rect() 長方形
https://gyazo.com/6cec50be6c341da3893ab5fced5ebc80
code:osci_rect
width = slider_a
height = slider_b
rect = osci_rect(phase, width, height)
return rect
osci_square() 正方形
https://gyazo.com/c94133145cb18624b6a6e4bc46b2736e
code:osci_square
width = slider_a
square = osci_rect(phase, width, width)
return square
osci_arc()
https://gyazo.com/d02d034f65fbeb1f1c92b1173e911903
code:osci_arc
radius_x = slider_a
radius_y = slider_b
start_angle = slider_c * 2 * math.pi
end_angle = slider_d * 2 * math.pi
arc = osci_arc(phase, radius_x, radius_y, start_angle, end_angle)
return arc
https://scrapbox.io/files/66f975b7b68d06001c3b0ada.mp4
上の音声波形をYTモードでも表示させたらかわいくて撮ってしまった...
osci_ellipse()
code:ellipse
radius_x = slider_a
radius_y = slider_b
ellipse = osci_ellipse(phase, radius_x, radius_y)
return ellipse
osci_circle()
https://gyazo.com/9c2800df1e55fd6e155a72c375b9029a
code:circle
radius = slider_a
circle = osci_circle(phase, radius)
return circle
osci_polygon()
https://gyazo.com/4f74e6428d8e2d7126da4669c3a17a19
code:polygon
num_sides = math.floor(slider_a * 10)
polygon = osci_polygon(phase, num_sides)
return polygon
osci_bezier()
https://gyazo.com/682537bfc1abab5ff02b0a8d1e020122
code:bezier1
-- osci_bezier(phase, start, control_point, finish)
start = { slider_a, slider_b }
control_point = { slider_c, slider_d }
finish = { slider_e, slider_f }
quadratic_bezier = osci_bezier(phase, start, control_point, finish)
return quadratic_bezier
https://gyazo.com/0dd22b9942ed2fae0a45a9a909662a9c
code:bezier2
--osci_bezier(phase, start, control_point_1, control_point_2, finish)
start = { slider_a, slider_b }
control_point_1 = { slider_c, slider_d }
control_point_2 = { slider_e, slider_f }
finish = { slider_g, slider_h }
cubic_bezier = osci_bezier(phase, start, control_point_1, control_point_2, finish)
return cubic_bezier
control_pointは2つまで(3つ以上にしたら作動しない)
osci_lissajous()
osci_square_wave()
osci_saw_wave()
osci_triangle_wave()
osci_mix()
osci_translate()
osci_scale()
osci_rotate()
print()
clear()
Luaのライブラリ
math.sin()やmath.floorなどが使える