展示物コーナー展示作品リストアミューズメント

フル独立可動鍵盤付き自動ピアノ&シームレスサウンドプレーヤー( RoyalTurkey Markstein)

■作品名:フル独立可動鍵盤付き自動ピアノ&シームレスサウンドプレーヤー
■作者名: RoyalTurkey Markstein
■カテゴリ:アミューズメント


================================================================
■□■ フル独立可動鍵盤、及び自動演奏機能
================================================================
---------------------------------------------------------------------------------------------------------------------------------
■ 機能概要
---------------------------------------------------------------------------------------------------------------------------------
独自仕様のテキスト演奏データ(RPM形式)を読み込みリアルタイムで自動演奏するピアノです。
展示物は、該当機能を組み込んだ販売(予定)商品とほぼ同等のもので、自動演奏以外の機能も
多く内蔵されていますが、自動演奏機能以外の説明はこのノートでは割愛させて頂きます。

また、今回のLSLCONでは、会場への負荷の軽減のため可動鍵盤の数を3分の2にした低プリム
タイプでの設置となっています。

このシステムでは、独立した鍵盤が全て固有のサウンドを内蔵し、鍵盤を個別にタッチで演奏
することが可能です。また、独自仕様の演奏情報を記述したノートカードより読み込み、自動演奏
させることが可能です。

演奏データは、ステップ方式で、各ステップがそれぞれステップタイム(ミリ秒単位)を持ち、
ステップ1から順に進行します。例えばステップタイムが1000(1秒)なら、ステップの長さは
BPM60の場合の四分音符に相当し、タイムが500であれば、八分音符に相当します。

それぞれのステップには、アニメ再生、楽譜表示などの付加情報と、鍵盤を弾く、離す、ペダルを
踏む、離すといった演奏データが含まれ、各演奏データには、ステップの開始タイミングからの
ディレイタイムを設定できます。

ディレイにより、同じステップ内でも時間差をつけて鍵盤やペダルの操作が可能と鳴りますので、
細かい装飾音などでも、ステップを分けることなく表現することが可能です。

---------------------------------------------------------------------------------------------------------------------------------
■ 工夫した点
---------------------------------------------------------------------------------------------------------------------------------
● 演奏時の処理
実際に自動演奏データを読み込むとき、1つのスクリプトが全ての情報を保持するのではなく、
各鍵盤の演奏情報は、各鍵盤に保存されます。
ハンドベルの奏者が、自分が鳴らすベルのタイミングを覚えるのと同じように、自動演奏時には
メインスクリプトから全ての鍵盤にステップ番号のみが送られ、それぞれの鍵盤に記憶された
演奏情報に従って、発音と消音を行います。

ステップ情報に従って発音などの動作を行った後、各鍵盤はすぐに次に動作するステップと発音の
音量やタイミングを読み込み、次のステップ番号を受信したら直ちに次の動作を行えるように
自ら備えます。

これにより、演奏時のスクリプト処理に起因する、発音タイミングの遅れを極力少なくしようと
しています。

※但し現状では、発音関数そのものの実行タイミングが正確であっても、ネットワーク速度や、
ローカルの負荷によるビューワそのものの遅延のため、実際の演奏には常時、若干のもたつきが
あります。場合によっては、音楽にならない程度まで演奏がぼろぼろになる場合もあります^^;


● 曲データローディングの複数バンク化
前項の読み込みデータの分散保存により、より大きなサイズのデータをロード可能となりましたが、
それでは同時に1つのデータしか読み込めません。そこで、ルートのメインスクリプトと、鍵盤の
スクリプトに対し、それぞれデータ保管場所としてのサブスクリプトを作り、スクリプト1つにつき
1曲分のデータを保存可能にしています。
これによって同時にロードできる曲数は5曲となり、加えてリピート再生、連続再生などの動作も
可能となりました。


● 鍵盤動作の並列処理
SLでは、どうしても発音関数の実行からビューワでの実際の発音までに若干のタイムラグが発生
します(ダウンロードによるタイムラグはまた別として)が、さらにその都度、鍵盤を上下に動作
させている為、単一スクリプトでは同一鍵盤の連打が出来ず、自動演奏では早いフレーズの処理の
遅延による演奏の崩れが目立ちます。

そこでタッチ演奏時の連打や、自動演奏時の速いフレーズに出来る限り対応するため、全ての鍵盤に
複数のスクリプトを内蔵し、並列処理しています。

当初、単純に並列処理化しただけでは、タッチで連打した後、鍵盤のみ遅れてしばらく上下したり、
タッチを離しているのに鍵盤が下がったまま、あるいは逆の状態になる場合もありました。

