Animation & Audio
AnimMontage and SoundCue verbs: montage-list, montage-add-section, soundcue-add-node, and more.
Verbs for inspecting and modifying AnimMontage assets (sections, notifies) and
SoundCue node graphs. All verbs return JSON to stdout. Use -compile -save
flags on write verbs to persist changes.
AnimMontage verbs (3)#
montage-list#
List sections and notifies in an AnimMontage.
Category: Read (focused)
| Arg | Required | Description |
|---|---|---|
-asset= |
Yes | AnimMontage asset path |
Examples:
-verb=montage-list -asset=/Game/Animations/AM_Attack_Primary
Output:
{
"success": true,
"sections": [
{"name": "Default", "startTime": 0.0},
{"name": "Recovery", "startTime": 0.45}
],
"notifies": [
{"name": "PlaySound", "time": 0.1, "notifyClass": "AnimNotify_PlaySound"},
{"name": "DamageWindow", "time": 0.15, "duration": 0.3, "notifyClass": "AnimNotifyState_DamageWindow"}
]
}
montage-add-section#
Add a section to an AnimMontage.
Category: Write (animation)
| Arg | Required | Description |
|---|---|---|
-asset= |
Yes | AnimMontage asset path |
-name= |
Yes | Section name |
-startTime= |
Yes | Section start time in seconds (float) |
Examples:
-verb=montage-add-section -asset=/Game/Animations/AM_Attack_Primary -name=Recovery -startTime=0.45
-verb=montage-add-section -asset=/Game/Animations/AM_Combo -name=SecondSwing -startTime=0.6 -compile -save
Notes:
- Section names must be unique within the montage.
- Start time is in seconds relative to the montage start.
montage-add-notify#
Add a notify to an AnimMontage.
Category: Write (animation)
| Arg | Required | Description |
|---|---|---|
-asset= |
Yes | AnimMontage asset path |
-time= |
Yes | Trigger time in seconds (float) |
-notify= |
Yes | Notify class name (e.g., AnimNotify_PlaySound, AnimNotify_PlayParticleEffect, or a custom notify class) |
-duration= |
No | Duration for AnimNotifyState types (defaults to 1.0 if applicable) |
Examples:
-verb=montage-add-notify -asset=/Game/Animations/AM_Attack_Primary -time=0.1 -notify=AnimNotify_PlaySound
-verb=montage-add-notify -asset=/Game/Animations/AM_Attack_Primary -time=0.15 -notify=AnimNotifyState_DamageWindow -duration=0.3 -compile -save
Notes:
- Instant notifies (
AnimNotify_*subclasses) ignore the-duration=parameter. - State notifies (
AnimNotifyState_*subclasses) use-duration=to set how long the state remains active. Defaults to 1.0 if omitted. - Custom notify classes must be discoverable by UE reflection (registered via
UCLASS).
SoundCue verbs (3)#
soundcue-list#
List all nodes in a SoundCue's node graph.
Category: Read (focused)
| Arg | Required | Description |
|---|---|---|
-asset= |
Yes | SoundCue asset path |
Examples:
-verb=soundcue-list -asset=/Game/Audio/SC_Explosion
Output:
{
"success": true,
"nodes": [
{"index": 0, "type": "SoundNodeWavePlayer", "name": "WavePlayer_0"},
{"index": 1, "type": "SoundNodeAttenuation", "name": "Attenuation_0"},
{"index": 2, "type": "SoundNodeRandom", "name": "Random_0"}
]
}
Notes:
- Node indices are used by
soundcue-add-nodeandsoundcue-connectto reference specific nodes.
soundcue-add-node#
Add a node to a SoundCue graph.
Category: Write (audio)
| Arg | Required | Description |
|---|---|---|
-asset= |
Yes | SoundCue asset path |
-type= |
Yes | Node type: WavePlayer, Random, Attenuation, Modulator, Mixer, Concatenator, Delay, Switch |
-parent= |
No | Parent node index (integer) |
-childSlot= |
No | Child slot index (integer, for nodes with multiple inputs) |
Examples:
-verb=soundcue-add-node -asset=/Game/Audio/SC_Explosion -type=WavePlayer
-verb=soundcue-add-node -asset=/Game/Audio/SC_Explosion -type=Random -parent=1 -childSlot=0
-verb=soundcue-add-node -asset=/Game/Audio/SC_Footstep -type=Attenuation -compile -save
Notes:
- When
-parent=is specified, the new node is automatically connected as a child of that parent node at the given slot. - Without
-parent=, the node is added to the graph unconnected. Usesoundcue-connectafterward to wire it.
soundcue-connect#
Connect two nodes in a SoundCue graph.
Category: Write (audio)
| Arg | Required | Description |
|---|---|---|
-asset= |
Yes | SoundCue asset path |
-srcNode= |
Yes | Source node index (integer) |
-dstNode= |
Yes | Destination node index (integer) |
-slot= |
No | Child slot index (defaults to 0) |
Examples:
-verb=soundcue-connect -asset=/Game/Audio/SC_Explosion -srcNode=0 -dstNode=1
-verb=soundcue-connect -asset=/Game/Audio/SC_Footstep -srcNode=2 -dstNode=3 -slot=1 -compile -save
Notes:
- Audio flows from source (child) to destination (parent): a WavePlayer node feeds into a Mixer or Random node.
- Use
soundcue-listfirst to obtain current node indices.
Practical examples#
Example 1: Inspect an AnimMontage and add a damage notify#
Read the current state of a montage, then add a notify for a damage window.
Step 1: List existing sections and notifies:
curl -X POST http://localhost:7850/baa/v1/execute \
-H "Content-Type: application/json" \
-d '{
"verb": "montage-list",
"args": {
"asset": "/Game/Animations/AM_Attack_Primary"
}
}'
Step 2: Add a damage window notify state:
curl -X POST http://localhost:7850/baa/v1/execute \
-H "Content-Type: application/json" \
-d '{
"verb": "montage-add-notify",
"args": {
"asset": "/Game/Animations/AM_Attack_Primary",
"time": "0.15",
"notify": "AnimNotifyState_DamageWindow",
"duration": "0.3",
"compile": true,
"save": true
}
}'
Example 2: Add montage sections for a combo attack#
Use batch to add multiple sections in a single commandlet launch.
curl -X POST http://localhost:7850/baa/v1/batch \
-H "Content-Type: application/json" \
-d '{
"defaultAsset": "/Game/Animations/AM_Combo",
"operations": [
{
"verb": "montage-add-section",
"args": {"name": "WindUp", "startTime": "0.0"}
},
{
"verb": "montage-add-section",
"args": {"name": "Strike", "startTime": "0.3"}
},
{
"verb": "montage-add-section",
"args": {"name": "Recovery", "startTime": "0.6"}
},
{
"verb": "montage-add-notify",
"args": {"time": "0.3", "notify": "AnimNotify_PlaySound"}
},
{
"verb": "montage-add-notify",
"args": {"time": "0.3", "notify": "AnimNotifyState_DamageWindow", "duration": "0.25"}
},
{"verb": "compile"},
{"verb": "save"}
]
}'
Example 3: Build a SoundCue with random variation#
Create a SoundCue that randomly selects between wave players and applies attenuation.
Step 1: List existing nodes:
curl -X POST http://localhost:7850/baa/v1/execute \
-H "Content-Type: application/json" \
-d '{
"verb": "soundcue-list",
"args": {"asset": "/Game/Audio/SC_Footstep"}
}'
Step 2: Add nodes and wire them together via batch:
curl -X POST http://localhost:7850/baa/v1/batch \
-H "Content-Type: application/json" \
-d '{
"defaultAsset": "/Game/Audio/SC_Footstep",
"operations": [
{
"verb": "soundcue-add-node",
"args": {"type": "WavePlayer"},
"id": "wave1"
},
{
"verb": "soundcue-add-node",
"args": {"type": "WavePlayer"},
"id": "wave2"
},
{
"verb": "soundcue-add-node",
"args": {"type": "Random"},
"id": "rand"
},
{
"verb": "soundcue-add-node",
"args": {"type": "Attenuation"},
"id": "atten"
},
{
"verb": "soundcue-connect",
"args": {"srcNode": "$wave1.nodeIndex", "dstNode": "$rand.nodeIndex", "slot": "0"}
},
{
"verb": "soundcue-connect",
"args": {"srcNode": "$wave2.nodeIndex", "dstNode": "$rand.nodeIndex", "slot": "1"}
},
{
"verb": "soundcue-connect",
"args": {"srcNode": "$rand.nodeIndex", "dstNode": "$atten.nodeIndex"}
},
{"verb": "compile"},
{"verb": "save"}
]
}'
Example 4: Commandlet invocation (no HTTP server)#
When the editor and BAAServer are not running, use the one-shot commandlet:
"C:\Unreal\UE571Source\Engine\Binaries\Win64\UnrealEditor-Cmd.exe" \
"C:\Unreal\ProjectLeyline\CombatDemo\CombatDemo.uproject" \
-run=BlueprintAIAssistant \
-verb=montage-add-notify \
-asset=/Game/Animations/AM_Attack_Primary \
-time=0.1 \
-notify=AnimNotify_PlaySound \
-compile -save \
-nullrhi -nosplash -nosound -unattended
Tips#
- List before writing. Always run
montage-listorsoundcue-listfirst to understand the current state before adding sections, notifies, or nodes. - Use batch for multi-step operations. Each commandlet launch takes 30-60 seconds. Batching avoids repeated startup costs, especially when adding multiple notifies or building a SoundCue graph.
- Notify class names must be exact. Use the full class name as registered
with UE reflection (e.g.,
AnimNotify_PlaySound, notPlaySound). Custom notifies use theirUCLASSname. - SoundCue node indices can change. After adding or removing nodes, re-run
soundcue-listto get updated indices before connecting. - Compile and save together. Use
-compile -saveflags or separatecompileandsaveverbs at the end of a batch to persist all changes in one pass.