emg-gui
1. Overview
1.1 Introduction
A real-time visual engine for acquiring, recording, and exploring raw and filtered EMG signals.
1.2 Installation
EMG-GUI can be installed from pypi using pip:
pip install emg-gui
1.3 How to Run
TODO
2. Architecture and Project Structure
2.1 Architecture
The application separates sensor acquisition, interface controls, signal processing, and GPU rendering. Sensor polling and board stream control run on a dedicated thread, while Qt interface updates, filtering, and ModernGL rendering currently run on the main thread.
EMG GUI
├── app.py
├── Acquisition
│ ├── DataSource
│ └── SensorWorker
│ └── RingBuffer
├── UI
│ ├── EMGVisualizerWindow
│ └── EMGControlPanel
├── Processing
│ ├── EMG filtering
│ └── Window functions
└── Visualization
├── EMGOpenGLWidget
├── TimeSeriesRenderer
├── SpectrogramRenderer
├── TicksRenderer
└── TextRenderer
The DataSource provides hardware-independent acquisition from either an
OpenBCI board or a playback recording. The current application entry point uses
OpenBCIBoard by default, with playback available as an alternate source.
SensorWorker reads EMG samples into a fixed-size ring buffer, and
EMGOpenGLWidget owns duplicate-snapshot checks, snapshot filtering, and
ModernGL rendering. TimeSeriesRenderer and SpectrogramRenderer are connected
to the live rendering path. Channel counts come from the selected data source,
so synthetic and real boards can expose different numbers of EMG channels. The
display window is sample-based, while the rendered layout is derived from the
OpenGL widget size and the selected EMG channel count.
See the architecture guide for the detailed component hierarchy, data flow, and thread interaction sequences.
2.2 Directory Layout
Inside this project, you'll see the following folders and files:
/
├── docs/
│ ├── diagrams/
│ │ ├── Ability_Logo.svg
│ │ └── interface-contracts.svg
│ └── architecture.md
├── src/
│ └── emg_gui/
│ ├── app.py
│ ├── acquisition/
│ │ ├── data_source.py
│ │ ├── dataset_files.py
│ │ └── sensor_worker.py
│ ├── config/
│ │ ├── constants.py
│ │ └── Roboto-Black.ttf
│ ├── core/
│ │ ├── enums.py
│ │ ├── logger.py
│ │ └── types.py
│ ├── processing/
│ │ ├── filter.py
│ │ └── window_functions.py
│ ├── ui/
│ │ ├── control_panel.py
│ │ └── window.py
│ └── visualizer/
│ ├── shaders/
│ │ ├── shader_loader.py
│ │ ├── spec/
│ │ │ ├── vertex.glsl
│ │ │ └── fragment.glsl
│ │ ├── text/
│ │ │ ├── vertex.glsl
│ │ │ └── fragment.glsl
│ │ ├── ticks/
│ │ │ ├── vertex.glsl
│ │ │ └── fragment.glsl
│ │ └── time_series/
│ │ ├── vertex.glsl
│ │ └── fragment.glsl
│ ├── open_gl_widget.py
│ ├── spectrogram_renderer.py
│ ├── text_renderer.py
│ ├── ticks_renderer.py
│ └── time_series_renderer.py
├── tests/
├── CONTRIBUTING.md
├── pyproject.toml
└── README.md
3. Contributing
Contributions are welcome. See the contributing guide for development and linting guidelines.
4. Acknowledgements
4.1 BrainFlow
This project uses BrainFlow for biosignal acquisition and hardware integration. BrainFlow provides a uniform API for acquiring, parsing, and analyzing EEG, EMG, ECG, and other biosensor data across a wide range of supported boards, including OpenBCI devices. BrainFlow is distributed under the MIT License.
4.2 ModernGL Spectrogram
This project uses nickcercone/spectrogram as a reference for parts of its ModernGL spectrogram rendering implementation. The referenced project demonstrates real-time audio spectrogram visualization using ModernGL and is distributed under the MIT License.
4.3 Text Rendering
This project adapts the code in How to render text with PyOpenGL? by exiled (question) and Rabbid76 (answer) for its ModernGL text renderer. The referenced contributions demonstrate text rendering with PyOpenGL and are distributed under the CC BY-SA 4.0 License.
5. Tech Debt
- Add setup and installation instructions to this readme.
- Create new repo-emg-ability (create import and remove run.sh).
- Folder portability use EMGFlow & system path reference.
- Add legends for raw and filtered emg in timeseries renderer.
- Processing latency in the performance metrics.
- Improve the GUI toggle controls and expose their options in the left sidebar.
- Add timer and countdown visualizations.
- Move signal processing from the GUI thread to a dedicated processing thread.
- Move the complete data-source lifecycle into the sensor thread, including initialization, streaming, recording, stopping, and release.
Metadata
Release files for emg-gui 0.0.8
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| emg_gui-0.0.8.tar.gz | 105.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| emg_gui-0.0.8-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 217.2 kB
Release files / emg_gui-0.0.8.tar.gz
| Download URL | emg_gui-0.0.8.tar.gz |
|---|---|
| Size | 105.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f57f7126ce2167aaa69080745a1bcb880d33c560d2235bde55849281666d47ca
|
|
BLAKE2b-256 checksum How to use checksums |
416e29c727fb7184091ad93df0925e378b7ced01586a4a8fb356014f723a58c7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.
Transparency logRelease files / emg_gui-0.0.8-py3-none-any.whl
| Download URL | emg_gui-0.0.8-py3-none-any.whl |
|---|---|
| Size | 111.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
38cc0cdf93840e7001ae2901e8e7e261c35ab645c027fa5952d0e7d214a09dd1
|
|
BLAKE2b-256 checksum How to use checksums |
5f3e20e65e3bbadb007cbbea4a4fb7e649a5502c215db26b5f824d1bc140eaa6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.
Transparency log