Episode 3: Capturing Keystrokes

In this episode, you learn how to capture keystrokes with g.Pype.

Note

This page is still under development. Until we have the step-by-step instructions ready, please refer to the code example below.

File example_basic_keyboard.pyView file on GitHub

  1"""
  2Basic Keyboard Example - Interactive Event Markers and User Input
  3
  4This example demonstrates how to capture keyboard input and combine it with
  5signal data to create interactive BCI experiments. It shows how to use the
  6Keyboard node for real-time event marking and user interaction during data
  7visualization.
  8
  9What this example shows:
 10- Generating synthetic 8-channel EEG-like signals
 11- Capturing keyboard input (arrow keys) as event markers
 12- Combining signal data with keyboard events using Router
 13- Real-time visualization with color-coded event markers
 14- Interactive user input during signal processing
 15
 16Expected output:
 17When you run this example, you'll see:
 18- 8 channels of synthetic EEG signals in real-time
 19- Event markers appearing when you press arrow keys:
 20  * ↑ (Up): Red marker on channel 8
 21  * → (Right): Green marker on channel 8
 22  * ↓ (Down): Blue marker on channel 8
 23  * ← (Left): Black marker on channel 8
 24- Combined display of continuous signals and discrete events
 25
 26Interactive controls:
 27Press arrow keys while the application is running to create event markers.
 28Each key press generates a numerical code that appears as a colored spike
 29in the display and gets combined with the signal data.
 30
 31Real-world applications:
 32- BCI paradigm development and testing
 33- Event-related potential (ERP) experiments
 34- Motor imagery training with feedback
 35- Interactive neurofeedback applications
 36- Behavioral response recording during experiments
 37- Real-time experimental control and annotation
 38
 39Technical details:
 40- Router combines 8 signal channels + 1 event channel = 9 total channels
 41- Keyboard events appear on channel 8 (last channel)
 42- Event codes: Up=38, Right=39, Down=40, Left=37 (standard key codes)
 43- Markers provide visual feedback for successful key presses
 44- Real-time synchronization between signals and events
 45
 46Usage:
 47    python example_basic_keyboard.py
 48    Press arrow keys to create colored event markers
 49    Close window to stop the application
 50
 51Note:
 52    This example forms the basis for more complex interactive BCI paradigms
 53    where user input needs to be synchronized with neural signal recording.
 54"""
 55import gpype as gp
 56
 57fs = 250  # Sampling frequency in Hz
 58
 59if __name__ == "__main__":
 60    # Create the main application window
 61    app = gp.MainApp()
 62
 63    # Create processing pipeline
 64    p = gp.Pipeline()
 65
 66    # Generate synthetic 8-channel EEG-like signals
 67    source = gp.Generator(
 68        sampling_rate=fs,
 69        channel_count=8,  # 8 EEG channels
 70        signal_frequency=10,  # 10 Hz alpha rhythm
 71        signal_amplitude=10,  # Signal strength
 72        signal_shape="sine",  # Clean sine waves
 73        noise_amplitude=10,
 74    )  # Background noise
 75
 76    # Capture keyboard input as event markers
 77    keyboard = gp.Keyboard()  # Arrow keys -> numerical event codes
 78
 79    # Combine signal data (8 channels) + keyboard events (1 channel)
 80    router = gp.Router(input_selector=[gp.Router.ALL, gp.Router.ALL])
 81
 82    # Define colored markers for visual feedback (values are key codes)
 83    mk = gp.TimeSeriesScope.Markers
 84    markers = [
 85        mk(color="r", label="up", channel=8, value=38),
 86        mk(color="g", label="right", channel=8, value=39),
 87        mk(color="b", label="down", channel=8, value=40),
 88        mk(color="k", label="left", channel=8, value=37),
 89    ]
 90
 91    # Real-time visualization with interactive markers
 92    scope = gp.TimeSeriesScope(
 93        amplitude_limit=30,  # Y-axis range
 94        time_window=10,  # 10 seconds history
 95        markers=markers,
 96    )  # Event visualization
 97
 98    # Connect processing chain: signals + events -> combined display
 99    p.connect(source, router["in1"])  # Signal data -> Router input 1
100    p.connect(keyboard, router["in2"])  # Keyboard events -> Router input 2
101    p.connect(router, scope)  # Combined data -> Display
102
103    # Add scope to application window
104    app.add_widget(scope)
105
106    # Start interactive signal processing
107    p.start()  # Begin processing (press arrow keys for events)
108    app.run()  # Show GUI and start main loop
109    p.stop()  # Clean shutdown when window closes