Tantang ingatan Anda! Mainkan permainan N-Back baru di Aplikasi Emotiv

  • Tantang ingatan Anda! Mainkan permainan N-Back baru di Aplikasi Emotiv

Lapisan Streaming Lab (LSL) untuk menyinkronkan beberapa aliran data

Roshini Randeniya

1 Okt 2025

Bagikan:

oleh Roshini Randeniya dan Lucas Kleine

Operasi:
Sesaat setelah dijalankan di command line, skrip ini segera memulai aliran LSL. Setiap kali tombol 'Enter' ditekan, ia mengirimkan pemicu dan memutar file audio."""

import sounddevice as sd
import soundfile as sf
from pylsl import StreamInfo, StreamOutlet

def wait_for_keypress():
print("Tekan ENTER untuk memulai pemutaran audio dan mengirim penanda LSL.")

while True: # This loop waits for a keyboard input
    input_str = input()  # Wait for input from the terminal
    if input_str == "":  # If the enter key is pressed, proceed
        break

def AudioMarker(audio_file, outlet): # fungsi untuk memutar audio dan mengirim penanda
data, fs = sf.read(audio_file) # Memuat file audio

print("Playing audio and sending LSL marker...")
marker_val = [1]
outlet.push_sample(marker_val) # Send marker indicating the start of audio playback
sd.play(data, fs) # play the audio
sd.wait()  # Wait until audio is done playing
print("Audio playback finished.")

if name == "main": # MAIN LOOP
# Menyiapkan aliran LSL untuk penanda
stream_name = 'AudioMarkers'
stream_type = 'Markers'
n_chans = 1
sr = 0 # Diatur ke 0 laju sampling karena penanda tidak teratur
chan_format = 'int32'
marker_id = 'uniqueMarkerID12345'

info = StreamInfo(stream_name, stream_type, n_chans, sr, chan_format, marker_id)
outlet = StreamOutlet(info) # create LSL outlet

# Keep the script running and wait for ENTER key to play audio and send marker
while True:
    wait_for_keypress()
    audio_filepath = "/path/to/your/audio_file.wav"  # replace with correct path to your audio file
    AudioMarker(audio_filepath, outlet)
    # After playing audio and sending a marker, the script goes back to waiting for the next keypress</code></pre><p><em><strong>**By running this file (even before playing the audio), you've initiated an LSL stream through an outlet</strong></em><strong>. Now we'll view that stream in LabRecorder</strong></p><p><strong>STEP 5 - Use LabRecorder to view and save all LSL streams</strong></p><ol><li data-preset-tag="p"><p>Open LabRecorder</p></li><li data-preset-tag="p"><p>Press <em><strong>Update</strong></em>. The available LSL streams should be visible in the stream list<br> • You should be able to see streams from both EmotivPROs (usually called "EmotivDataStream") and the marker stream (called "AudioMarkers")</p></li><li data-preset-tag="p"><p>Click <em><strong>Browse</strong></em> to select a location to store data (and set other parameters)</p></li><li data-preset-tag="p"><p>Select all streams and press <em><strong>Record</strong></em> to start recording</p></li><li data-preset-tag="p"><p>Click Stop when you want to end the recording</p></li></ol><p><br></p><img alt="" src="https://framerusercontent.com/images/HFGuJF9ErVu2Jxrgtqt11tl0No.jpg"><h2><strong>Working with the data</strong></h2><p><strong>LabRecorder outputs an XDF file (Extensible Data Format) that contains data from all the streams. XDF files are structured into, </strong><em><strong>streams</strong></em><strong>, each with a different </strong><em><strong>header</strong></em><strong> that describes what it contains (device name, data type, sampling rate, channels, and more). You can use the below codeblock to open your XDF file and display some basic information.</strong></p><pre data-language="JSX"><code>

**Dengan menjalankan file ini (bahkan sebelum memutar audio), Anda telah memulai aliran LSL melalui outlet. Sekarang kita akan melihat aliran itu di LabRecorder

LANGKAH 5 - Gunakan LabRecorder untuk melihat dan menyimpan semua aliran LSL

  1. Buka LabRecorder

  2. Tekan Update. Aliran LSL yang tersedia akan terlihat di daftar aliran
    • Anda harus dapat melihat aliran dari kedua EmotivPROs (biasanya disebut "EmotivDataStream") dan aliran penanda (disebut "AudioMarkers")

  3. Klik Browse untuk memilih lokasi menyimpan data (dan mengatur parameter lainnya)

  4. Pilih semua aliran dan tekan Record untuk memulai perekaman

  5. Klik Stop ketika Anda ingin mengakhiri perekaman



Bekerja dengan data

LabRecorder menghasilkan file XDF (Extensible Data Format) yang berisi data dari semua aliran. File XDF disusun menjadi, aliran, masing-masing dengan header yang berbeda yang mendeskripsikan isinya (nama perangkat, jenis data, laju sampling, saluran, dan lainnya). Anda dapat menggunakan kode berikut untuk membuka file XDF Anda dan menampilkan beberapa informasi dasar.

Skrip contoh ini mendemonstrasikan beberapa fungsi dasar untuk mengimpor dan menganotasi data EEG yang dikumpulkan dari perangkat lunak EmotivPRO. Skrip ini menggunakan MNE untuk memuat file XDF, mencetak beberapa metadata dasar, membuat objek info dan memplot spektrum daya."""

