dspreset - DTMプログラミング言語探訪

[DTMプログラミング言語探訪](https://qiita.com/aike@github/items/77b3eccc6861de09513a)

# dspreset

## 概要

dspresetはサンプラーソフト[Decent Sampler](https://www.decentsamples.com/product/decent-sampler-plugin/)のライブラリを定義するためのフォーマットです。テキストファイル(.dspreset)とひとつ以上のサンプルファイル(.wavなど)のセットで構成されます。
dspresetはプログラミング言語と呼べるほどのロジック記述能力はありません。基本的にどのサンプルファイルをどこの鍵盤にマッピングするかを指定する設定ファイルです。ループポイントの設定、ベロシティレイヤ、リリーストリガ、ラウンドロビン、そしてVolume、EG、LFOなどのパラメータとそのGUIの設定も記述できる言語になっています。

## 用途

- サンプルとノートナンバーのマッピング
- サンプルとベロシティのマッピング
- エフェクトパラメータ設定
- GUI

## 言語仕様

- XMLベースの独自言語
- マッピング設定
- パラメータ設定
- GUI設定

SFZと同様にあくまでもサンプラー用ライブラリの定義ファイルであり、チューリング完全を満たすプログラミング言語ではありません。SFZとの主な相違として、GUIが定義できる、変数の利用やキースイッチの設定ができないという点があげられます。

[公式リファレンス](https://www.decentsamples.com/wp-content/uploads/2020/06/format-documentation.html)

## GUI仕様

背景画像、ラベル、ノブが用意されています。タブ切り替え用のタグもありますが、現状タブはひとつしか持てないとのことです。
ノブにstyle属性を設定することで円形だけでなく縦や横のスライダーも作成できます。ノブの色は設定可能、画像ファイルを使用した独自デザインのノブは作成できません。


## プログラム例

### ノートナンバーとサンプルのマッピング

ひとつのサンプルが鍵盤ひとつに対応している場合の書き方です。
loNote、hiNoteは省略可能な属性ですが省略すると0～127まで自動で割り当たってしまうために他の鍵盤に割り当てたくないときは明記する必要があります。

```xml:simple.dspreset
<?xml version="1.0" encoding="UTF-8"?>
<DecentSampler>
  <groups>
     <group>
        <sample rootNote="60" loNote="60" hiNote="60" path="c4.wav" />
        <sample rootNote="61" loNote="61" hiNote="61" path="c#4.wav" />
        <sample rootNote="62" loNote="62" hiNote="62" path="d4.wav" />
        <sample rootNote="63" loNote="63" hiNote="63" path="d#4.wav" />
        <sample rootNote="64" loNote="64" hiNote="64" path="e4.wav" />
     </group>
  </groups>
</DecentSampler>
```

ノートナンバー60-71の範囲はc4.wavを、ノートナンバー72-83の範囲はc5.wavを鳴らす範囲指定の例。

```xml:noterange.dspreset
<?xml version="1.0" encoding="UTF-8"?>
<DecentSampler>
  <groups>
     <group>
        <sample rootNote="60" loNote="60" hiNote="71" path="c4.wav" />
        <sample rootNote="72" loNote="72" hiNote="83" path="c5.wav" />
     </group>
  </groups>
</DecentSampler>
```


### ベロシティとサンプルのマッピング

弱く弾いた場合と強く弾いた場合でサンプルを切り替える例。ベロシティ1-63はsoft.wavを、ベロシティ64-127のときはhard.wavを鳴らします。

```xml:velocity.dspreset
<?xml version="1.0" encoding="UTF-8"?>
<DecentSampler>
  <groups>
     <group>
        <sample rootNote="60" loNote="60" hiNote="83" loVel="1"  hiVel="63"  path="soft.wav" />
        <sample rootNote="60" loNote="60" hiNote="83" loVel="64" hiVel="127" path="hard.wav" />
     </group>
  </groups>
</DecentSampler>
```

### GUI

背景画像とボリュームノブを配置する例です。
背景画像は812x375にしないとウィンドウいっぱいにうまく表示されないようです。

```xml:ui.dspreset
<?xml version="1.0" encoding="UTF-8"?>
<DecentSampler>
  <groups>
     <group>
        <sample rootNote="60" loNote="60" hiNote="71" path="c4.wav" />
        <sample rootNote="72" loNote="72" hiNote="83" path="c5.wav" />
     </group>
  </groups>
  <ui bgImage="panel2.png" width="812" height="375">
    <tab name="main">
      <labeled-knob x="350" y="40"
        label="VOLUME" textSize="20"
        type="float" minValue="0" maxValue="1" value="0.5">
        <binding type="amp" level="instrument" position="0" parameter="AMP_VOLUME" />
      </labeled-knob>
    </tab>
  </ui>
</DecentSampler>
```

表示例
![dspreset.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/7543bf8f-a6d0-f44e-9ec8-c6d0c6bb8b66.png)



## 実行方法

あらかじめ.dspresetファイルと、そこで使用するサンプルファイルを用意しておきます。

右上のFILE...メニューからLoad...をクリックしてdspresetファイルを選択します。
![dspreset2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/2f94bae5-d3f5-0719-2629-50f523f04f68.png)

dspresetファイルを編集するためのエディタ呼び出し機能はありません。


## 感想

SFZから機能を取捨選択して整理しなおしたようなコンパクトですっきりした仕様は好印象です。GUIが簡単に設定できるのはやはり大きいですね。
いまのところDecent Samplerしか対応アプリケーションがないものの、サードパーティのライブラリも徐々に増えているようなのでこの先要注目のフォーマットだと思います。
ここまで設計がきれいなわりにキースイッチの機能がないのは意図的なものだと思いますが、少し残念な気もします。

[DTMプログラミング言語探訪](https://qiita.com/aike@github/items/77b3eccc6861de09513a)