[
  {
    "id": "kpma000000tab001",
    "type": "tab",
    "label": "Keypoint cue to grandMA",
    "disabled": false,
    "info": "Trigger a grandMA sequence when the now-playing track ENTERS the Drive\nsection, and another one when it EXITS.\n\nHOW IT WORKS\n- The Drive keypoint node has TWO outputs. The top output emits one EVENT\n  message on enter and one on exit. The bottom output is a continuous stream\n  (not used here).\n- The Enter and Exit nodes are filters: Enter only lets 'enter' events\n  through, Exit only 'exit' events. That splits the event output into two\n  paths.\n- Each OSC output node has its Address (/cmd) and Message ('Go DataPool ...')\n  filled in directly in the node, so no function nodes are needed. Compare\n  with the 'Send BPM via OSC' example, where address and message are set on\n  the message itself instead.\n\nSETUP - GRANDMA\nDouble-click an OSC output node, then click the pencil icon next to 'Server'\nand set the console's IP and OSC port. On the console, enable OSC input and\nmake sure the port matches. Then change the two Messages to the commands your\nshow file expects (e.g. 'Go+ Sequence 1234').\n\nMAKE IT YOURS\n- Want this on the Drop or a Build instead? Drag in any other keypoint node\n  from the TL keypoints category and wire its TOP output to Enter and Exit.\n- Works the same for any OSC-capable target: ChamSys, Resolume, TouchDesigner,\n  QLab, custom apps.\n\nTESTING\nNo deck playing? The two test buttons push a fake enter/exit event into BOTH\nfilters - watch how each filter only passes its own event type (the node\nstatus lights up green for 3 seconds when it forwards a message).\n",
    "env": []
  },
  {
    "id": "kpma000000grp001",
    "type": "group",
    "z": "kpma000000tab001",
    "name": "Trigger grandMA cues on Drive enter / exit",
    "style": {
      "label": true
    },
    "nodes": [
      "kpma000000key001",
      "kpma000000ent001",
      "kpma000000ext001",
      "kpma000000out001",
      "kpma000000out002",
      "kpma000000dbg001"
    ],
    "x": 54,
    "y": 39,
    "w": 752,
    "h": 222
  },
  {
    "id": "kpma000000grp002",
    "type": "group",
    "z": "kpma000000tab001",
    "name": "No deck playing? Test with these",
    "style": {
      "label": true
    },
    "nodes": [
      "kpma000000inj001",
      "kpma000000inj002"
    ],
    "x": 54,
    "y": 299,
    "w": 292,
    "h": 142
  },
  {
    "id": "kpma000000key001",
    "type": "tl-keypoint-drive",
    "z": "kpma000000tab001",
    "g": "kpma000000grp001",
    "x": 170,
    "y": 160,
    "wires": [
      [
        "kpma000000ent001",
        "kpma000000ext001"
      ],
      []
    ]
  },
  {
    "id": "kpma000000ent001",
    "type": "tl-enter",
    "z": "kpma000000tab001",
    "g": "kpma000000grp001",
    "payload": "payload",
    "payloadType": "msg",
    "x": 410,
    "y": 120,
    "wires": [
      [
        "kpma000000out001",
        "kpma000000dbg001"
      ]
    ]
  },
  {
    "id": "kpma000000ext001",
    "type": "tl-exit",
    "z": "kpma000000tab001",
    "g": "kpma000000grp001",
    "payload": "payload",
    "payloadType": "msg",
    "x": 410,
    "y": 200,
    "wires": [
      [
        "kpma000000out002",
        "kpma000000dbg001"
      ]
    ]
  },
  {
    "id": "kpma000000out001",
    "type": "tl-output",
    "z": "kpma000000tab001",
    "g": "kpma000000grp001",
    "name": "MA: Drive enter",
    "protocol": "osc",
    "server": "kpma000000srv001",
    "address": "/cmd",
    "message": "Go DataPool 2 sequence 1234",
    "vizType": "led",
    "textSuffix": "",
    "progressMin": 0,
    "progressMax": 1,
    "progressStartLabel": "",
    "progressEndLabel": "",
    "x": 680,
    "y": 120,
    "wires": []
  },
  {
    "id": "kpma000000out002",
    "type": "tl-output",
    "z": "kpma000000tab001",
    "g": "kpma000000grp001",
    "name": "MA: Drive exit",
    "protocol": "osc",
    "server": "kpma000000srv001",
    "address": "/cmd",
    "message": "Go DataPool 2 sequence 5678",
    "vizType": "led",
    "textSuffix": "",
    "progressMin": 0,
    "progressMax": 1,
    "progressStartLabel": "",
    "progressEndLabel": "",
    "x": 680,
    "y": 200,
    "wires": []
  },
  {
    "id": "kpma000000dbg001",
    "type": "debug",
    "z": "kpma000000tab001",
    "g": "kpma000000grp001",
    "name": "what happened",
    "active": true,
    "tosidebar": true,
    "console": false,
    "tostatus": false,
    "complete": "true",
    "targetType": "full",
    "statusVal": "",
    "statusType": "auto",
    "x": 680,
    "y": 60,
    "wires": []
  },
  {
    "id": "kpma000000inj001",
    "type": "inject",
    "z": "kpma000000tab001",
    "g": "kpma000000grp002",
    "name": "test: enter event",
    "props": [
      {
        "p": "payload"
      }
    ],
    "repeat": "",
    "crontab": "",
    "once": false,
    "onceDelay": 0.1,
    "topic": "",
    "payload": "{\"event\":\"enter\",\"keypointId\":\"drive\",\"deckId\":1}",
    "payloadType": "json",
    "x": 180,
    "y": 340,
    "wires": [
      [
        "kpma000000ent001",
        "kpma000000ext001"
      ]
    ]
  },
  {
    "id": "kpma000000inj002",
    "type": "inject",
    "z": "kpma000000tab001",
    "g": "kpma000000grp002",
    "name": "test: exit event",
    "props": [
      {
        "p": "payload"
      }
    ],
    "repeat": "",
    "crontab": "",
    "once": false,
    "onceDelay": 0.1,
    "topic": "",
    "payload": "{\"event\":\"exit\",\"keypointId\":\"drive\",\"reason\":\"keypoint_changed\",\"deckId\":1}",
    "payloadType": "json",
    "x": 180,
    "y": 400,
    "wires": [
      [
        "kpma000000ent001",
        "kpma000000ext001"
      ]
    ]
  },
  {
    "id": "kpma000000srv001",
    "type": "tl-output-server",
    "name": "grandMA",
    "protocol": "osc",
    "host": "127.0.0.1",
    "port": 8000,
    "udpFamily": "udp4"
  }
]