import pyxdf
import mne
import matplotlib.pyplot as plt
import numpy as np

Jalur ke file XDF Anda

data_path = '/path/to/your/xdf_file.xdf'

Muat file XDF

streams, fileheader = pyxdf.load_xdf(data_path)
print("Header File XDF:", fileheader)
print("Jumlah aliran yang ditemukan:", len(streams))

for i, stream in enumerate(streams):
print("\nAliran", i + 1)
print("Nama Aliran:", stream['info']['name'][0])
print("Jenis Aliran:", stream['info']['type'][0])
print("Jumlah Saluran:", stream['info']['channel_count'][0])
sfreq = float(stream['info']['nominal_srate'][0])
print("Laju Sampling:", sfreq)
print("Jumlah Sampel:", len(stream['time_series']))
print("Cetak 5 titik data pertama:", stream['time_series'][:5])

channel_names = [chan['label'][0] for chan in stream['info']['desc'][0]['channels'][0]['channel']]
print("Channel Names:", channel_names)
channel_types = 'eeg'
Buat objek info MNE

info = mne.create_info(channel_names, sfreq, channel_types)
data = np.array(stream['time_series']).T # Data perlu ditransposiskan: saluran x sampel
raw = mne.io.RawArray(data, info)
raw.plot_psd(fmax=50) # memplot spektrogram sederhana (kepadatan spektral daya)Sumber daya tambahanDownload tutorial ini sebagai notebook Jupyter dari GitHub EMOTIVPeriksa dokumentasi online LSL, termasuk file README resmi di GitHubAnda memerlukan satu atau lebih perangkat akuisisi data yang didukung untuk mengumpulkan dataSemua perangkat brainware EMOTIV terhubung ke perangkat lunak EmotivPRO, yang memiliki kemampuan LSL bawaan untuk mengirim dan menerima aliran dataSumber daya tambahan:Kode untuk menjalankan LSL menggunakan perangkat Emotiv, dengan skrip contohDemo LSL berguna di YouTubeRepositori LSL SCCN GitHub untuk semua pustaka terkaitRepositori GitHub untuk kumpulan submodul dan aplikasiPipeline analisis HyPyP untuk studi Hyperscanning

oleh Roshini Randeniya dan Lucas Kleine