そこで、鍵盤を下げるスクリプト、上げるスクリプトは、タッチ(スタート、エンド)イベントが
発生しても前回のイベント発生から一定時間(0.2秒)の間は動作せず、さらにもう1つの
スクリプトが、タッチスタートまたはタッチエンドのどちらか最後に発生したイベントに合わせ、
ごくわずかなスリープの後、正しい状態になるようにFixします。

さらに鍵盤のタッチライト機能などの演出用スクリプトなども含め、1つの鍵盤につき6個の
スクリプトが内蔵されています。

システム的にはもう少し減らす事も可能ですが、鍵盤のメインスクリプト以外は前述の演奏データの
保管メモリとしての役割も果たしているため、それぞれのスクリプトの処理を出来る限り簡略化、
軽量化する方向で調整をしています。


================================================================
■□■ シームレスサウンドプレーヤー機能
================================================================
---------------------------------------------------------------------------------------------------------------------------------
■ 機能概要
---------------------------------------------------------------------------------------------------------------------------------
このピアノには、独立鍵盤を使った自動演奏とは別に、シームレスサウンドプレーヤーとしての機能も
内蔵しています。

これは従来のSLピアノのような、10秒以下に分割されたサウンドファイルを使った音楽再生ですが、
SSP(シームレスサウンドプレーヤー)ユニットとサウンドファイルに施した特殊処理により、再生時に
クリップノイズの発生しない綺麗な音楽再生を、土地の音楽を使わずに実現しています。

この再生には、自動演奏とは別の形式(RPP形式)のノートカードを読み込みます。
ノートカードには、再生時のに表示する楽譜や楽曲情報、サウンドファイルのUUIDなどの情報が
内蔵されています。

---------------------------------------------------------------------------------------------------------------------------------
■ 工夫した点
---------------------------------------------------------------------------------------------------------------------------------
● 基本的には、サウンドをllLoopSoundMaster,llPlaySoundSlaveの同期再生関数を使い、マスターを
ループ再生しながらスレーブを順次再生し、開始タイミングを同期させることで、分割したサウンド間の
再生タイミングを揃えています。

しかし、単に同期再生関数を使うだけでは、サウンドの切れ目で発生するクリップノイズを無くす事は
できません。そのため、アップロードするサウンドファイルにも特殊な処理を行っています。

分割された各サウンドに0.5秒間の重なり部分を作り、クロスフェード処理を施しています。


● また、スレーブとして同期再生を行うプリムは、右クリックなどで選択状態になると、その時点で
プリムからの発音が停止するという欠点があります。これは左クリック(タッチ)と違い、スクリプト的に
回避することは不可能です。

正確には、選択状態になった瞬間と選択が解除された瞬間に、その時点で発音しているサウンドのみが
停止します。

そのため、SSPユニットを別オブジェクトとしてピアノ内部に隠し、左クリックされ辛くしてあります。
但し、プリム数を数える目的などで、オブジェクト全体を範囲選択をされてしまったりすると、やはり
発音が止まります。


● RPMやRPPの再生では、プリムから音を出すために、土地の音楽に比べ、音量が小さくなりがちです。
特にRPP形式では、同時に聴こえるサウンドファイルは常に1つであるため、ピアノから離れた人にはかなり
小さな音量でしか音楽が聴こえません。

もちろんアップロードする楽曲の分割前のwavにはノーマライズ(音量最大化)処理を施していますが、
例えば同じ曲ファイルを土地のメディアで流した場合に比べて、ピアノに近づかない限りはかなり小さな
音になってしまいます。
当初3プリムであったSSPユニットは、音量をふやす目的で、5プリムとなっています。
これにより、実際には、最低でも同時に2つのプリムから同じ音が出ています。

そこで、SSPユニット自体をサテライトスピーカーとして配置することも可能になっています。
全てのサテライトスピーカーは本体で再生されるマスター(無音ファイル)のサウンドが聴こえる
(無音ですが、理論的に届く距離)範囲内である限り、完全に同期し、設置したスピーカー分だけ
音量を増幅することが出来ます。

================================================================
■主要な機能として使っているLSL関数など
================================================================

llPlaySound,llLoopSoundMaster,llPlaySoundSlave


================================================================
■自己紹介
================================================================
RoyalTurkey Markstein
2008年1月31日生まれ
ローヤルとかロイヤルとかロイさんとか呼ばれることもありますが、ターキーです。

ターキーなんだってば。

http://desigm.slmame.com/


展示場所: HERE




exhibit location : HERE