[vci楽器制作メモ]太鼓リズムマシーン
出来たのがこれ。
へへ。太鼓のリズムマシンできた。 pic.twitter.com/qYUZWwejoP
— alaki paca/荒木パカ たれ乳アルパカ作曲系vtuber🍤💗🐺 (@arabiiiiiiiiiii) 2019年6月2日
- Useしたらアニメーション太鼓が叩かれるアニメーションが始まり、音も流れ出す。
- 横のプラスマイナスのキューブをタッチしたら流れる太鼓の音のBPMを変えられる。表示も変わる。
vciのバージョンはUniVCI-0.17です。
スクリプトの全体
bool_loop = false
bool_clock = false
count = 1
--テクスチャの中の分割数
local TOTAL = 9
bgmvol = 0.5
--キューブに触れるとcountを計算、テクスチャを動かす。
function onTriggerEnter(item, hit)
if item == "Cube1" then
if count >= TOTAL-1 then
count = 0
else
count = count + 1
end
SetTextureOffset(count)
end
if item == "Cube" then
if count < 1 then
count = 8
else
count = count -1
end
SetTextureOffset(count)
end
end
--Useするとアニメーションを動かす。bool_loopとbool_clockをtrueにする。
function onUse(use)
if use == "taiko" then
if bool_loop == false then
vci.assets._ALL_PlayAnimationFromName("taiko_motion2",true)
bool_loop = true
bool_clock = true
else
vci.assets._ALL_StopAnimation()
vci.assets.audio._ALL_Stop("taiko_sound")
bool_loop = false
end
end
end
--bool_loopがtrueの時音を鳴らすタイミング計算
--bool_clockがtrueになったら再生した時間を記録してすぐfalseに戻す。
--clockStartでos.clockを引いた数がBPMを越えたら音を鳴らす。
function updateAll()
if bool_loop == true then
if bool_clock == true then
clockStart = os.clock() --再生した時間を記録
bool_clock = false
end
if os.clock() - clockStart > 60*(1/(110 +(count *10 ))) then
vci.assets.audio._ALL_Play("taiko_sound", bgmvol, false)
bool_clock = true
end
end
end
--画像の表示場所計算
function SetTextureOffset( count )
local offset = Vector2.zero
-- y shift
local Yshift = math.floor(count / 3)
offset.y = -(1/3) * Yshift
-- x shift
local Xshift = count % 3
offset.x = (1/3) * Xshift
vci.assets._ALL_SetMaterialTextureOffsetFromIndex(8, offset)
end
SetTextureOffset(count)
テンポの表示を変える。
↓の「Useすると柄が変わるポスター」がわかりやすい。
https://virtualcast.jp/wiki/doku.php?id=vci:sample:onuse:no5
このイベント関数で、テクスチャの表示区間?場所?を変えます。
↓のような画像があるとして、
1の部分、2の部分と表示場所を移して行く感じです。オフセット移動とか書かれてもわかりづらいよ。。。
vci.assets._ALL_SetMaterialTextureOffsetFromIndex(テクスチャの指定,offset )
第一引数のテクスチャの指定が、よくわかってないです
このリファレンスの説明がわからないよー
https://virtualcast.jp/wiki/doku.php?id=vci:script:reference:exportassets
8にしたら、BPMの10の桁のテクスチャが変わるから、こう書いた。
他の数字にしたら、他の貼ったテクスチャに影響があった。
使用しているテクスチャに番号振られているっぽいのかな?わかり次第追記したい。
誰か知っていたら教えてください。
テクスチャの9等分した時の左上の部分が、面の上に来るようにするのは、Blenderで行いました。
↓の記事を参考にしたらできました。
http://blog.livedoor.jp/hawamo21/archives/2949798.html
表示したい面にシームを付けて、
UV展開して面が左上に来るようにした。(汚いUV展開で申し訳ない。)
流れる音のBPMを変える
vci.assets.audio._ALL_Play(鳴らしたい音ファイル, ボリューム, false)
これで、第3引数がtrueの時にループして、falseだと一回だけ鳴ります。
BPMの計算が
60*拍子*小節数/テンポで、この太鼓リズムマシーンのBPMの最低値が110なため。
60*(1/(110 +(count *10 ))
これでBPMを秒に換算して計算をして、
再生した時の時間を代入しておいたclockStartでos.clockを引いた数がBPMを越えたら再び鳴らしています。
function updateAll()
if bool_loop == true then
if bool_clock == true then
clockStart = os.clock() --再生した時間を記録
bool_clock = false
end
if os.clock() - clockStart > 60*(1/(110 +(count *10 ))) then
vci.assets.audio._ALL_Play("taiko", bgmvol, false)
bool_clock = true
end
end
update()で毎フレーム呼び出しができます。↓参照
https://virtualcast.jp/wiki/doku.php?id=vci:script:reference:eventfunction:tips1
アニメーションのオンオフ
↓の記事が参考になる。
https://virtualcast.jp/wiki/doku.php?id=vci:sample:animation:tutorial
bool_loopがfalseだったらアニメーション再生。
bool_loopがtrueだったらアニメーション停止して、音の再生もストップというものです。
function onUse(use)
if use == "taiko" then
if bool_loop == false then
vci.assets._ALL_PlayAnimationFromName("taiko_motion",true)
bool_loop = true
else
vci.assets._ALL_StopAnimation()
vci.assets.audio._ALL_Stop("taiko_sound")
bool_loop = false
end
end
end
現在はBPM110~190までしか変えられない仕様になってますが(途中で飽きた)
もしも、やる気が出たら作り直しますね。
ファミマ入店音チャレンジ pic.twitter.com/ymaaWRfMbY
— alaki paca/荒木パカ たれ乳アルパカ作曲系vtuber🍤💗🐺 (@arabiiiiiiiiiii) 2019年6月4日