Operasi:
Sesaat setelah dijalankan di command line, skrip ini segera memulai aliran LSL. Setiap kali tombol 'Enter' ditekan, ia mengirimkan pemicu dan memutar file audio."""

import sounddevice as sd
import soundfile as sf
from pylsl import StreamInfo, StreamOutlet

def wait_for_keypress():
print("Tekan ENTER untuk memulai pemutaran audio dan mengirim penanda LSL.")

while True: # This loop waits for a keyboard input
    input_str = input()  # Wait for input from the terminal
    if input_str == "":  # If the enter key is pressed, proceed
        break

def AudioMarker(audio_file, outlet): # fungsi untuk memutar audio dan mengirim penanda
data, fs = sf.read(audio_file) # Memuat file audio

print("Playing audio and sending LSL marker...")
marker_val = [1]
outlet.push_sample(marker_val) # Send marker indicating the start of audio playback
sd.play(data, fs) # play the audio
sd.wait()  # Wait until audio is done playing
print("Audio playback finished.")

if name == "main": # MAIN LOOP
# Menyiapkan aliran LSL untuk penanda
stream_name = 'AudioMarkers'
stream_type = 'Markers'
n_chans = 1
sr = 0 # Diatur ke 0 laju sampling karena penanda tidak teratur
chan_format = 'int32'
marker_id = 'uniqueMarkerID12345'

info = StreamInfo(stream_name, stream_type, n_chans, sr, chan_format, marker_id)
outlet = StreamOutlet(info) # create LSL outlet

# Keep the script running and wait for ENTER key to play audio and send marker
while True:
    wait_for_keypress()
    audio_filepath = "/path/to/your/audio_file.wav"  # replace with correct path to your audio file
    AudioMarker(audio_filepath, outlet)
    # After playing audio and sending a marker, the script goes back to waiting for the next keypress</code></pre><p><em><strong>**By running this file (even before playing the audio), you've initiated an LSL stream through an outlet</strong></em><strong>. Now we'll view that stream in LabRecorder</strong></p><p><strong>STEP 5 - Use LabRecorder to view and save all LSL streams</strong></p><ol><li data-preset-tag="p"><p>Open LabRecorder</p></li><li data-preset-tag="p"><p>Press <em><strong>Update</strong></em>. The available LSL streams should be visible in the stream list<br> • You should be able to see streams from both EmotivPROs (usually called "EmotivDataStream") and the marker stream (called "AudioMarkers")</p></li><li data-preset-tag="p"><p>Click <em><strong>Browse</strong></em> to select a location to store data (and set other parameters)</p></li><li data-preset-tag="p"><p>Select all streams and press <em><strong>Record</strong></em> to start recording</p></li><li data-preset-tag="p"><p>Click Stop when you want to end the recording</p></li></ol><p><br></p><img alt="" src="https://framerusercontent.com/images/HFGuJF9ErVu2Jxrgtqt11tl0No.jpg"><h2><strong>Working with the data</strong></h2><p><strong>LabRecorder outputs an XDF file (Extensible Data Format) that contains data from all the streams. XDF files are structured into, </strong><em><strong>streams</strong></em><strong>, each with a different </strong><em><strong>header</strong></em><strong> that describes what it contains (device name, data type, sampling rate, channels, and more). You can use the below codeblock to open your XDF file and display some basic information.</strong></p><pre data-language="JSX"><code>

**Dengan menjalankan file ini (bahkan sebelum memutar audio), Anda telah memulai aliran LSL melalui outlet. Sekarang kita akan melihat aliran itu di LabRecorder

LANGKAH 5 - Gunakan LabRecorder untuk melihat dan menyimpan semua aliran LSL

  1. Buka LabRecorder

  2. Tekan Update. Aliran LSL yang tersedia akan terlihat di daftar aliran
    • Anda harus dapat melihat aliran dari kedua EmotivPROs (biasanya disebut "EmotivDataStream") dan aliran penanda (disebut "AudioMarkers")

  3. Klik Browse untuk memilih lokasi menyimpan data (dan mengatur parameter lainnya)

  4. Pilih semua aliran dan tekan Record untuk memulai perekaman

  5. Klik Stop ketika Anda ingin mengakhiri perekaman



Bekerja dengan data

LabRecorder menghasilkan file XDF (Extensible Data Format) yang berisi data dari semua aliran. File XDF disusun menjadi, aliran, masing-masing dengan header yang berbeda yang mendeskripsikan isinya (nama perangkat, jenis data, laju sampling, saluran, dan lainnya). Anda dapat menggunakan kode berikut untuk membuka file XDF Anda dan menampilkan beberapa informasi dasar.

Skrip contoh ini mendemonstrasikan beberapa fungsi dasar untuk mengimpor dan menganotasi data EEG yang dikumpulkan dari perangkat lunak EmotivPRO. Skrip ini menggunakan MNE untuk memuat file XDF, mencetak beberapa metadata dasar, membuat objek info dan memplot spektrum daya."""

import pyxdf
import mne
import matplotlib.pyplot as plt
import numpy as np

Jalur ke file XDF Anda

data_path = '/path/to/your/xdf_file.xdf'

Muat file XDF

streams, fileheader = pyxdf.load_xdf(data_path)
print("Header File XDF:", fileheader)
print("Jumlah aliran yang ditemukan:", len(streams))

for i, stream in enumerate(streams):
print("\nAliran", i + 1)
print("Nama Aliran:", stream['info']['name'][0])
print("Jenis Aliran:", stream['info']['type'][0])
print("Jumlah Saluran:", stream['info']['channel_count'][0])
sfreq = float(stream['info']['nominal_srate'][0])
print("Laju Sampling:", sfreq)
print("Jumlah Sampel:", len(stream['time_series']))
print("Cetak 5 titik data pertama:", stream['time_series'][:5])

