Python script to stream EEG data from the muse 2016 headset
Python script to stream EEG data from the muse 2016 headset
A Python package for streaming, visualizing, and recording EEG data from the Muse devices developed by InteraXon.
The code relies on a number of different bluetooth backends for connecting to the muse. We recommend using the bleak backend (enabled by default), but you may be interested in BlueMuse for a GUI to discover and connect to Muse devices on Windows or [bgapi] if you are on a Mac with a BLED112 dongle.
Requires Python 3.9+ (we recommend Python 3.10–3.12)
Compatible with Muse 2, Muse S, and the classic Muse (2016)
Note: if you run into any issues, first check out out Common Issues and then the Issues section of this repository
muselsl is both a command-line tool and a Python library. Pick the path that matches how you want to use it.
The simplest way to get the muselsl command is pipx, which installs it in its own isolated environment and puts it on your PATH — no virtual environment to manage.
macOS
brew install pipx
pipx ensurepath # one-time: adds pipx's app folder to your PATH
# close and reopen your terminal once after running ensurepath
pipx install muselslLinux (Debian/Ubuntu; use your distro's package manager elsewhere)
sudo apt install pipx
pipx ensurepath # one-time: adds pipx's app folder to your PATH
# close and reopen your terminal once after running ensurepath
pipx install muselslWindows (PowerShell, using the official python.org Python)
py -m pip install --user pipx
py -m pipx ensurepath
# close and reopen your terminal once after running ensurepath
pipx install muselslOnce installed, the muselsl command works from anywhere:
muselsl listInstall it into a virtual environment with pip:
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install muselslOn Windows 10, we recommend using the BlueMuse GUI to set up an LSL stream. On Mac and Linux, the easiest way to get Muse data is to use Muse LSL directly from the command line. Use the -h flag to get a comprehensive list of all commands and options.
To print a list of available muses:
$ muselsl listTo begin an LSL stream from the first available Muse:
$ muselsl stream To connect to a specific Muse you can pass the name of the device as an argument. Device names can be found on the inside of the left earpiece (e.g. Muse-41D2):
$ muselsl stream --name YOUR_DEVICE_NAMEYou can also directly pass the MAC address of your Muse. This provides the benefit of bypassing the device discovery step and can make connecting to devices quicker and more reliable:
$ muselsl stream --address YOUR_DEVICE_ADDRESSOnce an LSL stream is created, you have access to the following commands.
Note: the process running the stream command must be kept alive in order to maintain the LSL stream. These following commands should be run in another terminal or second process
To view data:
$ muselsl viewIf the visualization freezes or is laggy, you can also try the alternate version 2 of the viewer. Note: this will require the additional vispy and mne dependencies
$ muselsl view --version 2To record EEG data into a CSV:
$ muselsl record --duration 60 Note: this command will also save data from any LSL stream containing 'Markers' data, such as from the stimulus presentation scripts in EEG Notebooks
Alternatively, you can record data directly without using LSL through the following command:
$ muselsl record_direct --duration 60Note: direct recording does not allow 'Markers' data to be recorded
Muse LSL was designed so that the Muse could be used to run a number of classic EEG experiments, including the P300 event-related potential and the SSVEP and SSAEP evoked potentials.
The code to perform these experiments is still available, but is now maintained in the EEG Notebooks repository by the NeuroTechX community.
If you want to integrate Muse LSL into your own Python project, you can import and use its functions as you would any Python library. Examples are available in the examples folder:
from muselsl import stream, list_muses
muses = list_muses()
stream(muses[0]['address'])
# Note: Streaming is synchronous, so code here will not execute until after the stream has been closed
print('Stream has ended')In addition to EEG, the Muse also provides data from an accelerometer, gyroscope, and, in the case of the Muse 2, a photoplethysmography (PPG) sensor. These data types can be enabled via command line arguments or by passing the correct parameters to the stream function. Once enabled, PPG, accelerometer, and gyroscope data will streamed in their own separate LSL streams named "PPG", "ACC", and "GYRO", respectively.
To stream data from all sensors in a Muse 2 from the command line:
muselsl stream --ppg --acc --gyroAs a library function:
from muselsl import stream, list_muses
muses = list_muses()
stream(muses[0]['address'], ppg_enabled=True, acc_enabled=True, gyro_enabled=True)To record data from an alternate data source:
muselsl record --type ACCNote: The record process will only record from one data type at a time. However, multiple terminals or processes can be used to record from multiple data types simultaneously
Lab Streaming Layer or LSL is a system designed to unify the collection of time series data for research experiments. It has become standard in the field of EEG-based brain-computer interfaces for its ability to make seperate streams of data available on a network with time synchronization and near real-time access. For more information, check out this lecture from Modern Brain-Computer Interface Design or the LSL repository
--interface argument to provide the appropriate COM port value for the BLED112 device. The default value is COM9. To setup or view the device's COM port go to your OS's system settingserror: externally-managed-environment when running pip install (macOS/Linux):--break-system-packages; instead install the CLI with pipx, or install into a virtual environment, as described in Installation.pygatt.exceptions.BLEError: Unexpected error when scanning: Set scan parameters failed: Operation not permitted (Linux)libcap installed and run sudo setcap 'cap_net_raw,cap_net_admin+eip' `which hcitool`pygatt.exceptions.BLEError: No characteristic found matching 273e0003-4c4d-454d-96be-f03bac821358 (Linux)pip install pygatt==3.1.1pygatt.exceptions.BLEError: No BLE adapter found (Linux)pygatt.exceptions.BLEError: Unexpected error when scanning: Set scan parameters failed: Connection timed out (Linux)@misc{muse-lsl,
author = {Alexandre Barachant and
Dano Morrison and
Hubert Banville and
Jason Kowaleski and
Uri Shaked and
Sylvain Chevallier and
Juan Jesús Torre Tresols},
title = {muse-lsl},
month = may,
year = 2019,
doi = {10.5281/zenodo.3228861},
url = {https://doi.org/10.5281/zenodo.3228861}
}Alexandre Barachant, Dano Morrison, Hubert Banville, Jason Kowaleski, Uri Shaked, Sylvain Chevallier, & Juan Jesús Torre Tresols. (2019, May 25). muse-lsl (Version v2.0.2). Zenodo. http://doi.org/10.5281/zenodo.3228861
No open issues yet, or sync has not completed.