# BambooTracker
[![GitHub release](https://img.shields.io/badge/release-v0.1.5-orange.svg)](https://github.com/rerrahkr/BambooTracker/releases)
![Platform: win-32 | linux](https://img.shields.io/badge/platform-win--32%20|%20linux-lightgrey.svg)
[![GitHub](https://img.shields.io/github/license/rerrahkr/BambooTracker.svg)](./LICENSE)

![Example](./img/overview.gif)

このアプリケーションはNEC PC-8801/9801シリーズに搭載されていたFM音源YM2608(OPNA)向けのトラッカーです。

## 用語解説
トラッカーで作成される1データ(ファイル)をモジュールと呼びます。モジュールは複数のソング(曲データ)とインストゥルメント(音色)、各ソング共通の設定を持ちます。  
ソング中では各音源のチャンネルがトラックに割り当てられ、トラックはパターン(演奏パターン)を複数保持します。  
パターンはソングのオーダーに登録することで演奏されます。オーダーはリストになっており、先頭から順に演奏されていきます。  
パターンはステップが時系列順に並ぶ構造をしています。ノートオン/オフやほとんどのエフェクトはステップ単位で記述されます。  
ティックは最小の演奏単位で、1ステップ=nティックといった関係になります。カウント単位で変化する効果(ビブラートなど)はティックを基準にしています。

## インターフェース概要
### インストゥルメントリスト
インストゥルメントリストではモジュールで使用されるインストゥルメント(音色データ)を管理します。モジュール内の全てのソングはここに登録されているインストゥルメントを共有します。インストゥルメントは最大で128個登録できます($00-7F)。

### インストゥルメントエディタ
インストゥルメントをダブルクリックするとインストゥルメントエディタが開き、そのインストゥルメントを編集することができます。  
インストゥルメントはその設定(プロパティ)を他のインストゥルメントと共有することができます。プロパティを共有しているインストゥルメントは各プロパティ内のUsersに番号が表示されます。

インストゥルメントエディタには演奏シーケンスを設定できるものがあります。シーケンスエディタは1列が1ティックに対応しています。  
またシーケンスのループ/リリースポイントの指定にも対応しています。左クリックでポイント作成またはカウント増加/タイプ変更、右クリックでポイント削除またはカウント減少します。ポイントのエッジをドラッグすることで位置を移動できます。  
リリースのタイプはSSGのエンベロープ設定のみ以下の3種類から選択できます。

- Fix: キーオフ時にリリースポイントから指定通りの音量で実行
- Absolute: キーオフ時の音量に到達するリリースポイント後の最初の地点から実行
- Relative: キーオフ時に音量を最大音量としてリリースポイントから実行

#### FMエディタ
FMエディタでは、

1. エンベロープ
2. LFO
3. オペレーターシーケンス
4. アルペジオ
5. ピッチ

のプロパティを設定できます。

エンベロープはMMLなどのテキストデータを貼り付けして読み込むことができます。テキストフォーマットは設定で追加・変更を行うことができます。デフォルトではFMP、FMP7、MMLDRV、MUCOM88、MXDRV、NRTDRV(`VOICE_MODE=0`)、PMD、VOPMが登録されています。  
この機能ではテキスト中の数字を出現順に読み込んでいきます。デフォルトのフォーマットを使用する際には予め音色名、コメントに含まれる数字を削除する必要があります。

#### SSGエディタ
SSGエディタでは、

1. 波形
2. トーン/ノイズ
3. エンベロープ
4. アルペジオ
5. ピッチ

のプロパティを設定できます。  
矩形波以外の波形を使用している間はソフトウェアエンベロープは無効になります。

### オーダーリスト
オーダーリストではパターン番号を演奏する順番に登録していきます。行がオーダー、列がトラックに対応しています。
リストの最大長は256($FF)です。

### パターンエディタ
パターンエディタではノートオンなどのイベントを時系列順に登録していきます。行はステップを表します。列はトラック毎に左から

1. 音符
2. インストゥルメント番号
3. 音量
4. エフェクト1の前2文字
5. エフェクト1の後2文字
6. エフェクト2の前2文字
7. エフェクト2の後2文字
8. エフェクト3の前2文字
9. エフェクト3の後2文字
10. エフェクト4の前2文字
11. エフェクト4の後2文字

を表しています。エフェクト2-3はヘッダーの+, -ボタンで表示/非表示を選択できます。  
パターンはトラックごとに最大で256個($00-FF)まで作成できます。

### 設定フィールド
設定フィールドでは、モジュールのメタデータやソングの演奏についての設定が行えます。

#### Tick frequency
ティックの周波数を設定します。60HzでNTSC、50HzでPAL相当になります。

#### Tempo
ソングのテンポを指定します。なお、ここでのテンポはbpmとは異なり、単に早さの指標です。  
0Fxxエフェクトで指定することもできます。

#### Speed
1ステップにおける目安のティック数を設定します。Tempoによってこの値は実行時に変化することがあります。  
0Fxxエフェクトで指定することもできます。

#### Pattern size
デフォルトのパターン中のステップの個数を設定します。最小値は1、最大値は256です。

#### Groove
グルーヴエディタで設定したグルーヴ番号を指定します。グルーヴを利用する場合、他の演奏速度の設定はすべて固定されます。  
0Oxxエフェクトで指定することもできます。

## ショートカット
### 全般
| キー   | コマンド                                   |
| ------ | ------------------------------------------ |
| Ctrl+N | モジュール新規作成                         |
| Ctrl+O | モジュールを開く                           |
| Ctrl+S | モジュール保存                             |
| Ctrl+P | モジュール設定                             |
| Ctrl+I | 選択中のインストゥルメントのエディタを開く |
| Return | 再生/停止                                  |
| F5     | Songの最初から再生                         |
| F6     | パターンを再生                             |
| F7     | カーソル位置から再生                       |
| F8     | 停止                                       |
| Space  | Jam/Editモード切替                         |
| Alt+O  | オーダーリストへ移動                       |
| Alt+P  | パターンエディタへ移動                     |
| F12    | 音声リセット                               |

### オーダーリスト
| キー     | コマンド                                               |
| -------- | ------------------------------------------------------ |
| Ctrl+C   | 選択範囲コピー                                         |
| Ctrl+V   | 貼り付け                                               |
| Ctrl+A   | 1回目:現在のトラックの全オーダ選択, 2回目:オーダ全選択 |
| Ctrl+D   | オーダーをコピーし次のオーダーとして挿入               |
| Alt+D    | 選択したパターンをクローンしてその位置に置き換える     |
| Home     | 最初のオーダーへジャンプ                               |
| End      | 最後のオーダーへジャンプ                               |
| PageUp   | 前へオーダージャンプ                                   |
| PageDown | 後ろへオーダージャンプ                                 |
| Insert   | オーダー挿入                                           |
| Delete   | 現在のオーダーを削除し詰める                           |
| Escape   | 選択解除                                               |

### パターンエディタ
| キー          | コマンド                                                                   |
| ------------- | -------------------------------------------------------------------------- |
| Ctrl+C        | 選択範囲コピー                                                             |
| Ctrl+X        | 選択範囲カット                                                             |
| Ctrl+V        | 貼り付け                                                                   |
| Ctrl+M        | Mix貼り付け                                                                |
| Ctrl+A        | 1回目:現在のパターン・トラックの全ステップ選択, 2回目:現在のパターン全選択 |
| Ctrl+G        | 選択範囲のコマンド補完                                                     |
| Ctrl+R        | 選択範囲のコマンドを逆転                                                   |
| Ctrl+F1       | 選択範囲または現在のノート半音下げる                                       |
| Ctrl+F2       | 選択範囲または現在のノート半音上げる                                       |
| Ctrl+F3       | 選択範囲または現在のノートオクターブ下げる                                 |
| Ctrl+F4       | 選択範囲または現在のノートオクターブ下げる                                 |
| Alt+F9        | 現在のトラックをミュート                                                   |
| Alt+F10       | 現在以外のトラックをミュート                                               |
| Alt+S         | 選択範囲のインストゥルメントを現在の物に変更                               |
| Tab           | 次のトラックへ移動                                                         |
| BackTab       | 前のトラックへ移動                                                         |
| Home          | パターンの最初のステップへジャンプ                                         |
| End           | パターンの最後のステップへジャンプ                                         |
| PageUp        | 前へステップジャンプ                                                       |
| PageDown      | 後ろへステップジャンプ                                                     |
| Ctrl+Up       | 前のハイライトされたステップへジャンプ                                     |
| Ctrl+Down     | 後ろのハイライトされたステップへジャンプ                                   |
| Insert        | ステップ挿入                                                               |
| BackSpace     | 前のステップを削除し詰める                                                 |
| Delete        | 現在のステップのデータ削除                                                 |
| Escape        | 選択解除                                                                   |
| -             | キーオフ                                                                   |
| \* (テンキー) | 入力オクターブアップ/エコーバッファ番号選択                                |
| / (テンキー)  | 入力オクターブダウン/エコーバッファ番号選択                                |
| ^             | エコーバッファ                                                             |

音符はキーボードを鍵盤に見立てて入力します。

```
現在のオクターブ+1
 2 3  5 6 7  9
Q W ER T Y UI O

 現在のオクターブ
 S D  G H J  L
Z X CV B N M, .
```

## 音量値
|      | 最大 | 最小 |
| ---- | ---- | ---- |
| FM   | 7F   | 00   |
| SSG  | 00   | 0F   |
| Drum | 00   | 1F   |

FMの順番は逆転することができます。 (Configuration -> General -> Reverse FM volume order).

## パターンエフェクト
| エフェクト | FM                                                                                                                        | PSG                        | ドラム                               |
| ---------- | ------------------------------------------------------------------------------------------------------------------------- | -------------------------- | ------------------------------------ |
| 00xy       | アルペジオ (x[0-f]: 第2音, y[0-f]: 第3音)                                                                                 | アルペジオ                 | -                                    |
| 01xx       | ポルタメント・アップ (xx[00-ff]: デプス)                                                                                  | ポルタメント・アップ       | -                                    |
| 02xx       | ポルタメント・ダウン (xx[00-ff]: デプス                                                                                   | ポルタメント・ダウン       | -                                    |
| 03xx       | トーン・ポルタメント (xx[00-ff]: デプス)                                                                                  | トーン・ポルタメント       | -                                    |
| 04xy       | ビブラート (x[0-f]: ピリオド, y[0-f]: デプス)                                                                             | ビブラート                 | -                                    |
| 07xy       | トレモロ (x[0-f]: ピリオド, y[0-f]: デプス)                                                                               | トレモロ                   | -                                    |
| 08xx       | パン (xx: 00=無音, 01=右, 02=左, 03=中央)                                                                                 | -                          | パン                                 |
| 0A0x       | ボリューム・スライドダウン (x[0-f]: デプス)                                                                               | ボリューム・スライドダウン | -                                    |
| 0Ax0       | ボリューム・スライドアップ (x[0-f]: デプス)                                                                               | ボリューム・スライドアップ | -                                    |
| 0Bxx       | ポジションジャンプ (xx: オーダ番号)                                                                                       | ポジションジャンプ         | ポジションジャンプ                   |
| 0Cxx       | ソング・エンド (xx: 任意の値)                                                                                             | ソング・エンド             | ソング・エンド                       |
| 0Dxx       | パターン・ブレーク (xx: 次のオーダの開始ステップ)                                                                         | パターン・ブレーク         | パターン・ブレーク                   |
| 0Fxx       | スピード/テンポチェンジ (xx[00-1f]: スピード, [20-ff]: テンポ)                                                            | スピード/テンポチェンジ    | スピード/テンポチェンジ              |
| 0Gxx       | ノート・ディレイ (xx[00-ff]: ディレイカウント)                                                                            | ノート・ディレイ           | ノート・ディレイ                     |
| 0Oxx       | グルーブ (xx[00-ff]: グルーブ番号)                                                                                        | グルーブ                   | グルーブ                             |
| 0Pxx       | デチューン (xx[00-ff]: xx-80だけデチューン)                                                                               | デチューン                 | -                                    |
| 0Qxy       | ノート・スライドアップ (x[0-f]: カウント, y[0-f]: 半音数)                                                                 | ノート・スライドアップ     | -                                    |
| 0Rxy       | ノート・スライドダウン (x[0-f]: カウント, y[0-f]: 半音数)                                                                 | ノート・スライドダウン     | -                                    |
| 0Sxx       | ノート・カット (xx[01-ff]: ディレイカウント)                                                                              | ノート・カット             | ノート・カット                       |
| 0Txy       | トランスポーズ・ディレイ (x[1-7]: ディレイカウント(上向き変化), [9-f]: x-8分ディレイカウント(下向き変化), y[0-f]: 半音数) | トランスポーズ・ディレイ   | -                                    |
| 0Vxx       | -                                                                                                                         | -                          | マスターボリューム (xx[00-3f]: 音量) |
| Mxyy       | ボリューム・ディレイ (x[1-f]: ディレイカウント, yy[00-ff]: 音量)                                                          | ボリューム・ディレイ       | ボリューム・ディレイ                 |

## ファイル入出力
### モジュール
.btm (BambooTracker module file)の読み込み・書き出しに対応しています。

### インストゥルメント
以下のフォーマットの読み込み対応しています。

- .bti (BambooTracker instrument file)
- .dmp (DefleMask preset file)
- .tfi (TFM Music Maker instrument file)
- .vgi (VGM Music Maker instrument file)
- .opni (WOPN instrument file)
- .wopn (WOPN bank file)
- .y12 (Gens KMod dump file)
- .ins (MVSTracker instrument file)

また、FMエンベロープはプレーンテキストの読み込みにも対応しています。

書き出しは.btiのみ可能です。

### エクスポート
以下のファイルにエクスポートが可能です。

- .wav (WAVE file)
- .vgm (VGM file)
- .s98 (S98 file)

## Linuxでのビルド方法
Ubuntu 18.04:

### 必要なパッケージ
> make  
> Qt5 (qmake)  
> Qt5 Multimedia  
> Qt5 Multimedia plugins

```bash
sudo apt-get install \
  build-essential \
  qt5-default qtmultimedia5-dev libqt5multimedia5-plugins
```

### コンパイル
```bash
cd BambooTracker
qmake
make
```

## FreeBSDでのパッケージのインストールまたはビルド
### ビルド
To build the BambooTracker via FreeBSD ports
```bash
cd /usr/ports/audio/bambootracker
make install clean
```

### パッケージ
To install the package
```bash
pkg install bambootracker
```

## DebianまたはUbuntuでのパッケージのインストール
`apt-get install bambootracker`

## Changelog
*[CHANGELOG.md](./CHANGELOG.md)を参照してください。*

## License
このプログラム及びソースコードのライセンスははGNU General License Version 2です。

*[LICENSE](./LICENSE)とライブラリに関して[list.md](./licenses/list.md)も参照してください。*

## クレジット
このアプリの作成において、以下の方々にお世話になっております。ありがとうございます。

- Qt
- YM2608のエミュレーションコードに関してMAME開発チームさんとValley Bellさん
- ツールバーに使用しているアイコンに関してMark Jamesさん
- VGMファイルのフォーマットのドキュメントに関してVGMRipsチームの方々
- トラッカーのUIやルーチンに関して多くのトラッカー作成者様、特に0CC-FamiTrackerのHertzDevilさん、Deflemask TrackerのLeonardo Demartino (delek)さん、GoatTrackerのLasse Öörni (Cadaver)さん
- トラッカーのアイコンに関してDecidettoさん
- WOPNインストゥルメントのフォーマットファイルに関してVitaly Novichkov (Wohlstand)さん
- S98ファイルのフォーマットのドキュメントに関してRu^3さん
- SCCIライブラリに関してSCCI開発チームの方々
- そしてこのプロジェクトに手助けしてくださるみなさん!
