Skip to content

ジェネレーターの準備

Extended Note Block(拡張音符ブロック)は多くのカスタムNBTタグを持っており、これらを利用することで、従来の音符ブロックよりも豊かな音楽効果を実現できます。これは、コマンドブロックや外部ジェネレーターを使用して音符ブロックを一括生成する場合に非常に役立ちます。

NBT構造の概要

Extended Note BlockのNBTデータは、主に基本属性高度なデータ (AdvancedData) の2つの部分に分かれています。

基本属性 (Root)

これらの属性は、NBTのルートノード直下にあります。

タグ名説明範囲/単位デフォルト値
noteIntMIDIピッチ0-127 (60が中央C)60
velocityIntMIDIベロシティ (基本音量)0-127100
sustainTimeInt音符の持続時間ゲームティック (Ticks, 20 ticks = 1秒)40
delayedPlayingTimeInt再生遅延時間ミリ秒 (ms)0
fadeInTimeIntフェードイン時間ゲームティック (Ticks)0
fadeOutTimeIntフェードアウト時間ゲームティック (Ticks)0

ブロック状態 (Block States)

NBTデータに加えて、Extended Note BlockはBlockStatesを使用してレッドストーン信号と視覚表現を処理します。

状態名可能な値説明
pitchEnumc, cs, d, ds, e, f, fs, g, gs, a, as, b1オクターブ内での現在の音符のピッチ(Note % 12)に対応します。主にリソースパックでブロックのテクスチャを変更するために使用されます。例えば、cs は C# を表します。
poweredBooleantrue, 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を配置できます。

基本例:

mcfunction
setblock ~ ~1 ~ extendednoteblock:extended_note_block{note:64, velocity:120, sustainTime:10}

高度な例(ピッチベンドを含む):

mcfunction
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 内に、SoundPathExpressionX/Y/Z が同時に存在している場合があります。

  • Expr (数式)GUI インターフェースの表示と編集にのみ使用されます。ゲームは実行時にこれらの数式を計算しません
  • SoundPath (パス):これはゲームが実際に音声を再生する際に使用するパスデータです。

重要ポイント: ジェネレーターを作成する場合、必ず SoundPath リストデータを直接生成してください。単に Expression 文字列を書き込むだけでは無効であり、プレイヤーが手動でGUIを開いて保存しない限り、音源は移動しません(保存時にクライアントが数式に基づいてパス点を計算し、SoundPath に書き込みます)。

音量制御の優先順位

音量は主に以下の2つの属性によって制御されます:

  1. velocity (基本ベロシティ):曲全体の基本音量を決定します。
  2. VolumePoints (高度な音量曲線)AdvancedData 内に空でない VolumePoints リストが存在する場合、それは基本 velocity の効果を完全に上書き (Override) します。

つまり、動的な音量エンベロープ(ADSRなど)を使用したい場合は VolumePoints を使用し、単純な固定音量の場合は velocity を使用すればよいということです。