User Tutorial:StimulusPresentation: Difference between revisions

From BCI2000 Wiki
Jump to navigation Jump to search
Line 108: Line 108:
param.Stimuli.RowLabels{6}  = 'Category';
param.Stimuli.RowLabels{6}  = 'Category';
param.Stimuli.RowLabels{7}  = 'EarlyOffsetExpression';
param.Stimuli.RowLabels{7}  = 'EarlyOffsetExpression';
</pre>
Create image stimuli
<pre>
%% Study images 1-50
for idx = 1:length(task_images)
    param.Stimuli.ColumnLabels{idx} = sprintf('%d',idx);
    param.Stimuli.Value{1,idx}      = '';
    param.Stimuli.Value{2,idx}      = sprintf('%s',fullfile('..','prog','images',task_images(idx).name));
    param.Stimuli.Value{3,idx}      = '';
    param.Stimuli.Value{4,idx}      = settings.TaskDuration;
    param.Stimuli.Value{5,idx}      = '0';     
    param.Stimuli.Value{6,idx}      = 'image';
    param.Stimuli.Value{7,idx}      = '';
end
</pre>
Create variable duration fixation cross
<pre>
%% inter-stimulus interval (fixation cross) 101-150
% variable duration from 0.5-1.5s
SamplingRate = str2double(settings.SamplingRate(1:end-2));
BlockSize    = str2double(settings.SampleBlockSize);
MinDuration  = str2double(settings.BaselineMinDuration(1:end-1));
MaxDuration  = str2double(settings.BaselineMaxDuration(1:end-1));
for idx = 101:100+length(task_images)
    blockvals = MinDuration:BlockSize/SamplingRate:MaxDuration;
    randval  = randi(length(blockvals));
    duration  = blockvals(randval);
   
    param.Stimuli.ColumnLabels{idx} = sprintf('%d',idx);
    param.Stimuli.Value{1,idx}      = '+';
    param.Stimuli.Value{2,idx}      = '';
    param.Stimuli.Value{3,idx}      = '';
    param.Stimuli.Value{4,idx}      = strcat(num2str(duration,7),'s');
    param.Stimuli.Value{5,idx}      = '0';     
    param.Stimuli.Value{6,idx}      = 'fixation';
    param.Stimuli.Value{7,idx}      = '';
end
</pre>
</pre>


==See Also==
==See Also==

Revision as of 18:07, 5 July 2022

Synopsis

This is a tutorial for implementing a stimulus presentation experiment using the default BCI2000 stimulus presentation application module. The BCI2000 stimulus presentation application module is implemented directly in C++ and has ongoing development support, making it ideal for creating stimulus presentation experiments. In this tutorial we will use a MATLAB script to create a BCI2000 parameter fragment (text file) detailing the experiment. With this script you can define different types of stimuli (images, audio, video, or other outputs), the stimulus duration, interstimulus interval, early offset expressions (for advancing to the next stimulus), and the sequence in which to present the stimuli. You can also store any other BCI2000 parameters (such as the source sampling rate) in this parameter fragment using the same structure described in this MATLAB script. This parameter fragment can be loaded into BCI2000 while running the Stimulus Presentation application module to run your experiment.

A parallel script for implementing BCI2000 stimulus presentation experiments in Python is coming soon!

Demo Script Location

The Stimulus Presentation MATLAB demo script can be found in the root directory of your BCI2000 folder in /tools/matlab/StimulusPresentationScript_Demo.m

A parallel version of this script implemented in Python is coming soon!

Video

Limitations

Note that the BCI2000 Stimulus Presentation application module is limited to feedforward experiments where the subjects behavior does not affect the experimental workflow.

Tutorial

Set bci2000 path

%% Set the path of the BCI2000 main directory here
BCI2000pathparts = regexp(pwd,filesep,'split');
BCI2000path = '';
for i = 1:length(BCI2000pathparts)-2
    BCI2000path = [BCI2000path BCI2000pathparts{i} filesep];
end
settings.BCI2000path = BCI2000path;
clear BCI2000path BCI2000pathparts i

% Add BCI2000 tools to path
addpath(genpath(fullfile(settings.BCI2000path,'tools')))

Settings

%% Settings
settings.SamplingRate          = '256Hz'; % device sampling rate
settings.SampleBlockSize       = '8';     % number of samples in a block

