language : Japanese | English

SAL(世界樹アプリケーション言語)

ホーム サンプル リファレンス ダウンロード 購入 FAQ フォーラム 作者


サンプル

ここでは、SALのスクリプトファイル(*.sal)のサンプルを展示します。サンプルは自由にコピーしてご使用になれます。以下のサンプルは、zipファイルの中salファイルとして含まれております。SALを実行するには、「編集(E)」-「SAL(Sekaiju Application Language)...」から、salファイルを選択してください。

Hello World!

以下に簡単なSALスクリプトの例を示します。まずは単純なHello Worldの表示からです。pauseコマンドはメッセージボックスを表示させます。

(do
 (pause "Hello World!")
)

特定イベントの値を変更する。

次のスクリプトは、選択されているすべてのノートイベントのベロシティを10だけ上げます。forEachEventは、選択されているすべてのイベントを評価します。SALでは、MIDIの規則に反しない限り、あらゆる種類のイベントのあらゆる値を変更することができます。

(do
 (forEachEvent
  (if (== Event.Kind NOTE)
   (do
    (+= Note.Vel 10)
   )
  )
 )
)

特定イベントのトラックを変更する。

CALでは困難なトラック移動もSALでは簡単です。次のスクリプトは、Event.Trackを用いて、選択されたピッチベンドイベントを次のトラックに移動します。

(do
 (forEachEvent
  (if (== Event.Kind WHEEL)
   (+= Event.Track 1)
  )
 )
)

ノートイベントにモジュレーションやエクスプレッションを一括自動挿入。

ノート発音開始から29ティック後にCC#1-モジュレーション=32が挿入されます。ノートオン毎に0に戻って解除されます。単調に打ち込まれたフルート・オーボエやトロンボーン等の管楽器の表現力が向上します。insertは、新たにイベントを挿入します。SALでは、MIDIの規則に反しない限り、あらゆる種類のイベントを挿入することができます。

(do
 (forEachEvent
  (if (== Event.Kind NOTE)
   (do
    (int nTime Event.Time)
    (int nCh Event.Chan)
    (int nDur Note.Dur)
    (insert (+ nTime -1) nCh CONTROL 1 0)
    (if (>= nDur 29)
     (insert (+ nTime 29) nCh CONTROL 1 32)
    )
   )
  )
 )
)

通常のボリュームイベント(CC#7)をマスターボリュームに変更する

CALでは困難なシステムエクスクルーシヴイベントの挿入も簡単です。次のスクリプトは、選択されたCC#7-Volumeイベントを、マスターボリュームに変換します。

(do
 (forEachEvent
  (if (== Event.Kind CONTROL)
   (if (== Control.Num 7)
    (do
     (int nTime Event.Time)
     (int nVal Control.Val)
     (insert nTime -1 SYSXDATA 240 127 127 4 1 0 nVal 247)
     (delete)
    )
   )
  )
 )
)

ユーザー定義のアルペジエーター

ユーザー定義のアルペジエーターを作ることも可能です。次のスクリプトは、major系の16分音符に分散和音化するもので、ドの単音はドミソドミソドミ…、レの単音はレファ#ラレファ#ラレファ#…へと自動的に一括変更します。

(do
 (int nTime 0)
 (int nCh 0)
 (int nInterval (/ TIMEBASE 4))
 (int nPos 0)
 (int nKey 0)
 (int nVel 0)
 (int nDur 0)
 (forEachEvent
  (if (== Event.Kind NOTE)
   (do
    (= nCh Event.Chan)
    (= nTime Event.Time)
    (= nDur Note.Dur)
    (= nKey Note.Key)
    (= nVel Note.Vel)
    (= nPos nTime)
    (while (< nPos (+ nTime nDur))
     (do
      (if (< nPos (+ nTime nDur))
       (insert nPos nCh NOTE (+ nKey 0) nVel nInterval)
      )
      (+= nPos nInterval)
      (if (< nPos (+ nTime nDur))
       (insert nPos nCh NOTE (+ nKey 4) nVel nInterval)
      )
      (+= nPos nInterval)
      (if (< nPos (+ nTime nDur))
       (insert nPos nCh NOTE (+ nKey 7) nVel nInterval)
      )
      (+= nPos nInterval)
      (if (< nPos (+ nTime nDur))
       (insert nPos nCh NOTE (+ nKey 12) nVel nInterval)
      )
      (+= nPos nInterval)
      (if (< nPos (+ nTime nDur))
       (insert nPos nCh NOTE (+ nKey 16) nVel nInterval)
      )
      (+= nPos nInterval)
      (if (< nPos (+ nTime nDur))
       (insert nPos nCh NOTE (+ nKey 7) nVel nInterval)
      )
      (+= nPos nInterval)
      (if (< nPos (+ nTime nDur))
       (insert nPos nCh NOTE (+ nKey 12) nVel nInterval)
      )
      (+= nPos nInterval)
      (if (< nPos (+ nTime nDur))
       (insert nPos nCh NOTE (+ nKey 16) nVel nInterval)
      )
      (+= nPos nInterval)
     )
    )
    (delete)
   )
  )
 )
)

重なっている音符を一括トリム

Bavi_H (Robert Hart)様が、重なっている音符を一括トリムするSALスクリプトを書いておられます。詳しくは、こちらのサイトをご覧くださいませ。本当にありがたい限りです。


(C)2017-2022 くず All rights reserved.