ジェネレーターの準備
Extended Note Block(拡張音符ブロック)は多くのカスタムNBTタグを持っており、これらを利用することで、従来の音符ブロックよりも豊かな音楽効果を実現できます。これは、コマンドブロックや外部ジェネレーターを使用して音符ブロックを一括生成する場合に非常に役立ちます。
NBT構造の概要
Extended Note BlockのNBTデータは、主に基本属性と高度なデータ (AdvancedData) の2つの部分に分かれています。
基本属性 (Root)
これらの属性は、NBTのルートノード直下にあります。
| タグ名 | 型 | 説明 | 範囲/単位 | デフォルト値 |
|---|---|---|---|---|
note | Int | MIDIピッチ | 0-127 (60が中央C) | 60 |
velocity | Int | MIDIベロシティ (基本音量) | 0-127 | 100 |
sustainTime | Int | 音符の持続時間 | ゲームティック (Ticks, 20 ticks = 1秒) | 40 |
delayedPlayingTime | Int | 再生遅延時間 | ミリ秒 (ms) | 0 |
fadeInTime | Int | フェードイン時間 | ゲームティック (Ticks) | 0 |
fadeOutTime | Int | フェードアウト時間 | ゲームティック (Ticks) | 0 |
ブロック状態 (Block States)
NBTデータに加えて、Extended Note BlockはBlockStatesを使用してレッドストーン信号と視覚表現を処理します。
| 状態名 | 型 | 可能な値 | 説明 |
|---|---|---|---|
pitch | Enum | c, cs, d, ds, e, f, fs, g, gs, a, as, b | 1オクターブ内での現在の音符のピッチ(Note % 12)に対応します。主にリソースパックでブロックのテクスチャを変更するために使用されます。例えば、cs は C# を表します。 |
powered | Boolean | true, false | ブロックがレッドストーン信号によってアクティブ化されているかどうかを示します。信号エッジ(立ち上がり/立ち下がり)の検出に使用されます。 |
注意
setblock を使用してブロックを配置する場合、通常 pitch を手動で指定する必要はありません。ブロックがレッドストーンによってアクティブ化されると、NBT内の note 値に基づいて自動的にこの状態が計算および更新されるためです。
高度なデータ (AdvancedData Compound)
すべての高度な機能のデータは、AdvancedData という名前の複合タグ内に保存されます。ジェネレーターは正確な List データ構造を構築する必要があります。
1. ピッチベンド曲線 (PitchBendPoints)
- 型:
List<Compound> - 要素構造:
{t: <float>, v: <float>}t(Time): 時間点。範囲は0.0(開始) から1.0(終了) です。v(Value): 半音 (Semitones) のオフセット量。0.0: オフセットなし(元のピッチ)。12.0: 1オクターブ上。-12.0: 1オクターブ下。- 小数をサポートします。例:
0.5半音(50セント)。
- 補間動作: ゲームは2つのキーポイント間で線形補間を行います。
2. 音量エンベロープ (VolumePoints)
- 型:
List<Compound> - 要素構造:
{t: <float>, v: <float>}t(Time): 時間点。範囲は0.0から1.0です。v(Value): 音量倍率 (Multiplier)。1.0: 標準音量(velocityによって決定)。0.0: ミュート。2.0: 標準音量の2倍。
- 補間動作: ゲームは2つのキーポイント間で線形補間を行います。
- 上書きルール: このリストが空でない場合、NBTルートノードの
fadeInTime/fadeOutTimeは無効になります。
3. 音源移動パス (SoundPath)
- 型:
List<Compound> - 要素構造:
{x: <double>, y: <double>, z: <double>}- これらの座標は音符ブロックの中心に対する相対オフセットです。例えば
{x:0, y:1, z:0}は音符ブロックの1ブロック上を表します。
- これらの座標は音符ブロックの中心に対する相対オフセットです。例えば
- サンプリング動作: 曲線とは異なり、
SoundPathは線形補間を行いません。- ゲームは現在の再生進行度に基づいてインデックス
Index = Progress * (Size - 1)を計算し、対応する点の位置を直接取得します。 - 推奨: スムーズな移動が必要な場合、ジェネレーターは十分に密な点を生成する必要があります(例:
sustainTimeが40 ticksの場合、1 tickにつき1点、計40個のパス点を生成することを推奨します)。
- ゲームは現在の再生進行度に基づいてインデックス
4. GUI 数式キャッシュ (ExpressionX/Y/Z)
- 型:
String - これらは単なる文字列で、GUI内でユーザーが入力した数式(
sin(t * pi)など)を表示するために使用されます。
重要
ゲームのコアロジックは、これらの文字列を完全に無視します。外部ジェネレーターの場合、プレイヤーがGUIを開いたときに特定の数式を表示させたい場合を除き、これらの文字列を生成する必要はありません。生成する必要があるのは、上記の SoundPath リストです。
Setblock コマンドの例
/setblock コマンドを使用して、プリセットNBTデータを持つExtended Note Blockを配置できます。
基本例:
setblock ~ ~1 ~ extendednoteblock:extended_note_block{note:64, velocity:120, sustainTime:10}高度な例(ピッチベンドを含む):
setblock ~ ~1 ~ extendednoteblock:extended_note_block{note:60, sustainTime:40, AdvancedData:{PitchBendPoints:[{t:0.0f, v:0.0f}, {t:1.0f, v:12.0f}]}}注意事項
SoundPath と Expression の関係
AdvancedData 内に、SoundPath と ExpressionX/Y/Z が同時に存在している場合があります。
- Expr (数式):GUI インターフェースの表示と編集にのみ使用されます。ゲームは実行時にこれらの数式を計算しません。
- SoundPath (パス):これはゲームが実際に音声を再生する際に使用するパスデータです。
重要ポイント: ジェネレーターを作成する場合、必ず SoundPath リストデータを直接生成してください。単に Expression 文字列を書き込むだけでは無効であり、プレイヤーが手動でGUIを開いて保存しない限り、音源は移動しません(保存時にクライアントが数式に基づいてパス点を計算し、SoundPath に書き込みます)。
音量制御の優先順位
音量は主に以下の2つの属性によって制御されます:
velocity(基本ベロシティ):曲全体の基本音量を決定します。VolumePoints(高度な音量曲線):AdvancedData内に空でないVolumePointsリストが存在する場合、それは基本velocityの効果を完全に上書き (Override) します。
つまり、動的な音量エンベロープ(ADSRなど)を使用したい場合は VolumePoints を使用し、単純な固定音量の場合は velocity を使用すればよいということです。