活動記録Blogです。note_off今回は、かなりマニアックな内容です。ちなみに気になったことなどあれば、ツイッターのほうにでも連絡ください。レガートを制作する上で、KONTAKT内でグループ単位のサンプルのディレイが必要になった。グループ単位で音を遅らせる方法がこれといって無い。そこで、waitとplay_noteの検証をした。現在押されているキーの数を数えるための$Stackを用意した。KMG7を制作中、これにかなり悩まされたので、改めて検証。onキー50をonにしたとする。この場合、50キーオンから1秒たつ前にキーを放すと・60の音は鳴らない。releaseはコールバックされない。releaseだけ働くっぽい)50キーオンから1秒経過させると・60の音が鳴る。releaseはコールバックされる。onキー50をonにしたとする。この場合、50キーオンから1秒たつ前にキーを放しても・60の音は鳴る。releaseはコールバックされない。releaseだけ働くっぽい)50キーオンから1秒経過させると・60の音が鳴る。releaseはコールバックされない。releaseのみ働くっぽい)・60の音は、サンプルが終わるか、fade_outまたはnote_offを使用しなければ止まらない。onとすると、50キーオフで、音は50も60も止まる。releaseは1つ分だけ働き、note_offによる重複はないっぽい。キーオンを和音にすると、$Eve_IDが順次上書きされ、note_offは最後の一つの音しか消えない。これを回避するには、play_note時の$Eve_IDを%Eve_ID[$EVENT_NOTE]にするなどの必要がある。whileとすれば、オフにしたキーのみ消えてくれて、全部放すと全部消えてくれる。play_noteが開始になってからでないと消えない(1秒経過前にキーオフすると1秒経過後に音が鳴り出し、なり続ける)###########################もう一つ注意があるようです。音が鳴っている間、CC1を動かしまわって、$Stackの動きを観察した。noteの中でplay_noteは、循環しないらしい。いうのは、50キーを押しっぱなしにしたとき、$stackが1以上増えないからである。onの場合も同じであった。onrelaese内でのnote_offも循環しないようである。releaseがコールバックされるようで、$Stackが減ります。noteをコールバックしないっぽい?です。on↑これで50キーを押しっぱなしにして2秒以上の間CC1を動かしまわってメッセージを見ると1秒後に1になって2秒後に0になるのがわかります。release内で使うと、共にキーオフ後でもplay_noteの音がなりっぱなしになるようです。onこれは、note_offがなくても、1秒以後にキーを放せば、play_noteの音も止まるがreleaseが2個ずつ働くため、3和音を鳴らすと、1秒以後にキーを放すと$Stackは-3になってしまう。onこちらは、note_offをセットしなければ1秒以後に音が消えてくれないが、1秒以後にキーを放せば、play_noteの音はnote_offにより止まる。release内のnote_offは循環しないようなので、3和音を鳴らし、1秒以後にキーを放しても$Stackは正常に0に戻る。問題は、一度キーをオンにすると、1秒以内にキーをオフにしても、1秒後に60の音が鳴り始めてしまうことである。(オンにしたキーが生きていればplay_noteを起動するという方法も取れるかもしれないがややこしくなる)つまり前者の場合、play_noteの音が鳴り始めたあとにキーオフすると、$stackが-(マイナス)に後者の場合、$Stackに異常は発生しないが、無条件に音が鳴ってしまうという。そこで偶然良い結果を見つけたので、記しておきます。release内でnote_offをセットします。すると、3和音キーオフ時にreleaseが重複し$stackが結果的に-3になるかと思いきや、かなりめちゃくちゃな演奏をしても、$Stackが必ず0に戻りました。onこれで、1秒後にグループ"Legato"のキーが鳴り、キーオフで遅れた音も消える、そして$Stackに異常も発生しないプログラムのできあがりです。(保障しませんが)これを応用すると、1つのキーオンで2つ以上の任意の音をつないでレガートを作れるはずです。$Stackが0のときは通常のグループを鳴らし、$Stack>0のときは、このディレイを使って、2つ以上の音をつなげるLegatoグループを鳴らすというわけです。KSPの説明書を読むと、コールバック関係のことはしっかり書いてあるようなのですが、英語なので正確につかめないというのが、全ての元凶でした。説明書にディレイの作り方を書いてあるわけではないので、良しとしませんか・・・。実は現在制作中の音源には別の方法をとっています。ひと段落したら今回の方法を試したいと思います。不具合があればまた記事を修正なり、更新したいと思います。実際に音源に組み込んでみました。見事バグが発生しました。上のスクリプトでは1秒だったので気づかなかったのですが、waitをはさんでグチャグチャやると、$Stackに異常が発生しました。ここでは振れていませんが、消えるはずのノートが消えなかったりと、いろいろ不具合が出ました。releaseで消すことになり、$Stackが余分に減ってしまうのだと思います。releaseで消す(止める)と、play_noteを呼び出したノートを止めるreleaseとplay_noteを止めるreleaseの2つが働いてしまうようで、$Stackが1個余分に減ってしまうらしいことがわかりました。releaseは一つしか働いてないようで$Stackも1個しか減りませんでした。release自体で止めることとなり、$Stackが減ってしまった、と勝手に解釈しました。「後者の場合、$Stackに異常は発生しないが、無条件に音が鳴ってしまうという。」という方を採用しました。onこちらは、note_offをセットしなければ1秒以後に音が消えてくれないが、1秒以後にキーを放せば、play_noteの音はnote_offにより止まる。release内のnote_offは循環しないようなので、3和音を鳴らし、1秒以後にキーを放しても$Stackは正常に0に戻る。問題は、一度キーをオンにすると、1秒以内にキーをオフにしても、1秒後に60の音が鳴り始めてしまうことである。(オンにしたキーが生きていればplay_noteを起動するという方法も取れるかもしれないがややこしくなる)「たぶん」$Stackに異常はでません。そのかわり、小文字で表示したややこしい方法をとることにしました。いってもめんどくさかっただけでそんなにややこしくはないのですが。押したキーが生きてるか死んでるかを判断してやり、生きていればplay_noteするとしてやりました。これで、やっとwaitがからんでも、$Stackに異常なく正しい動作が可能となりました。(たぶんです)実際に組み込む際は、waitより前に設定する事項と、あとで設定する事項とがあります。それをしないと、正しく動作しません。不具合が出るかもしれませんが、ひとまず安心です。前回の記事(この記事の上のほう)は失敗作です。条件をつけてplay_noteの最後の引数を0にする方を使うことになりました。愛用のローランドA-90の鍵盤の中が折れました。購入から15年で3回目です。