channel_names = [chan['label'][0] for chan in stream['info']['desc'][0]['channels'][0]['channel']]
print("Channel Names:", channel_names)
channel_types = 'eeg'
Buat objek info MNE

info = mne.create_info(channel_names, sfreq, channel_types)
data = np.array(stream['time_series']).T # Data perlu ditransposiskan: saluran x sampel
raw = mne.io.RawArray(data, info)
raw.plot_psd(fmax=50) # memplot spektrogram sederhana (kepadatan spektral daya)Sumber daya tambahanDownload tutorial ini sebagai notebook Jupyter dari GitHub EMOTIVPeriksa dokumentasi online LSL, termasuk file README resmi di GitHubAnda memerlukan satu atau lebih perangkat akuisisi data yang didukung untuk mengumpulkan dataSemua perangkat brainware EMOTIV terhubung ke perangkat lunak EmotivPRO, yang memiliki kemampuan LSL bawaan untuk mengirim dan menerima aliran dataSumber daya tambahan:Kode untuk menjalankan LSL menggunakan perangkat Emotiv, dengan skrip contohDemo LSL berguna di YouTubeRepositori LSL SCCN GitHub untuk semua pustaka terkaitRepositori GitHub untuk kumpulan submodul dan aplikasiPipeline analisis HyPyP untuk studi Hyperscanning

oleh Roshini Randeniya dan Lucas Kleine

Operasi:
Sesaat setelah dijalankan di command line, skrip ini segera memulai aliran LSL. Setiap kali tombol 'Enter' ditekan, ia mengirimkan pemicu dan memutar file audio."""

import sounddevice as sd
import soundfile as sf
from pylsl import StreamInfo, StreamOutlet

def wait_for_keypress():
print("Tekan ENTER untuk memulai pemutaran audio dan mengirim penanda LSL.")

while True: # This loop waits for a keyboard input
    input_str = input()  # Wait for input from the terminal
    if input_str == "":  # If the enter key is pressed, proceed
        break

def AudioMarker(audio_file, outlet): # fungsi untuk memutar audio dan mengirim penanda
data, fs = sf.read(audio_file) # Memuat file audio

print("Playing audio and sending LSL marker...")
marker_val = [1]
outlet.push_sample(marker_val) # Send marker indicating the start of audio playback
sd.play(data, fs) # play the audio
sd.wait()  # Wait until audio is done playing
print("Audio playback finished.")

if name == "main": # MAIN LOOP
# Menyiapkan aliran LSL untuk penanda
stream_name = 'AudioMarkers'
stream_type = 'Markers'
n_chans = 1
sr = 0 # Diatur ke 0 laju sampling karena penanda tidak teratur
chan_format = 'int32'
marker_id = 'uniqueMarkerID12345'

info = StreamInfo(stream_name, stream_type, n_chans, sr, chan_format, marker_id)
outlet = StreamOutlet(info) # create LSL outlet

# Keep the script running and wait for ENTER key to play audio and send marker
while True:
    wait_for_keypress()
    audio_filepath = "/path/to/your/audio_file.wav"  # replace with correct path to your audio file
    AudioMarker(audio_filepath, outlet)
    # After playing audio and sending a marker, the script goes back to waiting for the next keypress</code></pre><p><em><strong>**By running this file (even before playing the audio), you've initiated an LSL stream through an outlet</strong></em><strong>. Now we'll view that stream in LabRecorder</strong></p><p><strong>STEP 5 - Use LabRecorder to view and save all LSL streams</strong></p><ol><li data-preset-tag="p"><p>Open LabRecorder</p></li><li data-preset-tag="p"><p>Press <em><strong>Update</strong></em>. The available LSL streams should be visible in the stream list<br> • You should be able to see streams from both EmotivPROs (usually called "EmotivDataStream") and the marker stream (called "AudioMarkers")</p></li><li data-preset-tag="p"><p>Click <em><strong>Browse</strong></em> to select a location to store data (and set other parameters)</p></li><li data-preset-tag="p"><p>Select all streams and press <em><strong>Record</strong></em> to start recording</p></li><li data-preset-tag="p"><p>Click Stop when you want to end the recording</p></li></ol><p><br></p><img alt="" src="https://framerusercontent.com/images/HFGuJF9ErVu2Jxrgtqt11tl0No.jpg"><h2><strong>Working with the data</strong></h2><p><strong>LabRecorder outputs an XDF file (Extensible Data Format) that contains data from all the streams. XDF files are structured into, </strong><em><strong>streams</strong></em><strong>, each with a different </strong><em><strong>header</strong></em><strong> that describes what it contains (device name, data type, sampling rate, channels, and more). You can use the below codeblock to open your XDF file and display some basic information.</strong></p><pre data-language="JSX"><code>

**Dengan menjalankan file ini (bahkan sebelum memutar audio), Anda telah memulai aliran LSL melalui outlet. Sekarang kita akan melihat aliran itu di LabRecorder

LANGKAH 5 - Gunakan LabRecorder untuk melihat dan menyimpan semua aliran LSL

  1. Buka LabRecorder

  2. Tekan Update. Aliran LSL yang tersedia akan terlihat di daftar aliran
    • Anda harus dapat melihat aliran dari kedua EmotivPROs (biasanya disebut "EmotivDataStream") dan aliran penanda (disebut "AudioMarkers")

  3. Klik Browse untuk memilih lokasi menyimpan data (dan mengatur parameter lainnya)

  4. Pilih semua aliran dan tekan Record untuk memulai perekaman

  5. Klik Stop ketika Anda ingin mengakhiri perekaman



Bekerja dengan data

LabRecorder menghasilkan file XDF (Extensible Data Format) yang berisi data dari semua aliran. File XDF disusun menjadi, aliran, masing-masing dengan header yang berbeda yang mendeskripsikan isinya (nama perangkat, jenis data, laju sampling, saluran, dan lainnya). Anda dapat menggunakan kode berikut untuk membuka file XDF Anda dan menampilkan beberapa informasi dasar.

Skrip contoh ini mendemonstrasikan beberapa fungsi dasar untuk mengimpor dan menganotasi data EEG yang dikumpulkan dari perangkat lunak EmotivPRO. Skrip ini menggunakan MNE untuk memuat file XDF, mencetak beberapa metadata dasar, membuat objek info dan memplot spektrum daya."""