settings.PreRunDuration        = '2s';
settings.PostRunDuration       = '0.5s';
settings.TaskDuration          = '2s';
settings.InstructionDuration   = '30s';
settings.SyncPulseDuration     = '1s';
settings.BaselineMinDuration   = '0.5s';
settings.BaselineMaxDuration   = '1.5s';
settings.NumberOfSequences     = '1';
settings.StimulusWidth         = '30';
settings.WindowTop             = '0';
settings.WindowLeft            = '0';
settings.WindowWidth           = '640';
settings.WindowHeight          = '480';
settings.BackgroundColor       = '0x000000';
settings.CaptionColor          = '0xFFFFFF';
settings.CaptionSwitch         = '1';
settings.WindowBackgroundColor = '0x000000';
settings.ISIMinDuration        = '0s';
settings.ISIMaxDuration        = '0s';
settings.SubjectName           = 'BCI';
settings.DataDirectory         = fullfile('..','data');
settings.SubjectSession        = 'auto';
settings.SubjectRun            = '01';
settings.parm_filename         = fullfile(settings.BCI2000path,'parms','demo_parms.prm');
settings.UserComment           = 'Enter user comment here';

settings.InstructionsCaption   = {'Stimulus Presentation Task. Press space to continue'; 'End of task.'};


Get task images

%% Get task images
task_images = dir(fullfile(settings.BCI2000path,'prog','images','*.bmp'));

Initialize stimuli

%% Set up the different stimuli so they are represented by unique stimulus codes, separated into banks for easy evaluation later
n_stimuli = 301; % Total events
n_rows    = 7;

% break down into blocks for easier analysis later
% 1-50:    image stimuli
% 101-150: inter-stimulus interval (variable duration)
% 201:     instructions
% 301:     sync pulse


% Set up Stimuli
param.Stimuli.Section         = 'Application';
param.Stimuli.Type            = 'matrix';
param.Stimuli.DefaultValue    = '';
param.Stimuli.LowRange        = '';
param.Stimuli.HighRange       = '';
param.Stimuli.Comment         = 'captions and icons to be displayed, sounds to be played for different stimuli';
param.Stimuli.Value           = cell(n_rows,n_stimuli);
param.Stimuli.Value(:)        = {''};
param.Stimuli.RowLabels       = cell(n_rows,1);
param.Stimuli.RowLabels(:)    = {''};
param.Stimuli.ColumnLabels    = cell(1,n_stimuli);
param.Stimuli.ColumnLabels(:) = {''};

param.Stimuli.RowLabels{1}  = 'caption';
param.Stimuli.RowLabels{2}  = 'icon';
param.Stimuli.RowLabels{3}  = 'audio';
param.Stimuli.RowLabels{4}  = 'StimulusDuration';
param.Stimuli.RowLabels{5}  = 'AudioVolume';
param.Stimuli.RowLabels{6}  = 'Category';
param.Stimuli.RowLabels{7}  = 'EarlyOffsetExpression';

Create image stimuli

%% Study images 1-50
for idx = 1:length(task_images)
    param.Stimuli.ColumnLabels{idx} = sprintf('%d',idx);
    param.Stimuli.Value{1,idx}      = '';
    param.Stimuli.Value{2,idx}      = sprintf('%s',fullfile('..','prog','images',task_images(idx).name));
    param.Stimuli.Value{3,idx}      = '';
    param.Stimuli.Value{4,idx}      = settings.TaskDuration;
    param.Stimuli.Value{5,idx}      = '0';      
    param.Stimuli.Value{6,idx}      = 'image'; 
    param.Stimuli.Value{7,idx}      = ''; 
end 

Create variable duration fixation cross

%% inter-stimulus interval (fixation cross) 101-150
% variable duration from 0.5-1.5s
SamplingRate = str2double(settings.SamplingRate(1:end-2));
BlockSize    = str2double(settings.SampleBlockSize);
MinDuration  = str2double(settings.BaselineMinDuration(1:end-1));
MaxDuration  = str2double(settings.BaselineMaxDuration(1:end-1));
for idx = 101:100+length(task_images)
    blockvals = MinDuration:BlockSize/SamplingRate:MaxDuration;
    randval   = randi(length(blockvals));
    duration  = blockvals(randval);
    
    param.Stimuli.ColumnLabels{idx} = sprintf('%d',idx);
    param.Stimuli.Value{1,idx}      = '+';
    param.Stimuli.Value{2,idx}      = '';
    param.Stimuli.Value{3,idx}      = '';
    param.Stimuli.Value{4,idx}      = strcat(num2str(duration,7),'s');
    param.Stimuli.Value{5,idx}      = '0';      
    param.Stimuli.Value{6,idx}      = 'fixation'; 
    param.Stimuli.Value{7,idx}      = ''; 
end

See Also