{
  "id": "keyboard_in_dat",
  "name": "Keyboard In DAT",
  "displayName": "Keyboard In DAT",
  "category": "DAT",
  "subcategory": "Utilities",
  "version": "",
  "lastUpdated": "2025-08-07T07:50:02.584Z",
  "sourceFile": "C:\\Program Files\\Derivative\\TouchDesigner\\Samples\\Learn\\OfflineHelp\\https.docs.derivative.ca\\Keyboard_In_DAT.htm",
  "url": "",
  "description": "The Keyboard In DAT lists the most recent key events in its FIFO (first in/first out) table. There is one row for every key press down and every key-up, including Shift, Ctrl and Alt, with distinction between left and right side. For convenience, with each key press, a column indicates if the  Shift, Ctrl and Alt were being held down at the time.",
  "summary": "The Keyboard In DAT lists the most recent key events in its FIFO (first in/first out) table. There is one row for every key press down and every key-up, including Shift, Ctrl and Alt, with distinction",
  "details": "",
  "usage": "",
  "tips": [],
  "warnings": [],
  "parameters": [
    {
      "id": null,
      "name": "Active",
      "label": "Active",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "From Derivative\n\t\t\n\t\t\n\t\t\n\t\t\n\t\tJump to navigation\n\t\tJump to search\n\t\t\nThe Keyboard In  lists the most recent key events in its FIFO (first in/first out) table. There is one row for every key press down and every key-up, including Shift, Ctrl and Alt, with distinction between left and right side. For convenience, with each key press, a column indicates if the  Shift, Ctrl and Alt were being held down at the time.\t\t\nYou get key presses even of the cursor is outside the TouchDesigner windows, whether they are control panels,  or the network editor window. Exceptions: while entering text in the editor window.\t\t\t\nYou can set a filter to watch only certain keys. Custom shortcuts can be defined and handled by a python callback in the attached script.\nkeyboardinDAT_Class\n\nContents\n \n \n \n \n \n \n \n \n \n\n\n\n\n\n  active - Inhibits and allows message to be added to log.\n\n\n\t\t\n  perform - When on, key events are only detected while in perform mode.\n\n\n\t\t\n  keys - List of keys to allow through the filter. Just put the characters in the list, space-separated. Eg. '1 2 g h' for the 1, 2, g and h keys. Only these keys will be added to the log and generate an event. If blank, no filtering will be done. List of accepted keys: Keyboard UI\n\n\n\t\t\n  shortcuts - List of shortcuts to watch for. See \"Shortcuts\" in the notes for defining shortcuts.\n\n\n\t\t\n  panels - Optional list of references to panels to detect events from. Events will only be fired when any of the listed panels has focus.\n\n\n\t\t\n  lrmodifiers - When on, the states of the left and right modifier keys (see Notes) will be added to the table. Switching the state of this parameter will reset the table's contents.\n\n\n\n\n\n  callbacks -  to a  containing callbacks for each keyboard event received. See keyboardinDAT_Class for usage.\n\n\n\t\t\n  executeloc -  - Determines the location the script is run from.\n\n current - The script is executed from the current node location (for example, where 'cc' points to). callbacks - op - The script is executed from the operator specified in the  parameter below.\n\t\t\n  fromop - The operator whose state change will trigger the  to execute its script when  is set to . This operator is also the path that the script will be executed from if the  parameter is set to .\n\n\n\t\t\n  clamp - The  is limited to 100 messages by default but with Clamp Output, this can be set to anything including unlimited.\n\n\n\t\t\n  maxlines - Limits the number of messages, older messages are removed from the list first.\n\n\n\t\t\n  clear - Deletes all lines except the heading.  To clear with a python script op(\"opname\").par.clear.pulse()\n\n\n\n\n\n  language -  - Select how the  decides which script language to operate on.\n\n input - The  uses the inputs script language. node - The  uses it's own script language.\n\n  extension -  - Select the file extension this  should expose to external editors.\n\n dat - various common file extensions. language - pick extension from DATs script language. custom - Specify a custom extension.\n\n  customext - Specifiy the custom extension.\n\n\n\n  wordwrap -  - Enable Word Wrap for Node Display.\n\n input - The  uses the inputs setting. on - Turn on Word Wrap. off - Turn off Word Wrap.\n\n\n\nShortcuts are defined by a list of modifier keys (see below) and a \"trigger\" key separated by .'s.\nFor example, ctrl.shift.a the modifier keys are ctrl and shift, and the trigger key is a. This shortcut will be activated when one of the ctrl and shift keys are pressed and the trigger key, a is pressed down. If any other modifier keys are pressed, the shortcut will not be detected.\nModifier Keys - The following are all the valid modifier keys:\n\nlalt - Left alt key.\nralt - Right alt key.\nalt - Either left or right alt key.\nlctrl - Left ctrl key.\nrctrl - Right ctrl key.\nctrl - Either left or right ctrl key.\nlshift - Left shift key.\nrshift - Right shift key.\nshift - Either left or right shift key.\n\n -\n\nExtra Information for the Keyboard In  can be accessed via an Info CHOP.\n\n\n\n - Number of rows in this . - Number of columns in this .\n - Number of times the operator has cooked since the process started. - Duration of the last cook in milliseconds. - Frame number when this operator was last cooked relative to the component timeline. - Frame number when this operator was last cooked relative to the absolute time. - Time in milliseconds at which the operator started cooking in the frame it was cooked. - Time in milliseconds at which the operator finished cooking in the frame it was cooked. - 1 if operator was cooked this frame. - Number of warnings in this operator if any. - Number of errors in this operator if any.\nTouchDesigner Build: Latest\\n2021.100002018.28070before 2018.28070\nDATs\n• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • \n\nAn Operator Family that manipulates text strings: multi-line text or tables. Multi-line text is often a python Script or GLSL Shader, but can be any multi-line text. Tables are rows and columns of cells, each containing a text string.\n\n\n\nPerform Mode is an optimized mode for live performance that only renders one specified Window COMP which is one window that contains your video outputs and your (optional) control interface. In Perform Mode the network editing window is not open - you edit your networks in Designer Mode.  Alternate with F1 and Esc.\n\n\n\nA Window in TouchDesigner is a window in Microsoft Windows or macOS that contains either (1) the TouchDesigner editing interface that exists in Designer Mode, or (2) a user-created Panel inside a Window Component. The user-created windows can span Multiple Monitors borderless, or be floating windows with borders, or popups.\n\n\n\nThe location of an operator within the TouchDesigner environment, for example, /geo1/circle1, a node called circle1 in a component called geo1. The path / is called Root. This path is displayed at the top of every Pane, showing which Component's network you are currently in. To refer instead to a filesystem folder, directory, disk file or http: address, see Folder.\n\n\n\nThe generic thing that holds an Operator, and includes Flags (display, bypass, lock, render, immune) and its position/size in the network. Whether you \"lay down an Operator\" or \"lay down an Node\", you're doing the same thing.\n\n\n\nAny of the procedural data operators. OPs do all the work in TouchDesigner. They \"cook\" and output data to other OPs, which ultimately result in new images, data and audio being generated. See Node.\n\n\n\nAn Operator Family which operate on Channels (a sequence of numbers (Samples)) which are used for animation, audio, mathematics, simulation, logic, UI construction, and data streamed from/to devices and protocols.\n\n\n\n\n\n\n\n\nRetrieved from \"https://docs.derivative.ca/index.php?title=Keyboard_In_DAT&oldid=24323\"\n\t\tCategory: DATs",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-07T07:50:02.580Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Active",
      "label": "Active",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "From Derivative\n\t\t\n\t\t\n\t\t\n\t\t\n\t\tJump to navigation\n\t\tJump to search\n\t\t\nThe Keyboard In  lists the most recent key events in its FIFO (first in/first out) table. There is one row for every key press down and every key-up, including Shift, Ctrl and Alt, with distinction between left and right side. For convenience, with each key press, a column indicates if the  Shift, Ctrl and Alt were being held down at the time.\t\t\nYou get key presses even of the cursor is outside the TouchDesigner windows, whether they are control panels,  or the network editor window. Exceptions: while entering text in the editor window.\t\t\t\nYou can set a filter to watch only certain keys. Custom shortcuts can be defined and handled by a python callback in the attached script.\nkeyboardinDAT_Class\n\nContents\n \n \n \n \n \n \n \n \n \n\n\n\n\n\n  active - Inhibits and allows message to be added to log.\n\n\n\t\t\n  perform - When on, key events are only detected while in perform mode.\n\n\n\t\t\n  keys - List of keys to allow through the filter. Just put the characters in the list, space-separated. Eg. '1 2 g h' for the 1, 2, g and h keys. Only these keys will be added to the log and generate an event. If blank, no filtering will be done. List of accepted keys: Keyboard UI\n\n\n\t\t\n  shortcuts - List of shortcuts to watch for. See \"Shortcuts\" in the notes for defining shortcuts.\n\n\n\t\t\n  panels - Optional list of references to panels to detect events from. Events will only be fired when any of the listed panels has focus.\n\n\n\t\t\n  lrmodifiers - When on, the states of the left and right modifier keys (see Notes) will be added to the table. Switching the state of this parameter will reset the table's contents.\n\n\n\n\n\n  callbacks -  to a  containing callbacks for each keyboard event received. See keyboardinDAT_Class for usage.\n\n\n\t\t\n  executeloc -  - Determines the location the script is run from.\n\n current - The script is executed from the current node location (for example, where 'cc' points to). callbacks - op - The script is executed from the operator specified in the  parameter below.\n\t\t\n  fromop - The operator whose state change will trigger the  to execute its script when  is set to . This operator is also the path that the script will be executed from if the  parameter is set to .\n\n\n\t\t\n  clamp - The  is limited to 100 messages by default but with Clamp Output, this can be set to anything including unlimited.\n\n\n\t\t\n  maxlines - Limits the number of messages, older messages are removed from the list first.\n\n\n\t\t\n  clear - Deletes all lines except the heading.  To clear with a python script op(\"opname\").par.clear.pulse()\n\n\n\n\n\n  language -  - Select how the  decides which script language to operate on.\n\n input - The  uses the inputs script language. node - The  uses it's own script language.\n\n  extension -  - Select the file extension this  should expose to external editors.\n\n dat - various common file extensions. language - pick extension from DATs script language. custom - Specify a custom extension.\n\n  customext - Specifiy the custom extension.\n\n\n\n  wordwrap -  - Enable Word Wrap for Node Display.\n\n input - The  uses the inputs setting. on - Turn on Word Wrap. off - Turn off Word Wrap.\n\n\n\nShortcuts are defined by a list of modifier keys (see below) and a \"trigger\" key separated by .'s.\nFor example, ctrl.shift.a the modifier keys are ctrl and shift, and the trigger key is a. This shortcut will be activated when one of the ctrl and shift keys are pressed and the trigger key, a is pressed down. If any other modifier keys are pressed, the shortcut will not be detected.\nModifier Keys - The following are all the valid modifier keys:\n\nlalt - Left alt key.\nralt - Right alt key.\nalt - Either left or right alt key.\nlctrl - Left ctrl key.\nrctrl - Right ctrl key.\nctrl - Either left or right ctrl key.\nlshift - Left shift key.\nrshift - Right shift key.\nshift - Either left or right shift key.\n\n -\n\nExtra Information for the Keyboard In  can be accessed via an Info CHOP.\n\n\n\n - Number of rows in this . - Number of columns in this .\n - Number of times the operator has cooked since the process started. - Duration of the last cook in milliseconds. - Frame number when this operator was last cooked relative to the component timeline. - Frame number when this operator was last cooked relative to the absolute time. - Time in milliseconds at which the operator started cooking in the frame it was cooked. - Time in milliseconds at which the operator finished cooking in the frame it was cooked. - 1 if operator was cooked this frame. - Number of warnings in this operator if any. - Number of errors in this operator if any.\nTouchDesigner Build: Latest\\n2021.100002018.28070before 2018.28070\nDATs\n• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • \n\nAn Operator Family that manipulates text strings: multi-line text or tables. Multi-line text is often a python Script or GLSL Shader, but can be any multi-line text. Tables are rows and columns of cells, each containing a text string.\n\n\n\nPerform Mode is an optimized mode for live performance that only renders one specified Window COMP which is one window that contains your video outputs and your (optional) control interface. In Perform Mode the network editing window is not open - you edit your networks in Designer Mode.  Alternate with F1 and Esc.\n\n\n\nA Window in TouchDesigner is a window in Microsoft Windows or macOS that contains either (1) the TouchDesigner editing interface that exists in Designer Mode, or (2) a user-created Panel inside a Window Component. The user-created windows can span Multiple Monitors borderless, or be floating windows with borders, or popups.\n\n\n\nThe location of an operator within the TouchDesigner environment, for example, /geo1/circle1, a node called circle1 in a component called geo1. The path / is called Root. This path is displayed at the top of every Pane, showing which Component's network you are currently in. To refer instead to a filesystem folder, directory, disk file or http: address, see Folder.\n\n\n\nThe generic thing that holds an Operator, and includes Flags (display, bypass, lock, render, immune) and its position/size in the network. Whether you \"lay down an Operator\" or \"lay down an Node\", you're doing the same thing.\n\n\n\nAny of the procedural data operators. OPs do all the work in TouchDesigner. They \"cook\" and output data to other OPs, which ultimately result in new images, data and audio being generated. See Node.\n\n\n\nAn Operator Family which operate on Channels (a sequence of numbers (Samples)) which are used for animation, audio, mathematics, simulation, logic, UI construction, and data streamed from/to devices and protocols.\n\n\n\n\n\n\n\n\nRetrieved from \"https://docs.derivative.ca/index.php?title=Keyboard_In_DAT&oldid=24323\"\n\t\tCategory: DATs",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-07T07:50:02.581Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Active",
      "label": "Active",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "The Keyboard In  lists the most recent key events in its FIFO (first in/first out) table. There is one row for every key press down and every key-up, including Shift, Ctrl and Alt, with distinction between left and right side. For convenience, with each key press, a column indicates if the  Shift, Ctrl and Alt were being held down at the time.\t\t\nYou get key presses even of the cursor is outside the TouchDesigner windows, whether they are control panels,  or the network editor window. Exceptions: while entering text in the editor window.\t\t\t\nYou can set a filter to watch only certain keys. Custom shortcuts can be defined and handled by a python callback in the attached script.\nkeyboardinDAT_Class\n\nContents\n \n \n \n \n \n \n \n \n \n\n\n\n\n\n  active - Inhibits and allows message to be added to log.\n\n\n\t\t\n  perform - When on, key events are only detected while in perform mode.\n\n\n\t\t\n  keys - List of keys to allow through the filter. Just put the characters in the list, space-separated. Eg. '1 2 g h' for the 1, 2, g and h keys. Only these keys will be added to the log and generate an event. If blank, no filtering will be done. List of accepted keys: Keyboard UI\n\n\n\t\t\n  shortcuts - List of shortcuts to watch for. See \"Shortcuts\" in the notes for defining shortcuts.\n\n\n\t\t\n  panels - Optional list of references to panels to detect events from. Events will only be fired when any of the listed panels has focus.\n\n\n\t\t\n  lrmodifiers - When on, the states of the left and right modifier keys (see Notes) will be added to the table. Switching the state of this parameter will reset the table's contents.\n\n\n\n\n\n  callbacks -  to a  containing callbacks for each keyboard event received. See keyboardinDAT_Class for usage.\n\n\n\t\t\n  executeloc -  - Determines the location the script is run from.\n\n current - The script is executed from the current node location (for example, where 'cc' points to). callbacks - op - The script is executed from the operator specified in the  parameter below.\n\t\t\n  fromop - The operator whose state change will trigger the  to execute its script when  is set to . This operator is also the path that the script will be executed from if the  parameter is set to .\n\n\n\t\t\n  clamp - The  is limited to 100 messages by default but with Clamp Output, this can be set to anything including unlimited.\n\n\n\t\t\n  maxlines - Limits the number of messages, older messages are removed from the list first.\n\n\n\t\t\n  clear - Deletes all lines except the heading.  To clear with a python script op(\"opname\").par.clear.pulse()\n\n\n\n\n\n  language -  - Select how the  decides which script language to operate on.\n\n input - The  uses the inputs script language. node - The  uses it's own script language.\n\n  extension -  - Select the file extension this  should expose to external editors.\n\n dat - various common file extensions. language - pick extension from DATs script language. custom - Specify a custom extension.\n\n  customext - Specifiy the custom extension.\n\n\n\n  wordwrap -  - Enable Word Wrap for Node Display.\n\n input - The  uses the inputs setting. on - Turn on Word Wrap. off - Turn off Word Wrap.\n\n\n\nShortcuts are defined by a list of modifier keys (see below) and a \"trigger\" key separated by .'s.\nFor example, ctrl.shift.a the modifier keys are ctrl and shift, and the trigger key is a. This shortcut will be activated when one of the ctrl and shift keys are pressed and the trigger key, a is pressed down. If any other modifier keys are pressed, the shortcut will not be detected.\nModifier Keys - The following are all the valid modifier keys:\n\nlalt - Left alt key.\nralt - Right alt key.\nalt - Either left or right alt key.\nlctrl - Left ctrl key.\nrctrl - Right ctrl key.\nctrl - Either left or right ctrl key.\nlshift - Left shift key.\nrshift - Right shift key.\nshift - Either left or right shift key.\n\n -\n\nExtra Information for the Keyboard In  can be accessed via an Info CHOP.\n\n\n\n - Number of rows in this . - Number of columns in this .\n - Number of times the operator has cooked since the process started. - Duration of the last cook in milliseconds. - Frame number when this operator was last cooked relative to the component timeline. - Frame number when this operator was last cooked relative to the absolute time. - Time in milliseconds at which the operator started cooking in the frame it was cooked. - Time in milliseconds at which the operator finished cooking in the frame it was cooked. - 1 if operator was cooked this frame. - Number of warnings in this operator if any. - Number of errors in this operator if any.\nTouchDesigner Build: Latest\\n2021.100002018.28070before 2018.28070\nDATs\n• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • \n\nAn Operator Family that manipulates text strings: multi-line text or tables. Multi-line text is often a python Script or GLSL Shader, but can be any multi-line text. Tables are rows and columns of cells, each containing a text string.\n\n\n\nPerform Mode is an optimized mode for live performance that only renders one specified Window COMP which is one window that contains your video outputs and your (optional) control interface. In Perform Mode the network editing window is not open - you edit your networks in Designer Mode.  Alternate with F1 and Esc.\n\n\n\nA Window in TouchDesigner is a window in Microsoft Windows or macOS that contains either (1) the TouchDesigner editing interface that exists in Designer Mode, or (2) a user-created Panel inside a Window Component. The user-created windows can span Multiple Monitors borderless, or be floating windows with borders, or popups.\n\n\n\nThe location of an operator within the TouchDesigner environment, for example, /geo1/circle1, a node called circle1 in a component called geo1. The path / is called Root. This path is displayed at the top of every Pane, showing which Component's network you are currently in. To refer instead to a filesystem folder, directory, disk file or http: address, see Folder.\n\n\n\nThe generic thing that holds an Operator, and includes Flags (display, bypass, lock, render, immune) and its position/size in the network. Whether you \"lay down an Operator\" or \"lay down an Node\", you're doing the same thing.\n\n\n\nAny of the procedural data operators. OPs do all the work in TouchDesigner. They \"cook\" and output data to other OPs, which ultimately result in new images, data and audio being generated. See Node.\n\n\n\nAn Operator Family which operate on Channels (a sequence of numbers (Samples)) which are used for animation, audio, mathematics, simulation, logic, UI construction, and data streamed from/to devices and protocols.\n\n\n\n\n\n\n\n\nRetrieved from \"https://docs.derivative.ca/index.php?title=Keyboard_In_DAT&oldid=24323\"",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-07T07:50:02.582Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Active",
      "label": "Active",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "active - Inhibits and allows message to be added to log.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-07T07:50:02.582Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Perform Window Only",
      "label": "Perform Window Only",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "perform - When on, key events are only detected while in perform mode.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-07T07:50:02.583Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Keys",
      "label": "Keys",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "keys - List of keys to allow through the filter. Just put the characters in the list, space-separated. Eg. '1 2 g h' for the 1, 2, g and h keys. Only these keys will be added to the log and generate an event. If blank, no filtering will be done. List of accepted keys: Keyboard UI",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-07T07:50:02.583Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Shortcuts",
      "label": "Shortcuts",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "shortcuts - List of shortcuts to watch for. See \"Shortcuts\" in the notes for defining shortcuts.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-07T07:50:02.583Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Panels",
      "label": "Panels",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "panels - Optional list of references to panels to detect events from. Events will only be fired when any of the listed panels has focus.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-07T07:50:02.583Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Left/Right Modifiers",
      "label": "Left/Right Modifiers",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "lrmodifiers - When on, the states of the left and right modifier keys (see Notes) will be added to the table. Switching the state of this parameter will reset the table's contents.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-07T07:50:02.583Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Callbacks DAT",
      "label": "Callbacks DAT",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "callbacks -  to a  containing callbacks for each keyboard event received. See keyboardinDAT_Class for usage.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-07T07:50:02.583Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Execute from",
      "label": "Execute from",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "executeloc -  - Determines the location the script is run from.\n\n current - The script is executed from the current node location (for example, where 'cc' points to). callbacks - op - The script is executed from the operator specified in the  parameter below.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-07T07:50:02.583Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Current Node",
      "label": "Current Node",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "current - The script is executed from the current node location (for example, where 'cc' points to). callbacks - op - The script is executed from the operator specified in the  parameter below.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-07T07:50:02.583Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "From Operator",
      "label": "From Operator",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "fromop - The operator whose state change will trigger the  to execute its script when  is set to . This operator is also the path that the script will be executed from if the  parameter is set to .",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-07T07:50:02.583Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Clamp Output",
      "label": "Clamp Output",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "clamp - The  is limited to 100 messages by default but with Clamp Output, this can be set to anything including unlimited.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-07T07:50:02.583Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Maximum Lines",
      "label": "Maximum Lines",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "maxlines - Limits the number of messages, older messages are removed from the list first.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-07T07:50:02.583Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Clear Output",
      "label": "Clear Output",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "clear - Deletes all lines except the heading.  To clear with a python script op(\"opname\").par.clear.pulse()",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-07T07:50:02.583Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Language",
      "label": "Language",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "language -  - Select how the  decides which script language to operate on.\n\n input - The  uses the inputs script language. node - The  uses it's own script language.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-07T07:50:02.583Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Input",
      "label": "Input",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "input - The  uses the inputs script language. node - The  uses it's own script language.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-07T07:50:02.583Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Edit/View Extension",
      "label": "Edit/View Extension",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "extension -  - Select the file extension this  should expose to external editors.\n\n dat - various common file extensions. language - pick extension from DATs script language. custom - Specify a custom extension.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-07T07:50:02.583Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "dat",
      "label": "dat",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "dat - various common file extensions. language - pick extension from DATs script language. custom - Specify a custom extension.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-07T07:50:02.583Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Custom Extension",
      "label": "Custom Extension",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "customext - Specifiy the custom extension.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-07T07:50:02.583Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Word Wrap",
      "label": "Word Wrap",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "wordwrap -  - Enable Word Wrap for Node Display.\n\n input - The  uses the inputs setting. on - Turn on Word Wrap. off - Turn off Word Wrap.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-07T07:50:02.583Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Input",
      "label": "Input",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "input - The  uses the inputs setting. on - Turn on Word Wrap. off - Turn off Word Wrap.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-07T07:50:02.583Z",
      "rawData": {},
      "sourceElement": null
    }
  ],
  "parameterGroups": {},
  "codeExamples": [],
  "pythonExamples": [],
  "expressions": [],
  "commonInputs": [],
  "commonOutputs": [],
  "relatedOperators": [],
  "workflowPatterns": [],
  "images": [],
  "videos": [],
  "assets": [],
  "keywords": [
    "keyboard",
    "in",
    "dat",
    "lists",
    "most",
    "recent",
    "events",
    "fifo",
    "(first",
    "in/first",
    "out)",
    "table."
  ],
  "tags": [
    "DAT",
    "TouchDesigner",
    "Keyboard In DAT"
  ],
  "searchWeight": 1,
  "contentHash": "",
  "processingDate": "2025-08-07T07:50:02.584Z",
  "processingVersion": "1.0.0",
  "isValid": true,
  "validationErrors": []
}