import pyxdf
import mne
import matplotlib.pyplot as plt
import numpy as np

Jalur ke file XDF Anda

data_path = '/path/to/your/xdf_file.xdf'

Muat file XDF

streams, fileheader = pyxdf.load_xdf(data_path)
print("Header File XDF:", fileheader)
print("Jumlah aliran yang ditemukan:", len(streams))

for i, stream in enumerate(streams):
print("\nAliran", i + 1)
print("Nama Aliran:", stream['info']['name'][0])
print("Jenis Aliran:", stream['info']['type'][0])
print("Jumlah Saluran:", stream['info']['channel_count'][0])
sfreq = float(stream['info']['nominal_srate'][0])
print("Laju Sampling:", sfreq)
print("Jumlah Sampel:", len(stream['time_series']))
print("Cetak 5 titik data pertama:", stream['time_series'][:5])

channel_names = [chan['label'][0] for chan in stream['info']['desc'][0]['channels'][0]['channel']]
print("Channel Names:", channel_names)
channel_types = 'eeg'
Buat objek info MNE

info = mne.create_info(channel_names, sfreq, channel_types)
data = np.array(stream['time_series']).T # Data perlu ditransposiskan: saluran x sampel
raw = mne.io.RawArray(data, info)
raw.plot_psd(fmax=50) # memplot spektrogram sederhana (kepadatan spektral daya)Sumber daya tambahanDownload tutorial ini sebagai notebook Jupyter dari GitHub EMOTIVPeriksa dokumentasi online LSL, termasuk file README resmi di GitHubAnda memerlukan satu atau lebih perangkat akuisisi data yang didukung untuk mengumpulkan dataSemua perangkat brainware EMOTIV terhubung ke perangkat lunak EmotivPRO, yang memiliki kemampuan LSL bawaan untuk mengirim dan menerima aliran dataSumber daya tambahan:Kode untuk menjalankan LSL menggunakan perangkat Emotiv, dengan skrip contohDemo LSL berguna di YouTubeRepositori LSL SCCN GitHub untuk semua pustaka terkaitRepositori GitHub untuk kumpulan submodul dan aplikasiPipeline analisis HyPyP untuk studi Hyperscanning

Lanjutkan membaca

Dasar-dasar Osilasi Neural