This commit is contained in:
2021-10-14 13:47:35 +02:00
commit 6625a8dfaa
4026 changed files with 844291 additions and 0 deletions
@@ -0,0 +1 @@
This folder contains configuration files created by the SSVEP scenarios.
@@ -0,0 +1 @@
This folder contains materials created by the SSVEP scenarios.
@@ -0,0 +1 @@
This folder contains classifiers and CSP filters created by the SSVEP scenarios.
@@ -0,0 +1 @@
This folder contains configuration files generated by the scenarios.
@@ -0,0 +1,672 @@
<OpenViBE-Scenario>
<FormatVersion>1</FormatVersion>
<Creator>OpenVIBE</Creator>
<CreatorVersion>0.1.99</CreatorVersion>
<Settings></Settings>
<Inputs></Inputs>
<Outputs></Outputs>
<Boxes>
<Box>
<Identifier>(0x00000efb, 0x00007452)</Identifier>
<Name>Time based epoching</Name>
<AlgorithmClassIdentifier>(0x00777fa0, 0x5dc3f560)</AlgorithmClassIdentifier>
<Inputs>
<Input>
<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
<Name>Input signal</Name>
</Input>
</Inputs>
<Outputs>
<Output>
<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
<Name>Epoched signal 1</Name>
</Output>
</Outputs>
<Settings>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Epoch 1 duration (in sec)</Name>
<DefaultValue>1</DefaultValue>
<Value>2.000000</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Epoch 1 intervals (in sec)</Name>
<DefaultValue>0.5</DefaultValue>
<Value>0.250000</Value>
<Modifiability>false</Modifiability>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x17ee7c08, 0x94c14893)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>112.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>560.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0xc5ff41e9, 0xccc59a01)</Value>
</Attribute>
<Attribute>
<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
<Value>(0x00000000, 0x002363af)</Value>
</Attribute>
<Attribute>
<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
<Value>1</Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>2</Value>
</Attribute>
<Attribute>
<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
<Value>1</Value>
</Attribute>
</Attributes>
</Box>
<Box>
<Identifier>(0x000026ba, 0x000014fc)</Identifier>
<Name>Spectral analysis</Name>
<AlgorithmClassIdentifier>(0x84218ff8, 0xa87e7995)</AlgorithmClassIdentifier>
<Inputs>
<Input>
<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
<Name>Input signal</Name>
</Input>
</Inputs>
<Outputs>
<Output>
<TypeIdentifier>(0x1f261c0a, 0x593bf6bd)</TypeIdentifier>
<Name>Amplitude</Name>
</Output>
<Output>
<TypeIdentifier>(0x1f261c0a, 0x593bf6bd)</TypeIdentifier>
<Name>Phase</Name>
</Output>
<Output>
<TypeIdentifier>(0x1f261c0a, 0x593bf6bd)</TypeIdentifier>
<Name>Real Part</Name>
</Output>
<Output>
<TypeIdentifier>(0x1f261c0a, 0x593bf6bd)</TypeIdentifier>
<Name>Imag Part</Name>
</Output>
</Outputs>
<Settings>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Amplitude</Name>
<DefaultValue>true</DefaultValue>
<Value>true</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Phase</Name>
<DefaultValue>false</DefaultValue>
<Value>false</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Real Part</Name>
<DefaultValue>false</DefaultValue>
<Value>false</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Imaginary Part</Name>
<DefaultValue>false</DefaultValue>
<Value>false</Value>
<Modifiability>false</Modifiability>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>192.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>560.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0x4e5c55a0, 0xe69eb7db)</Value>
</Attribute>
<Attribute>
<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
<Value>(0x00000000, 0x004039af)</Value>
</Attribute>
<Attribute>
<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
<Value>4</Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>1</Value>
</Attribute>
<Attribute>
<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
<Value>1</Value>
</Attribute>
</Attributes>
</Box>
<Box>
<Identifier>(0x0000441d, 0x00001a28)</Identifier>
<Name>Acquisition client</Name>
<AlgorithmClassIdentifier>(0x35d225cb, 0x3e6e3a5f)</AlgorithmClassIdentifier>
<Outputs>
<Output>
<TypeIdentifier>(0x403488e7, 0x565d70b6)</TypeIdentifier>
<Name>Experiment information</Name>
</Output>
<Output>
<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
<Name>Signal stream</Name>
</Output>
<Output>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>Stimulations</Name>
</Output>
<Output>
<TypeIdentifier>(0x013df452, 0xa3a8879a)</TypeIdentifier>
<Name>Channel localisation</Name>
</Output>
<Output>
<TypeIdentifier>(0x6ab26b81, 0x0f8c02f3)</TypeIdentifier>
<Name>Channel units</Name>
</Output>
</Outputs>
<Settings>
<Setting>
<TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier>
<Name>Acquisition server hostname</Name>
<DefaultValue>${AcquisitionServer_HostName}</DefaultValue>
<Value>${AcquisitionServer_HostName}</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier>
<Name>Acquisition server port</Name>
<DefaultValue>1024</DefaultValue>
<Value>1024</Value>
<Modifiability>false</Modifiability>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>-16.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>560.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0x0d4656c0, 0xc95b1fa8)</Value>
</Attribute>
<Attribute>
<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
<Value>(0x00000000, 0x00596403)</Value>
</Attribute>
<Attribute>
<Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier>
<Value>false</Value>
</Attribute>
<Attribute>
<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
<Value>5</Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>2</Value>
</Attribute>
</Attributes>
</Box>
<Box>
<Identifier>(0x00006e09, 0x00006c54)</Identifier>
<Name>Temporal filter</Name>
<AlgorithmClassIdentifier>(0xb4f9d042, 0x9d79f2e5)</AlgorithmClassIdentifier>
<Inputs>
<Input>
<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
<Name>Input signal</Name>
</Input>
</Inputs>
<Outputs>
<Output>
<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
<Name>Filtered signal</Name>
</Output>
</Outputs>
<Settings>
<Setting>
<TypeIdentifier>(0x2f2c606c, 0x8512ed68)</TypeIdentifier>
<Name>Filter method</Name>
<DefaultValue>Butterworth</DefaultValue>
<Value>Butterworth</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0xfa20178e, 0x4cba62e9)</TypeIdentifier>
<Name>Filter type</Name>
<DefaultValue>Band pass</DefaultValue>
<Value>Band pass</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier>
<Name>Filter order</Name>
<DefaultValue>4</DefaultValue>
<Value>4</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Low cut frequency (Hz)</Name>
<DefaultValue>29</DefaultValue>
<Value>3.000000</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>High cut frequency (Hz)</Name>
<DefaultValue>40</DefaultValue>
<Value>40.000000</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Pass band ripple (dB)</Name>
<DefaultValue>0.5</DefaultValue>
<Value>0.500000</Value>
<Modifiability>false</Modifiability>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>48.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>560.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0x27a4ceec, 0x876d6384)</Value>
</Attribute>
<Attribute>
<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
<Value>(0x00000000, 0x005c78a8)</Value>
</Attribute>
<Attribute>
<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
<Value>1</Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>6</Value>
</Attribute>
<Attribute>
<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
<Value>1</Value>
</Attribute>
</Attributes>
</Box>
<Box>
<Identifier>(0x00006ff2, 0x000035c1)</Identifier>
<Name>Signal display</Name>
<AlgorithmClassIdentifier>(0x0055be5f, 0x087bdd12)</AlgorithmClassIdentifier>
<Inputs>
<Input>
<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
<Name>Data</Name>
</Input>
<Input>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>Stimulations</Name>
</Input>
<Input>
<TypeIdentifier>(0x6ab26b81, 0x0f8c02f3)</TypeIdentifier>
<Name>Channel Units</Name>
</Input>
</Inputs>
<Settings>
<Setting>
<TypeIdentifier>(0x5de046a6, 0x086340aa)</TypeIdentifier>
<Name>Display Mode</Name>
<DefaultValue>Scan</DefaultValue>
<Value>Scan</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x33a30739, 0x00d5299b)</TypeIdentifier>
<Name>Auto vertical scale</Name>
<DefaultValue>Per channel</DefaultValue>
<Value>Per channel</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Scale refresh interval (secs)</Name>
<DefaultValue>5</DefaultValue>
<Value>5</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Vertical Scale</Name>
<DefaultValue>100</DefaultValue>
<Value>100</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Vertical Offset</Name>
<DefaultValue>0</DefaultValue>
<Value>0</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Time Scale</Name>
<DefaultValue>10</DefaultValue>
<Value>10</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Horizontal ruler</Name>
<DefaultValue>true</DefaultValue>
<Value>true</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Vertical ruler</Name>
<DefaultValue>false</DefaultValue>
<Value>false</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Multiview</Name>
<DefaultValue>false</DefaultValue>
<Value>false</Value>
<Modifiability>false</Modifiability>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>112.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>752.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0x92c056a7, 0x2dc71aff)</Value>
</Attribute>
<Attribute>
<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
<Value>(0x00000000, 0x0020924b)</Value>
</Attribute>
<Attribute>
<Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier>
<Value>false</Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>9</Value>
</Attribute>
<Attribute>
<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
<Value>3</Value>
</Attribute>
</Attributes>
</Box>
<Box>
<Identifier>(0x4f539eea, 0x4f1d2b36)</Identifier>
<Name>Instant Bars</Name>
<AlgorithmClassIdentifier>(0xecb46081, 0x96da0d49)</AlgorithmClassIdentifier>
<Inputs>
<Input>
<TypeIdentifier>(0x1f261c0a, 0x593bf6bd)</TypeIdentifier>
<Name>Matrix</Name>
</Input>
</Inputs>
<Settings>
<Setting>
<TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier>
<Name>Channel Localisation</Name>
<DefaultValue>${AdvancedViz_ChannelLocalisation}</DefaultValue>
<Value>${AdvancedViz_ChannelLocalisation}</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Positive Data Only ?</Name>
<DefaultValue>false</DefaultValue>
<Value>false</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Gain</Name>
<DefaultValue>1</DefaultValue>
<Value>1</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier>
<Name>Caption</Name>
<DefaultValue></DefaultValue>
<Value></Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Translucency</Name>
<DefaultValue>1</DefaultValue>
<Value>1</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x3d3c7c7f, 0xef0e7129)</TypeIdentifier>
<Name>Color</Name>
<DefaultValue>${AdvancedViz_DefaultColorGradient}</DefaultValue>
<Value>${AdvancedViz_DefaultColorGradient}</Value>
<Modifiability>false</Modifiability>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>256</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>560</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0x6b60e2b2, 0xf4839b7d)</Value>
</Attribute>
<Attribute>
<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>6</Value>
</Attribute>
<Attribute>
<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
<Value>1</Value>
</Attribute>
</Attributes>
</Box>
</Boxes>
<Links>
<Link>
<Identifier>(0x00000c5d, 0x00003e97)</Identifier>
<Source>
<BoxIdentifier>(0x00000efb, 0x00007452)</BoxIdentifier>
<BoxOutputIndex>0</BoxOutputIndex>
</Source>
<Target>
<BoxIdentifier>(0x000026ba, 0x000014fc)</BoxIdentifier>
<BoxInputIndex>0</BoxInputIndex>
</Target>
</Link>
<Link>
<Identifier>(0x0000235d, 0x00005682)</Identifier>
<Source>
<BoxIdentifier>(0x0000441d, 0x00001a28)</BoxIdentifier>
<BoxOutputIndex>1</BoxOutputIndex>
</Source>
<Target>
<BoxIdentifier>(0x00006e09, 0x00006c54)</BoxIdentifier>
<BoxInputIndex>0</BoxInputIndex>
</Target>
</Link>
<Link>
<Identifier>(0x00003f9c, 0x000047e9)</Identifier>
<Source>
<BoxIdentifier>(0x00006e09, 0x00006c54)</BoxIdentifier>
<BoxOutputIndex>0</BoxOutputIndex>
</Source>
<Target>
<BoxIdentifier>(0x00006ff2, 0x000035c1)</BoxIdentifier>
<BoxInputIndex>0</BoxInputIndex>
</Target>
</Link>
<Link>
<Identifier>(0x00006d4e, 0x0000333e)</Identifier>
<Source>
<BoxIdentifier>(0x00006e09, 0x00006c54)</BoxIdentifier>
<BoxOutputIndex>0</BoxOutputIndex>
</Source>
<Target>
<BoxIdentifier>(0x00000efb, 0x00007452)</BoxIdentifier>
<BoxInputIndex>0</BoxInputIndex>
</Target>
</Link>
<Link>
<Identifier>(0x2146ff07, 0x607b577b)</Identifier>
<Source>
<BoxIdentifier>(0x000026ba, 0x000014fc)</BoxIdentifier>
<BoxOutputIndex>0</BoxOutputIndex>
</Source>
<Target>
<BoxIdentifier>(0x4f539eea, 0x4f1d2b36)</BoxIdentifier>
<BoxInputIndex>0</BoxInputIndex>
</Target>
</Link>
</Links>
<Comments>
<Comment>
<Identifier>(0x00002d94, 0x00007404)</Identifier>
<Text>Display the signal from all channels </Text>
<Attributes>
<Attribute>
<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
<Value>960.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
<Value>112.000000</Value>
</Attribute>
</Attributes>
</Comment>
<Comment>
<Identifier>(0x00004efd, 0x0000146d)</Identifier>
<Text>You can browse each box' documentation by selecting the box and pressing &lt;b&gt;F1&lt;/b&gt;
This scenario set is documented in 'http://openvibe.inria.fr/using-the-ssvep-mind-shooter-scenarios/'</Text>
<Attributes>
<Attribute>
<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
<Value>528</Value>
</Attribute>
<Attribute>
<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
<Value>-112</Value>
</Attribute>
</Attributes>
</Comment>
<Comment>
<Identifier>(0x00007577, 0x000059a7)</Identifier>
<Text>&lt;b&gt;&lt;big&gt;Acquisition test&lt;/big&gt;&lt;/b&gt;
Scenario used for testing data acquisition. The signal quality should
always be checked before training.
You can monitor signals from all of the electrodes. Individual
signals are shown for each channel, as well as FFT power of all channels.
</Text>
<Attributes>
<Attribute>
<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
<Value>224.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
<Value>16.000000</Value>
</Attribute>
</Attributes>
</Comment>
</Comments>
<Metadata>
<Entry>
<Identifier>(0x0000775c, 0x000078ff)</Identifier>
<Type>(0x3bcce5d2, 0x43f2d968)</Type>
<Data>[{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":776,"identifier":"(0x00002985, 0x00004ff2)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":753},{"boxIdentifier":"(0x4f539eea, 0x4f1d2b36)","childCount":0,"identifier":"(0x470943ea, 0x174708bb)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000024d0, 0x00004b7a)","index":0,"name":"Default tab","parentIdentifier":"(0x00002985, 0x00004ff2)","type":2},{"boxIdentifier":"(0x00006ff2, 0x000035c1)","childCount":0,"identifier":"(0x00003256, 0x00006784)","index":0,"parentIdentifier":"(0x000024d0, 0x00004b7a)","type":3}]</Data>
</Entry>
</Metadata>
<Attributes>
<Attribute>
<Identifier>(0x790d75b8, 0x3bb90c33)</Identifier>
<Value>Jozef Legeny</Value>
</Attribute>
<Attribute>
<Identifier>(0x8c1fc55b, 0x7b433dc2)</Identifier>
<Value>1.0</Value>
</Attribute>
<Attribute>
<Identifier>(0x9f5c4075, 0x4a0d3666)</Identifier>
<Value>SSVEP Acquisition Test</Value>
</Attribute>
<Attribute>
<Identifier>(0xf36a1567, 0xd13c53da)</Identifier>
<Value>http://openvibe.inria.fr/using-the-ssvep-mind-shooter-scenarios/</Value>
</Attribute>
<Attribute>
<Identifier>(0xf6b2e3fa, 0x7bd43926)</Identifier>
<Value>SSVEP</Value>
</Attribute>
<Attribute>
<Identifier>(0xf8034a49, 0x8b3f37cc)</Identifier>
<Value>Inria</Value>
</Attribute>
</Attributes>
</OpenViBE-Scenario>
@@ -0,0 +1,583 @@
<OpenViBE-Scenario>
<FormatVersion>1</FormatVersion>
<Creator>Designer</Creator>
<CreatorVersion>2.0.0</CreatorVersion>
<Settings></Settings>
<Inputs></Inputs>
<Outputs></Outputs>
<Boxes>
<Box>
<Identifier>(0x00000533, 0x00001c79)</Identifier>
<Name>Experiment Settings</Name>
<AlgorithmClassIdentifier>(0x0b5a2787, 0x02750621)</AlgorithmClassIdentifier>
<Inputs>
<Input>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>New input</Name>
</Input>
</Inputs>
<Outputs>
<Output>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>Stimulations</Name>
</Output>
</Outputs>
<Settings>
<Setting>
<TypeIdentifier>(0xb0d0db45, 0x49cbc34a)</TypeIdentifier>
<Name>Lua Script</Name>
<DefaultValue></DefaultValue>
<Value>${Player_ScenarioDirectory}/scripts/configuration-experiment-settings.lua</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x7f45a2a9, 0x7db12219)</TypeIdentifier>
<Name>Target Light Color</Name>
<DefaultValue>100,0,0</DefaultValue>
<Value>100,0,0</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x7f45a2a9, 0x7db12219)</TypeIdentifier>
<Name>Target Dark Color</Name>
<DefaultValue>0,0,0</DefaultValue>
<Value>10,0,0</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier>
<Name>Stimulation Frequencies</Name>
<DefaultValue>20;15;12</DefaultValue>
<Value>5.454545;6.6666;7.5</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Processing Epoch Duration</Name>
<DefaultValue>0.5</DefaultValue>
<Value>1</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Processing Epoch Interval</Name>
<DefaultValue>0.1</DefaultValue>
<Value>0.1</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Processing Frequency Tolerance</Name>
<DefaultValue>0.250</DefaultValue>
<Value>0.25</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier>
<Name>CSP Spatial Filter Order</Name>
<DefaultValue>3</DefaultValue>
<Value>6</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Focus Point</Name>
<DefaultValue>false</DefaultValue>
<Value>false</Value>
<Modifiability>false</Modifiability>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x17ee7c08, 0x94c14893)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>400</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>368</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0xd6e3f48b, 0xbee3523a)</Value>
</Attribute>
<Attribute>
<Identifier>(0x61d11811, 0x71e65362)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
<Value>1</Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>1</Value>
</Attribute>
<Attribute>
<Identifier>(0xf191c1c8, 0xa0123976)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0xfba64161, 0x65304e21)</Identifier>
<Value></Value>
</Attribute>
</Attributes>
</Box>
<Box>
<Identifier>(0x000024b5, 0x00000bb5)</Identifier>
<Name>Peripheral Settings</Name>
<AlgorithmClassIdentifier>(0x0b5a2787, 0x02750621)</AlgorithmClassIdentifier>
<Outputs>
<Output>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>Stimulations</Name>
</Output>
</Outputs>
<Settings>
<Setting>
<TypeIdentifier>(0xb0d0db45, 0x49cbc34a)</TypeIdentifier>
<Name>Lua Script</Name>
<DefaultValue></DefaultValue>
<Value>${Player_ScenarioDirectory}/scripts/configuration-peripheral-settings.lua</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier>
<Name>Screen Refresh Rate</Name>
<DefaultValue>60</DefaultValue>
<Value>60</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier>
<Name>Window Width</Name>
<DefaultValue>800</DefaultValue>
<Value>800</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier>
<Name>Window Height</Name>
<DefaultValue>600</DefaultValue>
<Value>600</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Fullscreen</Name>
<DefaultValue></DefaultValue>
<Value>true</Value>
<Modifiability>false</Modifiability>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x17ee7c08, 0x94c14893)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>64</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>368</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0xd6e3f48b, 0xbee3523a)</Value>
</Attribute>
<Attribute>
<Identifier>(0x61d11811, 0x71e65362)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
<Value>1</Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>1</Value>
</Attribute>
<Attribute>
<Identifier>(0xf191c1c8, 0xa0123976)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0xfba64161, 0x65304e21)</Identifier>
<Value></Value>
</Attribute>
</Attributes>
</Box>
<Box>
<Identifier>(0x00004bf3, 0x00007808)</Identifier>
<Name>Player Controller</Name>
<AlgorithmClassIdentifier>(0x5f426dce, 0x08456e13)</AlgorithmClassIdentifier>
<Inputs>
<Input>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>Stimulations</Name>
</Input>
</Inputs>
<Settings>
<Setting>
<TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier>
<Name>Stimulation name</Name>
<DefaultValue>OVTK_StimulationId_Label_00</DefaultValue>
<Value>OVTK_StimulationId_TrainCompleted</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0xcc14d8d6, 0xf27ecb73)</TypeIdentifier>
<Name>Action to perform</Name>
<DefaultValue>Pause</DefaultValue>
<Value>Stop</Value>
<Modifiability>false</Modifiability>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>528</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>368</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0x568d148e, 0x650792b3)</Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>2</Value>
</Attribute>
<Attribute>
<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
<Value>1</Value>
</Attribute>
</Attributes>
</Box>
<Box>
<Identifier>(0x00005dd3, 0x00000cf3)</Identifier>
<Name>EEG Input Settings</Name>
<AlgorithmClassIdentifier>(0x0b5a2787, 0x02750621)</AlgorithmClassIdentifier>
<Inputs>
<Input>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>New input</Name>
</Input>
</Inputs>
<Outputs>
<Output>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>Stimulations</Name>
</Output>
</Outputs>
<Settings>
<Setting>
<TypeIdentifier>(0xb0d0db45, 0x49cbc34a)</TypeIdentifier>
<Name>Lua Script</Name>
<DefaultValue></DefaultValue>
<Value>${Player_ScenarioDirectory}/scripts/configuration-eeg-input-settings.lua</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier>
<Name>Channels</Name>
<DefaultValue></DefaultValue>
<Value>:</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x3bcf9e67, 0x0c23994d)</TypeIdentifier>
<Name>Selection Method</Name>
<DefaultValue>Reject</DefaultValue>
<Value>Select</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x666f25e9, 0x3e5738d6)</TypeIdentifier>
<Name>Match Method</Name>
<DefaultValue>Smart</DefaultValue>
<Value>Smart</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier>
<Name>Training Data File</Name>
<DefaultValue>${Player_ScenarioDirectory}/signals/ssvep-record-current.ov</DefaultValue>
<Value>${Player_ScenarioDirectory}/signals/ssvep-record-current.ov</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier>
<Name>Testing Data File</Name>
<DefaultValue>${Player_ScenarioDirectory}/signals/ssvep-record-current.ov</DefaultValue>
<Value>${Player_ScenarioDirectory}/signals/ssvep-record-current.ov</Value>
<Modifiability>false</Modifiability>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x17ee7c08, 0x94c14893)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>224</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>368</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0xd6e3f48b, 0xbee3523a)</Value>
</Attribute>
<Attribute>
<Identifier>(0x61d11811, 0x71e65362)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
<Value>1</Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>1</Value>
</Attribute>
<Attribute>
<Identifier>(0xf191c1c8, 0xa0123976)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0xfba64161, 0x65304e21)</Identifier>
<Value></Value>
</Attribute>
</Attributes>
</Box>
</Boxes>
<Links>
<Link>
<Identifier>(0x000011e3, 0x00005213)</Identifier>
<Source>
<BoxIdentifier>(0x000024b5, 0x00000bb5)</BoxIdentifier>
<BoxOutputIndex>0</BoxOutputIndex>
</Source>
<Target>
<BoxIdentifier>(0x00005dd3, 0x00000cf3)</BoxIdentifier>
<BoxInputIndex>0</BoxInputIndex>
</Target>
</Link>
<Link>
<Identifier>(0x00002afe, 0x00005880)</Identifier>
<Source>
<BoxIdentifier>(0x00005dd3, 0x00000cf3)</BoxIdentifier>
<BoxOutputIndex>0</BoxOutputIndex>
</Source>
<Target>
<BoxIdentifier>(0x00000533, 0x00001c79)</BoxIdentifier>
<BoxInputIndex>0</BoxInputIndex>
</Target>
</Link>
<Link>
<Identifier>(0x0000591f, 0x00006602)</Identifier>
<Source>
<BoxIdentifier>(0x00000533, 0x00001c79)</BoxIdentifier>
<BoxOutputIndex>0</BoxOutputIndex>
</Source>
<Target>
<BoxIdentifier>(0x00004bf3, 0x00007808)</BoxIdentifier>
<BoxInputIndex>0</BoxInputIndex>
</Target>
</Link>
</Links>
<Comments>
<Comment>
<Identifier>(0x00000df6, 0x00003d56)</Identifier>
<Text>&lt;big&gt;&lt;b&gt;Experiment Settings&lt;/b&gt;&lt;/big&gt;
Settings concerning the SSVEP experiment in general.
&lt;b&gt;Target Light Color&lt;/b&gt; and &lt;b&gt;Target Dark Color&lt;/b&gt; represent
the two colors which will be used to generate the flickering of
the targets. The notation Light and Dark is arbitrary, however on
frequencies using odd number of frames will use more frames to
represent the Light color.
&lt;b&gt;Screen Refresh Rate : &lt;/b&gt; The refresh rate of your screen,
refer to your screen's user manual to find this value.
&lt;span color="red"&gt;Important notice&lt;/span&gt;
Your screen will be able to reproduce only frequencies which
are result of division of your screen refresh rate by an
integer.
&lt;b&gt;Stimulation Frequencies&lt;/b&gt; A comma separated list of
frequencies used for the stimulation. Refer to the documentation
for more details.
&lt;b&gt;Processing Epoch Duration&lt;/b&gt; The length of the slice of the signal
which will be used to find SSVEP response. With longer duration precision
will increase at the detriment of the lag.
&lt;b&gt;Processing Epoch Interval&lt;/b&gt; The speed interval between slices of the
signal.
&lt;b&gt;Processing Frequency Tolerance&lt;/b&gt; The width of the frequency band
around the stimulation frequency used for classification.</Text>
<Attributes>
<Attribute>
<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
<Value>-176</Value>
</Attribute>
<Attribute>
<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
<Value>128</Value>
</Attribute>
</Attributes>
</Comment>
<Comment>
<Identifier>(0x0000187e, 0x00005350)</Identifier>
<Text> &lt;b&gt;&lt;span color="#2060ff"&gt;Configurable box&lt;/span&gt;&lt;/b&gt;
</Text>
<Attributes>
<Attribute>
<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
<Value>368</Value>
</Attribute>
<Attribute>
<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
<Value>400</Value>
</Attribute>
</Attributes>
</Comment>
<Comment>
<Identifier>(0x0000288f, 0x00005f55)</Identifier>
<Text>&lt;b&gt;Welcome to the 'classic' SSVEP Mind Shooter&lt;/b&gt;
Binary classifiers and CSP are used
by the signal processing pipelines.</Text>
<Attributes>
<Attribute>
<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
<Value>-176.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
<Value>-192.000000</Value>
</Attribute>
</Attributes>
</Comment>
<Comment>
<Identifier>(0x000031b0, 0x00003fa0)</Identifier>
<Text>&lt;big&gt;&lt;b&gt;Scenario description&lt;/b&gt;&lt;/big&gt;
&lt;b&gt;&lt;span color="red"&gt;This scenario must be run at least once before
running any further SSVEP scenarios&lt;/span&gt;&lt;/b&gt;
This is a scenario where you can configure your SSVEP experiment. There
are two boxes containing configuration parameters:
&lt;b&gt;Peripheral Settings&lt;/b&gt;
&lt;b&gt;Experiment Settings&lt;/b&gt;
For more detailed description please refer to the SSVEP
documentation page.</Text>
<Attributes>
<Attribute>
<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
<Value>336</Value>
</Attribute>
<Attribute>
<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
<Value>-160</Value>
</Attribute>
</Attributes>
</Comment>
<Comment>
<Identifier>(0x00003244, 0x00004359)</Identifier>
<Text> &lt;b&gt;&lt;span color="#2060ff"&gt;Configurable box&lt;/span&gt;&lt;/b&gt;
</Text>
<Attributes>
<Attribute>
<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
<Value>368</Value>
</Attribute>
<Attribute>
<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
<Value>64</Value>
</Attribute>
</Attributes>
</Comment>
<Comment>
<Identifier>(0x00005ca6, 0x00003399)</Identifier>
<Text> &lt;b&gt;&lt;span color="#2060ff"&gt;Configurable box&lt;/span&gt;&lt;/b&gt;
</Text>
<Attributes>
<Attribute>
<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
<Value>368</Value>
</Attribute>
<Attribute>
<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
<Value>224</Value>
</Attribute>
</Attributes>
</Comment>
</Comments>
<Metadata>
<Entry>
<Identifier>(0x0000775c, 0x000078ff)</Identifier>
<Type>(0x3bcce5d2, 0x43f2d968)</Type>
<Data>[{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x00005488, 0x0000451f)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00000bbf, 0x000047e2)","index":0,"name":"Default tab","parentIdentifier":"(0x00005488, 0x0000451f)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x000017e4, 0x00003d53)","index":0,"name":"Empty","parentIdentifier":"(0x00000bbf, 0x000047e2)","type":0}]</Data>
</Entry>
</Metadata>
<Attributes>
<Attribute>
<Identifier>(0x790d75b8, 0x3bb90c33)</Identifier>
<Value>Jozef Legeny</Value>
</Attribute>
<Attribute>
<Identifier>(0x8c1fc55b, 0x7b433dc2)</Identifier>
<Value>1.0</Value>
</Attribute>
<Attribute>
<Identifier>(0x9f5c4075, 0x4a0d3666)</Identifier>
<Value>SSVEP Configuration</Value>
</Attribute>
<Attribute>
<Identifier>(0xf36a1567, 0xd13c53da)</Identifier>
<Value>http://openvibe.inria.fr/using-the-ssvep-mind-shooter-scenarios/</Value>
</Attribute>
<Attribute>
<Identifier>(0xf6b2e3fa, 0x7bd43926)</Identifier>
<Value>SSVEP</Value>
</Attribute>
<Attribute>
<Identifier>(0xf8034a49, 0x8b3f37cc)</Identifier>
<Value>Inria</Value>
</Attribute>
</Attributes>
</OpenViBE-Scenario>
@@ -0,0 +1,41 @@
flip_count = 0
switched_flip_count = 0
flips = {}
function initialize(box)
dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua")
flip_count = box:get_input_count()
for i = 1, flip_count do
flips[i] = false
end
end
function uninitialize(box)
end
function process(box)
while box:keep_processing() and switched_flip_count < flip_count do
for i = 1, flip_count do
if box:get_stimulation_count(i) > 0 then
box:remove_stimulation(i, 1)
if not flips[i] then
switched_flip_count = switched_flip_count + 1
flips[i] = true
io.write("Flip ", i, " of ", flip_count, " switched\n")
end
end
end
box:sleep()
end
box:send_stimulation(1, OVTK_StimulationId_Label_00, box:get_current_time())
end
@@ -0,0 +1,63 @@
targets = {}
non_targets = {}
sent_stimulation = 0
function initialize(box)
dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua")
-- read the parameters of the box
s_targets = box:get_setting(2)
for t in s_targets:gmatch("%d+") do
targets[t + 0] = true
end
s_non_targets = box:get_setting(3)
for t in s_non_targets:gmatch("%d+") do
non_targets[t + 0] = true
end
sent_stimulation = _G[box:get_setting(4)]
end
function uninitialize(box)
end
function process(box)
finished = false
while box:keep_processing() and not finished do
time = box:get_current_time()
while box:get_stimulation_count(1) > 0 do
s_code, s_date, s_duration = box:get_stimulation(1, 1)
box:remove_stimulation(1, 1)
if s_code >= OVTK_StimulationId_Label_00 and s_code <= OVTK_StimulationId_Label_1F then
received_stimulation = s_code - OVTK_StimulationId_Label_00
if targets[received_stimulation] ~= nil then
box:send_stimulation(1, sent_stimulation, time)
elseif non_targets[received_stimulation] ~= nil then
box:send_stimulation(2, sent_stimulation, time)
end
elseif s_code == OVTK_StimulationId_ExperimentStop then
finished = true
end
end
box:sleep()
end
end
@@ -0,0 +1,74 @@
channels = nil
selection_method = nil
match_method = nil
training_datafile = nil
testing_datafile = nil
function initialize(box)
dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua")
channels = box:get_setting(2)
selection_method = box:get_setting(3)
match_method = box:get_setting(4)
training_datafile = box:get_setting(5)
testing_datafile = box:get_setting(6)
end
function uninitialize(box)
end
function process(box)
while box:keep_processing() and box:get_stimulation_count(1) == 0 do
box:sleep()
end
-- create material
box:log("Info", box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/channel-selector.cfg'"))
cfg_file = io.open(box:get_config("${Player_ScenarioDirectory}/configuration/channel-selector.cfg"), "w")
if cfg_file == nil then
box:log("Error", "Could not open config file for writing")
end
cfg_file:write("<OpenViBE-SettingsOverride>\n")
cfg_file:write(string.format("<SettingValue>%s</SettingValue>\n", channels))
cfg_file:write(string.format("<SettingValue>%s</SettingValue>\n", selection_method))
cfg_file:write(string.format("<SettingValue>%s</SettingValue>\n", match_method))
cfg_file:write("</OpenViBE-SettingsOverride>\n")
cfg_file:close()
box:log("Info", box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/file-reader-training.cfg'"))
cfg_file = assert(io.open(box:get_config("${Player_ScenarioDirectory}/configuration/file-reader-training.cfg"), "w"))
cfg_file:write("<OpenViBE-SettingsOverride>\n")
cfg_file:write(string.format("<SettingValue>%s</SettingValue>\n", training_datafile))
-- cfg_file:write(string.format("<SettingValue>32</SettingValue>\n"))
cfg_file:write("</OpenViBE-SettingsOverride>\n")
cfg_file:close()
box:log("Info", box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/file-reader-testing.cfg'"))
cfg_file = assert(io.open(box:get_config("${Player_ScenarioDirectory}/configuration/file-reader-testing.cfg"), "w"))
cfg_file:write("<OpenViBE-SettingsOverride>\n")
cfg_file:write(string.format("<SettingValue>%s</SettingValue>\n", testing_datafile))
-- cfg_file:write(string.format("<SettingValue>32</SettingValue>\n"))
cfg_file:write("</OpenViBE-SettingsOverride>\n")
cfg_file:close()
-- notify the scenario that the configuration process is complete
box:send_stimulation(1, OVTK_StimulationId_TrainCompleted, box:get_current_time() + 0.2, 0)
end
@@ -0,0 +1,190 @@
stimulation_frequencies = {}
frequency_count = 0
target_light_color = {}
target_dark_color = {}
training_target_size = {}
training_targets_positions = {}
processing_epoch_duration = nil
processing_epoch_interval = nil
processing_frequency_tolerance = nil
csp_filter_order = nil
function initialize(box)
dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua")
for value in box:get_setting(2):gmatch("%d+") do
table.insert(target_light_color, value)
end
for value in box:get_setting(3):gmatch("%d+") do
table.insert(target_dark_color, value)
end
for value in box:get_setting(4):gmatch("%d+[.]?%d*") do
table.insert(stimulation_frequencies, value)
frequency_count = frequency_count + 1
end
processing_epoch_duration = box:get_setting(5)
processing_epoch_interval = box:get_setting(6)
processing_frequency_tolerance = box:get_setting(7)
csp_filter_order = box:get_setting(8)
s_focus_point = box:get_setting(9)
end
function uninitialize(box)
end
function process(box)
while box:keep_processing() and box:get_stimulation_count(1) == 0 do
box:sleep()
end
-- create material
box:log("Info", box:get_config("Creating materials in '${Player_ScenarioDirectory}/appconf/materials/flickering.material'"))
cfg_file = assert(io.open(box:get_config("${Player_ScenarioDirectory}/appconf/materials/flickering.material"), "w"))
cfg_file:write("material target_bright\n")
cfg_file:write("{\n")
cfg_file:write(" technique\n")
cfg_file:write(" {\n")
cfg_file:write(" pass\n")
cfg_file:write(" {\n")
cfg_file:write(" ambient 0 0 0 0\n")
cfg_file:write(" diffuse 0 0 0 0\n")
cfg_file:write(" specular 0 0 0 0\n")
cfg_file:write(" emissive ", target_light_color[1] / 100, " ", target_light_color[2] / 100, " ", target_light_color[3] / 100, "\n")
cfg_file:write(" }\n")
cfg_file:write(" }\n")
cfg_file:write("}\n")
cfg_file:write("material target_dark\n")
cfg_file:write("{\n")
cfg_file:write(" technique\n")
cfg_file:write(" {\n")
cfg_file:write(" pass\n")
cfg_file:write(" {\n")
cfg_file:write(" ambient 0 0 0 0\n")
cfg_file:write(" diffuse 0 0 0 0\n")
cfg_file:write(" specular 0 0 0 0\n")
cfg_file:write(" emissive ", target_dark_color[1] / 100, " ", target_dark_color[2] / 100, " ", target_dark_color[3] / 100, "\n")
cfg_file:write(" }\n")
cfg_file:write(" }\n")
cfg_file:write("}\n")
cfg_file:close()
-- prepare the datafolder
foldername = box:get_config("${Player_ScenarioDirectory}/signals/userdata-[$core{date}-$core{time}]")
os.execute(string.format("mkdir \"%s\"", foldername))
box:log("Info", box:get_config("Writing additional configuration to '${Player_ScenarioDirectory}/appconf/application-configuration.conf'"))
-- this file was generated by configuration-peripheral-settings.lua, here we just add to it
cfg_file = assert(io.open(box:get_config("${Player_ScenarioDirectory}/appconf/application-configuration.conf"), "a"))
for i=1,frequency_count do
cfg_file:write("SSVEP_Frequency_", i, " = ", string.format("%g", stimulation_frequencies[i]), "\n")
end
cfg_file:write(string.format("SSVEP_TargetLightColourRed = %f\n", target_light_color[1] / 100))
cfg_file:write(string.format("SSVEP_TargetLightColourGreen = %f\n", target_light_color[2] / 100))
cfg_file:write(string.format("SSVEP_TargetLightColourBlue = %f\n", target_light_color[3] / 100))
cfg_file:write(string.format("SSVEP_TargetDarkColourRed = %f\n", target_dark_color[1] / 100))
cfg_file:write(string.format("SSVEP_TargetDarkColourGreen = %f\n", target_dark_color[2] / 100))
cfg_file:write(string.format("SSVEP_TargetDarkColourBlue = %f\n", target_dark_color[3] / 100))
cfg_file:write("SSVEP_UserDataFolder = ", foldername, "\n")
cfg_file:write("SSVEP_FocusPoint = ", s_focus_point, "\n")
cfg_file:close()
-- create configuration files for temporal filters
for i=1,frequency_count do
box:log("Info", string.format(box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/temporal-filter-freq-%db.cfg'"), i))
cfg_file = assert(io.open(string.format(box:get_config("${Player_ScenarioDirectory}/configuration/temporal-filter-freq-%db.cfg"), i), "w"))
cfg_file:write("<OpenViBE-SettingsOverride>\n")
cfg_file:write("<SettingValue>Butterworth</SettingValue>\n")
cfg_file:write("<SettingValue>Band pass</SettingValue>\n")
cfg_file:write("<SettingValue>4</SettingValue>\n")
cfg_file:write(string.format("<SettingValue>%g</SettingValue>\n", stimulation_frequencies[i] - processing_frequency_tolerance))
cfg_file:write(string.format("<SettingValue>%g</SettingValue>\n", stimulation_frequencies[i] + processing_frequency_tolerance))
cfg_file:write("<SettingValue>0.500000</SettingValue>\n")
cfg_file:write("</OpenViBE-SettingsOverride>\n")
cfg_file:close()
box:log("Info", string.format(box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/temporal-filter-freq-%dh1.cfg'"), i))
cfg_file = assert(io.open(string.format(box:get_config("${Player_ScenarioDirectory}/configuration/temporal-filter-freq-%dh1.cfg"), i), "w"))
cfg_file:write("<OpenViBE-SettingsOverride>\n")
cfg_file:write("<SettingValue>Butterworth</SettingValue>\n")
cfg_file:write("<SettingValue>Band pass</SettingValue>\n")
cfg_file:write("<SettingValue>4</SettingValue>\n")
cfg_file:write(string.format("<SettingValue>%g</SettingValue>\n", stimulation_frequencies[i] * 2 - processing_frequency_tolerance))
cfg_file:write(string.format("<SettingValue>%g</SettingValue>\n", stimulation_frequencies[i] * 2 + processing_frequency_tolerance))
cfg_file:write("<SettingValue>0.500000</SettingValue>\n")
cfg_file:write("</OpenViBE-SettingsOverride>\n")
cfg_file:close()
box:log("Info", string.format(box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/csp-spatial-filter-trainer-%db.cfg'"), i))
cfg_file = assert(io.open(string.format(box:get_config("${Player_ScenarioDirectory}/configuration/csp-spatial-filter-trainer-%db.cfg"), i), "w"))
cfg_file:write("<OpenViBE-SettingsOverride>\n")
cfg_file:write(" <SettingValue>OVTK_StimulationId_ExperimentStop</SettingValue>\n")
cfg_file:write(string.format(box:get_config(" <SettingValue>${Player_ScenarioDirectory}/classifiers/csp-%db</SettingValue>\n"), i))
cfg_file:write(string.format(" <SettingValue>%d</SettingValue>\n", csp_filter_order))
cfg_file:write(" <SettingValue></SettingValue>\n")
cfg_file:write("</OpenViBE-SettingsOverride>\n")
cfg_file:close()
box:log("Info", string.format(box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/csp-spatial-filter-trainer-%dh1.cfg'"), i))
cfg_file = assert(io.open(string.format(box:get_config("${Player_ScenarioDirectory}/configuration/csp-spatial-filter-trainer-%dh1.cfg"), i), "w"))
cfg_file:write("<OpenViBE-SettingsOverride>\n")
cfg_file:write(" <SettingValue>OVTK_StimulationId_ExperimentStop</SettingValue>\n")
cfg_file:write(string.format(box:get_config(" <SettingValue>${Player_ScenarioDirectory}/classifiers/csp-%dh1</SettingValue>\n"), i))
cfg_file:write(string.format(" <SettingValue>%d</SettingValue>\n", csp_filter_order))
cfg_file:write(" <SettingValue></SettingValue>\n")
cfg_file:write("</OpenViBE-SettingsOverride>\n")
cfg_file:close()
end
-- create configuration file for time based epoching
box:log("Info", box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg'"))
cfg_file = assert(io.open(box:get_config("${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg"), "w"))
cfg_file:write("<OpenViBE-SettingsOverride>\n")
cfg_file:write(string.format("<SettingValue>%g</SettingValue>\n", processing_epoch_duration))
cfg_file:write(string.format("<SettingValue>%g</SettingValue>\n", processing_epoch_interval))
cfg_file:write("</OpenViBE-SettingsOverride>\n")
cfg_file:close()
-- create the file writer configuration
box:log("Info", box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/file-writer.cfg'"))
cfg_file = assert(io.open(box:get_config("${Player_ScenarioDirectory}/configuration/file-writer.cfg"), "w"))
cfg_file:write("<OpenViBE-SettingsOverride>\n")
cfg_file:write(string.format("<SettingValue>%s/eeg-data-[$core{date}-$core{time}].ov</SettingValue>\n", foldername))
cfg_file:write("<SettingValue>false</SettingValue>\n")
cfg_file:write("</OpenViBE-SettingsOverride>\n")
cfg_file:close()
box:log("Info", box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/csp-filter.cfg'"))
-- notify the scenario that the configuration process is complete
box:send_stimulation(1, OVTK_StimulationId_TrainCompleted, box:get_current_time() + 0.2, 0)
end
@@ -0,0 +1,53 @@
vrpn_host = nil
vrpn_port = nil
screen_refresh_rate = nil
window_width = nil
window_height = nil
fullscreen = nil
function initialize(box)
screen_refresh_rate = box:get_setting(2)
window_width = box:get_setting(3)
window_height = box:get_setting(4)
fullscreen = box:get_setting(5)
end
function uninitialize(box)
end
function process(box)
dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua")
box:log("Info", box:get_config("Generating '${Player_ScenarioDirectory}/appconf/application-configuration.conf'"))
cfg_file = assert(io.open(box:get_config("${Player_ScenarioDirectory}/appconf/application-configuration.conf"), "w"))
cfg_file:write("# This file was automatically generated!\n\n")
cfg_file:write("# If you want to change the SSVEP configuration\n")
cfg_file:write("# please use the provided ssvep-configuration scenario.\n")
cfg_file:write("SSVEP_ScreenRefreshRate = ", screen_refresh_rate, "\n")
cfg_file:write("SSVEP_VRPNServerPort = 1337\n")
cfg_file:write("SSVEP_VRPNHost = localhost\n")
-- cfg_file:close()
-- box:log("Info", box:get_config("Generating '${Player_ScenarioDirectory}/appconf/ogre-configuration.conf'"))
-- cfg_file = io.open(box:get_config("${Player_ScenarioDirectory}/appconf/ogre-configuration.conf"), "w")
-- cfg_file:write("# This file was automatically generated!\n\n")
-- cfg_file:write("# If you want to change the SSVEP configuration\n")
-- cfg_file:write("# please use the provided ssvep-configuration scenario.\n")
cfg_file:write("SSVEP_Ogre_LogToConsole = False\n")
cfg_file:write("SSVEP_Ogre_ScreenWidth = ", window_width, "\n")
cfg_file:write("SSVEP_Ogre_ScreenHeight = ", window_height, "\n")
cfg_file:write("SSVEP_Ogre_FullScreen = ", fullscreen, "\n")
cfg_file:close()
box:send_stimulation(1, OVTK_StimulationId_TrainCompleted, box:get_current_time() + 0.2, 0)
end
@@ -0,0 +1,119 @@
classes = nil
do_debug = false;
score = {}
function initialize(box)
dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua")
classes = box:get_setting(2)
for j = 1, classes do
score[j] = {}
for i = 1, classes do
score[j][i] = 0
end
end
end
function uninitialize(box)
correct = 0
incorrect = 0
for j = 1, classes do
output = string.format("Target %d : ", j - 1)
inClass = 0
for i = 1, classes do
inClass = inClass + score[j][i]
end
for i = 1, classes do
output = output .. string.format("%d : %5.1f%%, ", i - 1, 100*score[j][i]/inClass)
if i == j then
correct = correct + score[j][i]
else
incorrect = incorrect + score[j][i]
end
end
box:log("Info", string.format("%s total %d", output, inClass))
end
box:log("Info", string.format("Correct %4d -> %5.1f%%", correct, 100*correct/(correct+incorrect)))
box:log("Info", string.format("Incorrect %4d -> %5.1f%%", incorrect, 100*incorrect/(correct+incorrect)))
end
function process(box)
finished = false
trials = {}
trialNum = 0
while not finished and box:keep_processing() do
-- time = box:get_current_time()
while box:get_stimulation_count(1) > 0 do
s_code, s_date, s_duration = box:get_stimulation(1, 1)
box:remove_stimulation(1, 1)
if s_code >= OVTK_StimulationId_Label_00 and s_code <= OVTK_StimulationId_Label_1F then
if do_debug then box:log("Info", string.format("Received target %d at ", s_code) .. s_date) end
trialNum = trialNum + 1
trials[trialNum]={}
trials[trialNum].class = s_code - OVTK_StimulationId_Label_00 + 1
trials[trialNum].start_time = 9999999999;
trials[trialNum].stop_time = 9999999999;
elseif s_code == OVTK_StimulationId_VisualStimulationStart then
if do_debug then box:log("Info", "Trial started at " .. s_date) end
trials[trialNum].start_time = s_date;
elseif s_code == OVTK_StimulationId_VisualStimulationStop then
if do_debug then box:log("Info", "Trial ended at " .. s_date) end
trials[trialNum].stop_time = s_date;
elseif s_code == OVTK_StimulationId_ExperimentStop then
finished = true
end
end
while box:get_stimulation_count(2) > 0 do
s_code, s_date, s_duration = box:get_stimulation(2, 1)
box:remove_stimulation(2, 1)
if do_debug then box:log("Info", string.format("Received prediction %d at ", s_code) .. s_date) end
if (s_code >= OVTK_StimulationId_Label_00 and s_code <= OVTK_StimulationId_Label_1F) then
-- not the fastest but ok for small trial amounts
for i = trialNum,1,-1 do
if s_date >= trials[i].start_time and s_date <= trials[i].stop_time then
if do_debug then box:log("Info", string.format("Accepted prediction %d at ", s_code) .. s_date) end
real_target = trials[i].class
prediction = s_code - OVTK_StimulationId_Label_00 + 1
-- if do_debug then box:log("Info", string.format(" -> %d %d ", real_target, prediction)) end
score[real_target][prediction] = score[real_target][prediction] + 1
break
end
end
end
end
box:sleep()
end
end
@@ -0,0 +1,35 @@
buffer = {}
function initialize(box)
end
function uninitialize(box)
end
-- This script receives stimulations and lets pass only every other one
-- for each stimulation code
-- Useful to remove "key up" events of keyboard stimulator
function process(box)
while (box:keep_processing()) do
for index = 1, box:get_stimulation_count(1) do
stimulation = box:get_stimulation(1, index)
if buffer[stimulation] == nil then
box:send_stimulation(1, stimulation, box:get_current_time(), 0)
buffer[stimulation] = 1
else
buffer[stimulation] = nil
end
box:remove_stimulation(1, 1)
end
box:sleep()
end
end
@@ -0,0 +1,44 @@
class_count = 0
function initialize(box)
dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua")
class_count = box:get_setting(2)
end
function uninitialize(box)
end
function process(box)
while box:keep_processing() do
if box:get_stimulation_count(1) > 0 then
local decision = 0
local conflict = false
-- check each input
for i = 1, class_count do
-- if the frequency is considered as stimulated
stim_id = box:get_stimulation(i, 1)
-- box:log("Info", string.format("Received %d from %d", stim_id, i))
if stim_id == OVTK_StimulationId_Label_01 then
if decision ~= 0 then
conflict = true
end
decision = i
end
box:remove_stimulation(i, 1)
end
-- If several classifiers predict 'in class', predict no action class 0 instead.
if conflict then
decision = 0
end
box:send_stimulation(1, OVTK_StimulationId_Label_00 + decision, box:get_current_time() + 0.01, 0)
end
box:sleep()
end
end
@@ -0,0 +1,70 @@
sequence = {}
flickeringDelay = nil
function initialize(box)
dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua")
s_sequence_types = box:get_setting(2)
s_sequence_positions = box:get_setting(3)
s_target_lockdown = box:get_setting(4)
s_pilot_assist = box:get_setting(5)
s_feedback = box:get_setting(6)
s_onebyone = box:get_setting(7)
s_analog_control = box:get_setting(8)
s_log_level = box:get_setting(9)
box:log("Info", string.format("Target Types Sequence : [%s]\n", s_sequence_types))
for target in s_sequence_positions:gmatch("%d+") do
table.insert(sequence, target)
end
-- create the configuration file for the shooter application
cfg_file = io.open(box:get_config("${Player_ScenarioDirectory}/appconf/shooter-configuration.conf"), "w")
cfg_file:write("SSVEP_EnemyOrder = ", s_sequence_types, "\n")
cfg_file:write("SSVEP_TargetLockdown = ", s_target_lockdown, "\n")
cfg_file:write("SSVEP_PilotAssist = ", s_pilot_assist, "\n")
cfg_file:write("SSVEP_Feedback = ", s_feedback, "\n")
cfg_file:write("SSVEP_OneByOne = ", s_onebyone, "\n")
cfg_file:write("SSVEP_AnalogControl = ", s_analog_control, "\n")
cfg_file:write("SSVEP_LogLevel = ", s_log_level, "\n")
cfg_file:close()
end
function uninitialize(box)
end
function process(box)
-- while targets are available, send a stimulation with new target
-- position for each request
while box:keep_processing() do
if box:get_stimulation_count(1) > 0 then
identifier, date, duration = box:get_stimulation(1, 1)
if identifier == OVTK_StimulationId_Target then
current_time = box:get_current_time() + 1
-- if no targets are available, quit the game
if # sequence == 0 then
box:send_stimulation(1, OVTK_StimulationId_ExperimentStop, current_time, 0)
break
end
next_target = sequence[1]
table.remove(sequence, 1)
box:send_stimulation(1, OVTK_StimulationId_Label_00 + next_target , current_time, 0)
end
box:remove_stimulation(1, 1)
end
box:sleep()
end
end
@@ -0,0 +1,21 @@
delay = 1
function initialize(box)
s_delay = box:get_setting(2);
io.write(string.format("Delay : [%s]\n", s_delay))
if (s_delay:find("^%d+$") ~= nil) then
delay = tonumber(s_delay)
else
io.write("[ERROR] The parameter should be a numeric value\n")
end
end
function uninitialize(box)
end
function process(box)
box:send_stimulation(1, 0x00008001, delay, 0)
end
@@ -0,0 +1,79 @@
sequence = {}
number_of_cycles = 0
stimulation_duration = 7
break_duration = 2
flickering_delay = 3.5
stimulationLabels = {
0x00008100,
0x00008101,
0x00008102,
0x00008103,
}
function initialize(box)
dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua")
-- load the goal sequence
s_sequence = box:get_setting(2)
for target in s_sequence:gmatch("%d+") do
table.insert(sequence, target)
number_of_cycles = number_of_cycles + 1
end
stimulation_duration = box:get_setting(3)
break_duration = box:get_setting(4)
flickering_delay = box:get_setting(5)
box:log("Info", string.format("Number of goals in sequence: [%d]", number_of_cycles))
cfg_file = io.open(box:get_config("${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg"), "w")
cfg_file:write("<OpenViBE-SettingsOverride>\n")
cfg_file:write(" <SettingValue>", stimulation_duration, "</SettingValue>\n")
cfg_file:write(" <SettingValue>", flickering_delay, "</SettingValue>\n")
cfg_file:write(" <SettingValue>OVTK_StimulationId_Target</SettingValue>\n")
cfg_file:write("</OpenViBE-SettingsOverride>\n")
cfg_file:close()
end
function uninitialize(box)
end
function process(box)
while box:keep_processing() and box:get_stimulation_count(1) == 0 do
box:sleep()
end
current_time = box:get_current_time() + 1
box:send_stimulation(1, OVTK_StimulationId_ExperimentStart, current_time, 0)
current_time = current_time + 2
for i,target in ipairs(sequence) do
box:log("Info", string.format("Goal no %d is %d at %d", i, target, current_time))
-- mark goal
box:send_stimulation(2, OVTK_StimulationId_LabelStart + target, current_time, 0)
-- wait for Flickering_delay seconds
current_time = current_time + flickering_delay
-- start flickering
box:send_stimulation(1, OVTK_StimulationId_VisualStimulationStart, current_time, 0)
-- wait for Stimulation_duration seconds
current_time = current_time + stimulation_duration
-- unmark goal and stop flickering
box:send_stimulation(1, OVTK_StimulationId_VisualStimulationStop, current_time, 0)
-- wait for Break_duration seconds
current_time = current_time + break_duration
end
current_time = current_time + 2
box:send_stimulation(1, OVTK_StimulationId_ExperimentStop, current_time, 0)
box:sleep()
end
@@ -0,0 +1 @@
This folder contains signals recorded by the SSVEP scenarios.
@@ -0,0 +1 @@
This folder contains configuration files created by the SSVEP scenarios.
@@ -0,0 +1 @@
This folder contains materials created by the SSVEP scenarios.
@@ -0,0 +1 @@
This folder contains classifiers and CSP filters created by the SSVEP scenarios.
@@ -0,0 +1 @@
This folder contains configuration files generated by the scenarios.
@@ -0,0 +1,672 @@
<OpenViBE-Scenario>
<FormatVersion>1</FormatVersion>
<Creator>OpenVIBE</Creator>
<CreatorVersion>0.1.99</CreatorVersion>
<Settings></Settings>
<Inputs></Inputs>
<Outputs></Outputs>
<Boxes>
<Box>
<Identifier>(0x00000efb, 0x00007452)</Identifier>
<Name>Time based epoching</Name>
<AlgorithmClassIdentifier>(0x00777fa0, 0x5dc3f560)</AlgorithmClassIdentifier>
<Inputs>
<Input>
<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
<Name>Input signal</Name>
</Input>
</Inputs>
<Outputs>
<Output>
<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
<Name>Epoched signal 1</Name>
</Output>
</Outputs>
<Settings>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Epoch 1 duration (in sec)</Name>
<DefaultValue>1</DefaultValue>
<Value>2.000000</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Epoch 1 intervals (in sec)</Name>
<DefaultValue>0.5</DefaultValue>
<Value>0.250000</Value>
<Modifiability>false</Modifiability>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x17ee7c08, 0x94c14893)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>112.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>560.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0xc5ff41e9, 0xccc59a01)</Value>
</Attribute>
<Attribute>
<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
<Value>(0x00000000, 0x002363af)</Value>
</Attribute>
<Attribute>
<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
<Value>1</Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>2</Value>
</Attribute>
<Attribute>
<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
<Value>1</Value>
</Attribute>
</Attributes>
</Box>
<Box>
<Identifier>(0x000026ba, 0x000014fc)</Identifier>
<Name>Spectral analysis</Name>
<AlgorithmClassIdentifier>(0x84218ff8, 0xa87e7995)</AlgorithmClassIdentifier>
<Inputs>
<Input>
<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
<Name>Input signal</Name>
</Input>
</Inputs>
<Outputs>
<Output>
<TypeIdentifier>(0x1f261c0a, 0x593bf6bd)</TypeIdentifier>
<Name>Amplitude</Name>
</Output>
<Output>
<TypeIdentifier>(0x1f261c0a, 0x593bf6bd)</TypeIdentifier>
<Name>Phase</Name>
</Output>
<Output>
<TypeIdentifier>(0x1f261c0a, 0x593bf6bd)</TypeIdentifier>
<Name>Real Part</Name>
</Output>
<Output>
<TypeIdentifier>(0x1f261c0a, 0x593bf6bd)</TypeIdentifier>
<Name>Imag Part</Name>
</Output>
</Outputs>
<Settings>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Amplitude</Name>
<DefaultValue>true</DefaultValue>
<Value>true</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Phase</Name>
<DefaultValue>false</DefaultValue>
<Value>false</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Real Part</Name>
<DefaultValue>false</DefaultValue>
<Value>false</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Imaginary Part</Name>
<DefaultValue>false</DefaultValue>
<Value>false</Value>
<Modifiability>false</Modifiability>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>192.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>560.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0x4e5c55a0, 0xe69eb7db)</Value>
</Attribute>
<Attribute>
<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
<Value>(0x00000000, 0x004039af)</Value>
</Attribute>
<Attribute>
<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
<Value>4</Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>1</Value>
</Attribute>
<Attribute>
<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
<Value>1</Value>
</Attribute>
</Attributes>
</Box>
<Box>
<Identifier>(0x0000441d, 0x00001a28)</Identifier>
<Name>Acquisition client</Name>
<AlgorithmClassIdentifier>(0x35d225cb, 0x3e6e3a5f)</AlgorithmClassIdentifier>
<Outputs>
<Output>
<TypeIdentifier>(0x403488e7, 0x565d70b6)</TypeIdentifier>
<Name>Experiment information</Name>
</Output>
<Output>
<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
<Name>Signal stream</Name>
</Output>
<Output>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>Stimulations</Name>
</Output>
<Output>
<TypeIdentifier>(0x013df452, 0xa3a8879a)</TypeIdentifier>
<Name>Channel localisation</Name>
</Output>
<Output>
<TypeIdentifier>(0x6ab26b81, 0x0f8c02f3)</TypeIdentifier>
<Name>Channel units</Name>
</Output>
</Outputs>
<Settings>
<Setting>
<TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier>
<Name>Acquisition server hostname</Name>
<DefaultValue>${AcquisitionServer_HostName}</DefaultValue>
<Value>${AcquisitionServer_HostName}</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier>
<Name>Acquisition server port</Name>
<DefaultValue>1024</DefaultValue>
<Value>1024</Value>
<Modifiability>false</Modifiability>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>-16.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>560.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0x0d4656c0, 0xc95b1fa8)</Value>
</Attribute>
<Attribute>
<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
<Value>(0x00000000, 0x00596403)</Value>
</Attribute>
<Attribute>
<Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier>
<Value>false</Value>
</Attribute>
<Attribute>
<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
<Value>5</Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>2</Value>
</Attribute>
</Attributes>
</Box>
<Box>
<Identifier>(0x00006e09, 0x00006c54)</Identifier>
<Name>Temporal filter</Name>
<AlgorithmClassIdentifier>(0xb4f9d042, 0x9d79f2e5)</AlgorithmClassIdentifier>
<Inputs>
<Input>
<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
<Name>Input signal</Name>
</Input>
</Inputs>
<Outputs>
<Output>
<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
<Name>Filtered signal</Name>
</Output>
</Outputs>
<Settings>
<Setting>
<TypeIdentifier>(0x2f2c606c, 0x8512ed68)</TypeIdentifier>
<Name>Filter method</Name>
<DefaultValue>Butterworth</DefaultValue>
<Value>Butterworth</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0xfa20178e, 0x4cba62e9)</TypeIdentifier>
<Name>Filter type</Name>
<DefaultValue>Band pass</DefaultValue>
<Value>Band pass</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier>
<Name>Filter order</Name>
<DefaultValue>4</DefaultValue>
<Value>4</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Low cut frequency (Hz)</Name>
<DefaultValue>29</DefaultValue>
<Value>3.000000</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>High cut frequency (Hz)</Name>
<DefaultValue>40</DefaultValue>
<Value>40.000000</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Pass band ripple (dB)</Name>
<DefaultValue>0.5</DefaultValue>
<Value>0.500000</Value>
<Modifiability>false</Modifiability>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>48.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>560.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0x27a4ceec, 0x876d6384)</Value>
</Attribute>
<Attribute>
<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
<Value>(0x00000000, 0x005c78a8)</Value>
</Attribute>
<Attribute>
<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
<Value>1</Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>6</Value>
</Attribute>
<Attribute>
<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
<Value>1</Value>
</Attribute>
</Attributes>
</Box>
<Box>
<Identifier>(0x00006ff2, 0x000035c1)</Identifier>
<Name>Signal display</Name>
<AlgorithmClassIdentifier>(0x0055be5f, 0x087bdd12)</AlgorithmClassIdentifier>
<Inputs>
<Input>
<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
<Name>Data</Name>
</Input>
<Input>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>Stimulations</Name>
</Input>
<Input>
<TypeIdentifier>(0x6ab26b81, 0x0f8c02f3)</TypeIdentifier>
<Name>Channel Units</Name>
</Input>
</Inputs>
<Settings>
<Setting>
<TypeIdentifier>(0x5de046a6, 0x086340aa)</TypeIdentifier>
<Name>Display Mode</Name>
<DefaultValue>Scan</DefaultValue>
<Value>Scan</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x33a30739, 0x00d5299b)</TypeIdentifier>
<Name>Auto vertical scale</Name>
<DefaultValue>Per channel</DefaultValue>
<Value>Per channel</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Scale refresh interval (secs)</Name>
<DefaultValue>5</DefaultValue>
<Value>5</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Vertical Scale</Name>
<DefaultValue>100</DefaultValue>
<Value>100</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Vertical Offset</Name>
<DefaultValue>0</DefaultValue>
<Value>0</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Time Scale</Name>
<DefaultValue>10</DefaultValue>
<Value>10</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Horizontal ruler</Name>
<DefaultValue>true</DefaultValue>
<Value>true</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Vertical ruler</Name>
<DefaultValue>false</DefaultValue>
<Value>false</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Multiview</Name>
<DefaultValue>false</DefaultValue>
<Value>false</Value>
<Modifiability>false</Modifiability>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>112.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>752.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0x92c056a7, 0x2dc71aff)</Value>
</Attribute>
<Attribute>
<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
<Value>(0x00000000, 0x0020924b)</Value>
</Attribute>
<Attribute>
<Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier>
<Value>false</Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>9</Value>
</Attribute>
<Attribute>
<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
<Value>3</Value>
</Attribute>
</Attributes>
</Box>
<Box>
<Identifier>(0x28b20eb9, 0x6ca2286f)</Identifier>
<Name>Instant Bars</Name>
<AlgorithmClassIdentifier>(0xecb46081, 0x96da0d49)</AlgorithmClassIdentifier>
<Inputs>
<Input>
<TypeIdentifier>(0x1f261c0a, 0x593bf6bd)</TypeIdentifier>
<Name>Matrix</Name>
</Input>
</Inputs>
<Settings>
<Setting>
<TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier>
<Name>Channel Localisation</Name>
<DefaultValue>${AdvancedViz_ChannelLocalisation}</DefaultValue>
<Value>${AdvancedViz_ChannelLocalisation}</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Positive Data Only ?</Name>
<DefaultValue>false</DefaultValue>
<Value>false</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Gain</Name>
<DefaultValue>1</DefaultValue>
<Value>1</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier>
<Name>Caption</Name>
<DefaultValue></DefaultValue>
<Value></Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Translucency</Name>
<DefaultValue>1</DefaultValue>
<Value>1</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x3d3c7c7f, 0xef0e7129)</TypeIdentifier>
<Name>Color</Name>
<DefaultValue>${AdvancedViz_DefaultColorGradient}</DefaultValue>
<Value>${AdvancedViz_DefaultColorGradient}</Value>
<Modifiability>false</Modifiability>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>256</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>560</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0x6b60e2b2, 0xf4839b7d)</Value>
</Attribute>
<Attribute>
<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>6</Value>
</Attribute>
<Attribute>
<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
<Value>1</Value>
</Attribute>
</Attributes>
</Box>
</Boxes>
<Links>
<Link>
<Identifier>(0x00000c5d, 0x00003e97)</Identifier>
<Source>
<BoxIdentifier>(0x00000efb, 0x00007452)</BoxIdentifier>
<BoxOutputIndex>0</BoxOutputIndex>
</Source>
<Target>
<BoxIdentifier>(0x000026ba, 0x000014fc)</BoxIdentifier>
<BoxInputIndex>0</BoxInputIndex>
</Target>
</Link>
<Link>
<Identifier>(0x0000235d, 0x00005682)</Identifier>
<Source>
<BoxIdentifier>(0x0000441d, 0x00001a28)</BoxIdentifier>
<BoxOutputIndex>1</BoxOutputIndex>
</Source>
<Target>
<BoxIdentifier>(0x00006e09, 0x00006c54)</BoxIdentifier>
<BoxInputIndex>0</BoxInputIndex>
</Target>
</Link>
<Link>
<Identifier>(0x00003f9c, 0x000047e9)</Identifier>
<Source>
<BoxIdentifier>(0x00006e09, 0x00006c54)</BoxIdentifier>
<BoxOutputIndex>0</BoxOutputIndex>
</Source>
<Target>
<BoxIdentifier>(0x00006ff2, 0x000035c1)</BoxIdentifier>
<BoxInputIndex>0</BoxInputIndex>
</Target>
</Link>
<Link>
<Identifier>(0x00006d4e, 0x0000333e)</Identifier>
<Source>
<BoxIdentifier>(0x00006e09, 0x00006c54)</BoxIdentifier>
<BoxOutputIndex>0</BoxOutputIndex>
</Source>
<Target>
<BoxIdentifier>(0x00000efb, 0x00007452)</BoxIdentifier>
<BoxInputIndex>0</BoxInputIndex>
</Target>
</Link>
<Link>
<Identifier>(0x5b7cfcf0, 0x1cbb9051)</Identifier>
<Source>
<BoxIdentifier>(0x000026ba, 0x000014fc)</BoxIdentifier>
<BoxOutputIndex>0</BoxOutputIndex>
</Source>
<Target>
<BoxIdentifier>(0x28b20eb9, 0x6ca2286f)</BoxIdentifier>
<BoxInputIndex>0</BoxInputIndex>
</Target>
</Link>
</Links>
<Comments>
<Comment>
<Identifier>(0x00002d94, 0x00007404)</Identifier>
<Text>Display the signal from all channels </Text>
<Attributes>
<Attribute>
<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
<Value>960.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
<Value>112.000000</Value>
</Attribute>
</Attributes>
</Comment>
<Comment>
<Identifier>(0x00004efd, 0x0000146d)</Identifier>
<Text>You can browse each box' documentation by selecting the box and pressing &lt;b&gt;F1&lt;/b&gt;
This scenario set is documented in 'http://openvibe.inria.fr/using-the-ssvep-mind-shooter-scenarios/'</Text>
<Attributes>
<Attribute>
<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
<Value>528</Value>
</Attribute>
<Attribute>
<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
<Value>-112</Value>
</Attribute>
</Attributes>
</Comment>
<Comment>
<Identifier>(0x00007577, 0x000059a7)</Identifier>
<Text>&lt;b&gt;&lt;big&gt;Acquisition test&lt;/big&gt;&lt;/b&gt;
Scenario used for testing data acquisition. The signal quality should
always be checked before training.
You can monitor signals from all of the electrodes. Individual
signals are shown for each channel, as well as FFT power of all channels.
</Text>
<Attributes>
<Attribute>
<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
<Value>224.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
<Value>16.000000</Value>
</Attribute>
</Attributes>
</Comment>
</Comments>
<Metadata>
<Entry>
<Identifier>(0x0000775c, 0x000078ff)</Identifier>
<Type>(0x3bcce5d2, 0x43f2d968)</Type>
<Data>[{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":776,"identifier":"(0x00002985, 0x00004ff2)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":753},{"boxIdentifier":"(0x28b20eb9, 0x6ca2286f)","childCount":0,"identifier":"(0x63bb111b, 0x0b13330c)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000024d0, 0x00004b7a)","index":0,"name":"Default tab","parentIdentifier":"(0x00002985, 0x00004ff2)","type":2},{"boxIdentifier":"(0x00006ff2, 0x000035c1)","childCount":0,"identifier":"(0x00003256, 0x00006784)","index":0,"parentIdentifier":"(0x000024d0, 0x00004b7a)","type":3}]</Data>
</Entry>
</Metadata>
<Attributes>
<Attribute>
<Identifier>(0x790d75b8, 0x3bb90c33)</Identifier>
<Value>Jussi T. Lindgren, Jozef Legeny</Value>
</Attribute>
<Attribute>
<Identifier>(0x8c1fc55b, 0x7b433dc2)</Identifier>
<Value>1.0</Value>
</Attribute>
<Attribute>
<Identifier>(0x9f5c4075, 0x4a0d3666)</Identifier>
<Value>SSVEP Acquisition Test</Value>
</Attribute>
<Attribute>
<Identifier>(0xf36a1567, 0xd13c53da)</Identifier>
<Value>http://openvibe.inria.fr/using-the-ssvep-mind-shooter-scenarios/</Value>
</Attribute>
<Attribute>
<Identifier>(0xf6b2e3fa, 0x7bd43926)</Identifier>
<Value>SSVEP</Value>
</Attribute>
<Attribute>
<Identifier>(0xf8034a49, 0x8b3f37cc)</Identifier>
<Value>Inria</Value>
</Attribute>
</Attributes>
</OpenViBE-Scenario>
@@ -0,0 +1,599 @@
<OpenViBE-Scenario>
<FormatVersion>1</FormatVersion>
<Creator>Designer</Creator>
<CreatorVersion>2.0.0</CreatorVersion>
<Settings></Settings>
<Inputs></Inputs>
<Outputs></Outputs>
<Boxes>
<Box>
<Identifier>(0x00000533, 0x00001c79)</Identifier>
<Name>Experiment Settings</Name>
<AlgorithmClassIdentifier>(0x0b5a2787, 0x02750621)</AlgorithmClassIdentifier>
<Inputs>
<Input>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>New input</Name>
</Input>
</Inputs>
<Outputs>
<Output>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>Stimulations</Name>
</Output>
</Outputs>
<Settings>
<Setting>
<TypeIdentifier>(0xb0d0db45, 0x49cbc34a)</TypeIdentifier>
<Name>Lua Script</Name>
<DefaultValue></DefaultValue>
<Value>${Player_ScenarioDirectory}/scripts/configuration-experiment-settings.lua</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x7f45a2a9, 0x7db12219)</TypeIdentifier>
<Name>Target Light Color</Name>
<DefaultValue>100,0,0</DefaultValue>
<Value>100,0,0</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x7f45a2a9, 0x7db12219)</TypeIdentifier>
<Name>Target Dark Color</Name>
<DefaultValue>0,0,0</DefaultValue>
<Value>10,0,0</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier>
<Name>Stimulation Frequencies</Name>
<DefaultValue>20;15;12</DefaultValue>
<Value>5.454545;6.6666;7.5</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Processing Epoch Duration</Name>
<DefaultValue>0.5</DefaultValue>
<Value>1</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Processing Epoch Interval</Name>
<DefaultValue>0.1</DefaultValue>
<Value>0.1</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Processing Frequency Tolerance</Name>
<DefaultValue>0.250</DefaultValue>
<Value>0.25</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier>
<Name>CSP Spatial Filter Order</Name>
<DefaultValue>3</DefaultValue>
<Value>2</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Focus Point</Name>
<DefaultValue>false</DefaultValue>
<Value>false</Value>
<Modifiability>false</Modifiability>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x17ee7c08, 0x94c14893)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>400</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>368</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0xd6e3f48b, 0xbee3523a)</Value>
</Attribute>
<Attribute>
<Identifier>(0x61d11811, 0x71e65362)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
<Value>(0x00000000, 0x0004a72a)</Value>
</Attribute>
<Attribute>
<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
<Value>1</Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>1</Value>
</Attribute>
<Attribute>
<Identifier>(0xf191c1c8, 0xa0123976)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0xfba64161, 0x65304e21)</Identifier>
<Value></Value>
</Attribute>
</Attributes>
</Box>
<Box>
<Identifier>(0x000024b5, 0x00000bb5)</Identifier>
<Name>Display Settings</Name>
<AlgorithmClassIdentifier>(0x0b5a2787, 0x02750621)</AlgorithmClassIdentifier>
<Outputs>
<Output>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>Stimulations</Name>
</Output>
</Outputs>
<Settings>
<Setting>
<TypeIdentifier>(0xb0d0db45, 0x49cbc34a)</TypeIdentifier>
<Name>Lua Script</Name>
<DefaultValue></DefaultValue>
<Value>${Player_ScenarioDirectory}/scripts/configuration-peripheral-settings.lua</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier>
<Name>Screen Refresh Rate</Name>
<DefaultValue>60</DefaultValue>
<Value>60</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier>
<Name>Window Width</Name>
<DefaultValue>800</DefaultValue>
<Value>800</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier>
<Name>Window Height</Name>
<DefaultValue>600</DefaultValue>
<Value>600</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Fullscreen</Name>
<DefaultValue></DefaultValue>
<Value>true</Value>
<Modifiability>false</Modifiability>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x17ee7c08, 0x94c14893)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>64.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>369.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0xd6e3f48b, 0xbee3523a)</Value>
</Attribute>
<Attribute>
<Identifier>(0x61d11811, 0x71e65362)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
<Value>(0x00000000, 0x007b56c4)</Value>
</Attribute>
<Attribute>
<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
<Value>1</Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>1</Value>
</Attribute>
<Attribute>
<Identifier>(0xf191c1c8, 0xa0123976)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0xfba64161, 0x65304e21)</Identifier>
<Value></Value>
</Attribute>
</Attributes>
</Box>
<Box>
<Identifier>(0x00004bf3, 0x00007808)</Identifier>
<Name>Player Controller</Name>
<AlgorithmClassIdentifier>(0x5f426dce, 0x08456e13)</AlgorithmClassIdentifier>
<Inputs>
<Input>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>Stimulations</Name>
</Input>
</Inputs>
<Settings>
<Setting>
<TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier>
<Name>Stimulation name</Name>
<DefaultValue>OVTK_StimulationId_Label_00</DefaultValue>
<Value>OVTK_StimulationId_TrainCompleted</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0xcc14d8d6, 0xf27ecb73)</TypeIdentifier>
<Name>Action to perform</Name>
<DefaultValue>Pause</DefaultValue>
<Value>Stop</Value>
<Modifiability>false</Modifiability>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>528</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>368</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0x568d148e, 0x650792b3)</Value>
</Attribute>
<Attribute>
<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
<Value>(0x00000000, 0x00208175)</Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>2</Value>
</Attribute>
<Attribute>
<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
<Value>1</Value>
</Attribute>
</Attributes>
</Box>
<Box>
<Identifier>(0x00005dd3, 0x00000cf3)</Identifier>
<Name>EEG Input Settings</Name>
<AlgorithmClassIdentifier>(0x0b5a2787, 0x02750621)</AlgorithmClassIdentifier>
<Inputs>
<Input>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>New input</Name>
</Input>
</Inputs>
<Outputs>
<Output>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>Stimulations</Name>
</Output>
</Outputs>
<Settings>
<Setting>
<TypeIdentifier>(0xb0d0db45, 0x49cbc34a)</TypeIdentifier>
<Name>Lua Script</Name>
<DefaultValue></DefaultValue>
<Value>${Player_ScenarioDirectory}/scripts/configuration-eeg-input-settings.lua</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier>
<Name>Channels</Name>
<DefaultValue></DefaultValue>
<Value>:</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x3bcf9e67, 0x0c23994d)</TypeIdentifier>
<Name>Selection Method</Name>
<DefaultValue>Reject</DefaultValue>
<Value>Select</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x666f25e9, 0x3e5738d6)</TypeIdentifier>
<Name>Match Method</Name>
<DefaultValue>Smart</DefaultValue>
<Value>Smart</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier>
<Name>Training Data File</Name>
<DefaultValue>${Player_ScenarioDirectory}/signals/ssvep-record-current.ov</DefaultValue>
<Value>${Player_ScenarioDirectory}/signals/ssvep-record-current.ov</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier>
<Name>Testing Data File</Name>
<DefaultValue>${Player_ScenarioDirectory}/signals/ssvep-record-current.ov</DefaultValue>
<Value>${Player_ScenarioDirectory}/signals/ssvep-record-current.ov</Value>
<Modifiability>false</Modifiability>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x17ee7c08, 0x94c14893)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>224</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>368</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0xd6e3f48b, 0xbee3523a)</Value>
</Attribute>
<Attribute>
<Identifier>(0x61d11811, 0x71e65362)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
<Value>(0x00000000, 0x00dac25b)</Value>
</Attribute>
<Attribute>
<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
<Value>1</Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>1</Value>
</Attribute>
<Attribute>
<Identifier>(0xf191c1c8, 0xa0123976)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0xfba64161, 0x65304e21)</Identifier>
<Value></Value>
</Attribute>
</Attributes>
</Box>
</Boxes>
<Links>
<Link>
<Identifier>(0x000011e3, 0x00005213)</Identifier>
<Source>
<BoxIdentifier>(0x000024b5, 0x00000bb5)</BoxIdentifier>
<BoxOutputIndex>0</BoxOutputIndex>
</Source>
<Target>
<BoxIdentifier>(0x00005dd3, 0x00000cf3)</BoxIdentifier>
<BoxInputIndex>0</BoxInputIndex>
</Target>
</Link>
<Link>
<Identifier>(0x00002afe, 0x00005880)</Identifier>
<Source>
<BoxIdentifier>(0x00005dd3, 0x00000cf3)</BoxIdentifier>
<BoxOutputIndex>0</BoxOutputIndex>
</Source>
<Target>
<BoxIdentifier>(0x00000533, 0x00001c79)</BoxIdentifier>
<BoxInputIndex>0</BoxInputIndex>
</Target>
</Link>
<Link>
<Identifier>(0x0000591f, 0x00006602)</Identifier>
<Source>
<BoxIdentifier>(0x00000533, 0x00001c79)</BoxIdentifier>
<BoxOutputIndex>0</BoxOutputIndex>
</Source>
<Target>
<BoxIdentifier>(0x00004bf3, 0x00007808)</BoxIdentifier>
<BoxInputIndex>0</BoxInputIndex>
</Target>
</Link>
</Links>
<Comments>
<Comment>
<Identifier>(0x00000df6, 0x00003d56)</Identifier>
<Text>&lt;big&gt;&lt;b&gt;Experiment Settings&lt;/b&gt;&lt;/big&gt;
Settings concerning the SSVEP experiment in general.
&lt;b&gt;Target Light Color&lt;/b&gt; and &lt;b&gt;Target Dark Color&lt;/b&gt; represent
the two colors which will be used to generate the flickering of
the targets. The notation Light and Dark is arbitrary, however on
frequencies using odd number of frames will use more frames to
represent the Light color.
&lt;b&gt;Screen Refresh Rate : &lt;/b&gt; The refresh rate of your screen,
refer to your screen's user manual to find this value.
&lt;span color="red"&gt;Important notice&lt;/span&gt;
Your screen will be able to reproduce only frequencies which
are result of division of your screen refresh rate by an
integer.
&lt;b&gt;Stimulation Frequencies&lt;/b&gt; A comma separated list of
frequencies used for the stimulation. Refer to the documentation
for more details.
&lt;b&gt;Processing Epoch Duration&lt;/b&gt; The length of the slice of the signal
which will be used to find SSVEP response. With longer duration precision
will increase at the detriment of the lag.
&lt;b&gt;Processing Epoch Interval&lt;/b&gt; The speed interval between slices of the
signal.
&lt;b&gt;Processing Frequency Tolerance&lt;/b&gt; The width of the frequency band
around the stimulation frequency used for classification.</Text>
<Attributes>
<Attribute>
<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
<Value>-176</Value>
</Attribute>
<Attribute>
<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
<Value>128</Value>
</Attribute>
</Attributes>
</Comment>
<Comment>
<Identifier>(0x0000187e, 0x00005350)</Identifier>
<Text> &lt;b&gt;&lt;span color="#2060ff"&gt;Configurable box&lt;/span&gt;&lt;/b&gt;
</Text>
<Attributes>
<Attribute>
<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
<Value>368</Value>
</Attribute>
<Attribute>
<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
<Value>400</Value>
</Attribute>
</Attributes>
</Comment>
<Comment>
<Identifier>(0x0000288f, 0x00005f55)</Identifier>
<Text>&lt;b&gt;Welcome to the 'multiclass' SSVEP Mind Shooter&lt;/b&gt;
Multiclass classifiers and CSP are used
by the signal processing pipelines.</Text>
<Attributes>
<Attribute>
<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
<Value>-160.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
<Value>-192.000000</Value>
</Attribute>
</Attributes>
</Comment>
<Comment>
<Identifier>(0x000031b0, 0x00003fa0)</Identifier>
<Text>&lt;big&gt;&lt;b&gt;Scenario description&lt;/b&gt;&lt;/big&gt;
&lt;b&gt;&lt;span color="red"&gt;This scenario must be run at least once before
running any further SSVEP scenarios&lt;/span&gt;&lt;/b&gt;
This is a scenario where you can configure your SSVEP experiment. There
are two boxes containing configuration parameters:
&lt;b&gt;Peripheral Settings&lt;/b&gt;
&lt;b&gt;Experiment Settings&lt;/b&gt;
For more detailed description please refer to the SSVEP
documentation page.</Text>
<Attributes>
<Attribute>
<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
<Value>336</Value>
</Attribute>
<Attribute>
<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
<Value>-160</Value>
</Attribute>
</Attributes>
</Comment>
<Comment>
<Identifier>(0x00003244, 0x00004359)</Identifier>
<Text> &lt;b&gt;&lt;span color="#2060ff"&gt;Configurable box&lt;/span&gt;&lt;/b&gt;
</Text>
<Attributes>
<Attribute>
<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
<Value>368</Value>
</Attribute>
<Attribute>
<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
<Value>64</Value>
</Attribute>
</Attributes>
</Comment>
<Comment>
<Identifier>(0x00005ca6, 0x00003399)</Identifier>
<Text> &lt;b&gt;&lt;span color="#2060ff"&gt;Configurable box&lt;/span&gt;&lt;/b&gt;
</Text>
<Attributes>
<Attribute>
<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
<Value>368</Value>
</Attribute>
<Attribute>
<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
<Value>224</Value>
</Attribute>
</Attributes>
</Comment>
</Comments>
<Metadata>
<Entry>
<Identifier>(0x0000775c, 0x000078ff)</Identifier>
<Type>(0x3bcce5d2, 0x43f2d968)</Type>
<Data>[{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x00005488, 0x0000451f)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00000bbf, 0x000047e2)","index":0,"name":"Default tab","parentIdentifier":"(0x00005488, 0x0000451f)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x000017e4, 0x00003d53)","index":0,"name":"Empty","parentIdentifier":"(0x00000bbf, 0x000047e2)","type":0}]</Data>
</Entry>
</Metadata>
<Attributes>
<Attribute>
<Identifier>(0x790d75b8, 0x3bb90c33)</Identifier>
<Value>Jussi T. Lindgren, Jozef Legeny</Value>
</Attribute>
<Attribute>
<Identifier>(0x8c1fc55b, 0x7b433dc2)</Identifier>
<Value>1.0</Value>
</Attribute>
<Attribute>
<Identifier>(0x9f5c4075, 0x4a0d3666)</Identifier>
<Value>SSVEP Configuration</Value>
</Attribute>
<Attribute>
<Identifier>(0xf36a1567, 0xd13c53da)</Identifier>
<Value>http://openvibe.inria.fr/using-the-ssvep-mind-shooter-scenarios/</Value>
</Attribute>
<Attribute>
<Identifier>(0xf6b2e3fa, 0x7bd43926)</Identifier>
<Value>SSVEP</Value>
</Attribute>
<Attribute>
<Identifier>(0xf8034a49, 0x8b3f37cc)</Identifier>
<Value>Inria</Value>
</Attribute>
</Attributes>
</OpenViBE-Scenario>
@@ -0,0 +1,74 @@
channels = nil
selection_method = nil
match_method = nil
training_datafile = nil
testing_datafile = nil
function initialize(box)
dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua")
channels = box:get_setting(2)
selection_method = box:get_setting(3)
match_method = box:get_setting(4)
training_datafile = box:get_setting(5)
testing_datafile = box:get_setting(6)
end
function uninitialize(box)
end
function process(box)
while box:keep_processing() and box:get_stimulation_count(1) == 0 do
box:sleep()
end
-- create material
box:log("Info", box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/channel-selector.cfg'"))
cfg_file = io.open(box:get_config("${Player_ScenarioDirectory}/configuration/channel-selector.cfg"), "w")
if cfg_file == nil then
box:log("Error", "Could not open config file for writing")
end
cfg_file:write("<OpenViBE-SettingsOverride>\n")
cfg_file:write(string.format("<SettingValue>%s</SettingValue>\n", channels))
cfg_file:write(string.format("<SettingValue>%s</SettingValue>\n", selection_method))
cfg_file:write(string.format("<SettingValue>%s</SettingValue>\n", match_method))
cfg_file:write("</OpenViBE-SettingsOverride>\n")
cfg_file:close()
box:log("Info", box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/file-reader-training.cfg'"))
cfg_file = assert(io.open(box:get_config("${Player_ScenarioDirectory}/configuration/file-reader-training.cfg"), "w"))
cfg_file:write("<OpenViBE-SettingsOverride>\n")
cfg_file:write(string.format("<SettingValue>%s</SettingValue>\n", training_datafile))
-- cfg_file:write(string.format("<SettingValue>32</SettingValue>\n"))
cfg_file:write("</OpenViBE-SettingsOverride>\n")
cfg_file:close()
box:log("Info", box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/file-reader-testing.cfg'"))
cfg_file = assert(io.open(box:get_config("${Player_ScenarioDirectory}/configuration/file-reader-testing.cfg"), "w"))
cfg_file:write("<OpenViBE-SettingsOverride>\n")
cfg_file:write(string.format("<SettingValue>%s</SettingValue>\n", testing_datafile))
-- cfg_file:write(string.format("<SettingValue>32</SettingValue>\n"))
cfg_file:write("</OpenViBE-SettingsOverride>\n")
cfg_file:close()
-- notify the scenario that the configuration process is complete
box:send_stimulation(1, OVTK_StimulationId_TrainCompleted, box:get_current_time() + 0.2, 0)
end
@@ -0,0 +1,185 @@
stimulation_frequencies = {}
frequency_count = 0
target_light_color = {}
target_dark_color = {}
training_target_size = {}
training_targets_positions = {}
processing_epoch_duration = nil
processing_epoch_interval = nil
processing_frequency_tolerance = nil
csp_filter_order = nil
function initialize(box)
dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua")
for value in box:get_setting(2):gmatch("%d+") do
table.insert(target_light_color, value)
end
for value in box:get_setting(3):gmatch("%d+") do
table.insert(target_dark_color, value)
end
for value in box:get_setting(4):gmatch("%d+[.]?%d*") do
table.insert(stimulation_frequencies, value)
frequency_count = frequency_count + 1
end
processing_epoch_duration = box:get_setting(5)
processing_epoch_interval = box:get_setting(6)
processing_frequency_tolerance = box:get_setting(7)
csp_filter_order = box:get_setting(8)
s_focus_point = box:get_setting(9)
end
function uninitialize(box)
end
function process(box)
while box:keep_processing() and box:get_stimulation_count(1) == 0 do
box:sleep()
end
-- create material
box:log("Info", box:get_config("Creating materials in '${Player_ScenarioDirectory}/appconf/materials/flickering.material'"))
cfg_file = assert(io.open(box:get_config("${Player_ScenarioDirectory}/appconf/materials/flickering.material"), "w"))
cfg_file:write("material target_bright\n")
cfg_file:write("{\n")
cfg_file:write(" technique\n")
cfg_file:write(" {\n")
cfg_file:write(" pass\n")
cfg_file:write(" {\n")
cfg_file:write(" ambient 0 0 0 0\n")
cfg_file:write(" diffuse 0 0 0 0\n")
cfg_file:write(" specular 0 0 0 0\n")
cfg_file:write(" emissive ", target_light_color[1] / 100, " ", target_light_color[2] / 100, " ", target_light_color[3] / 100, "\n")
cfg_file:write(" }\n")
cfg_file:write(" }\n")
cfg_file:write("}\n")
cfg_file:write("material target_dark\n")
cfg_file:write("{\n")
cfg_file:write(" technique\n")
cfg_file:write(" {\n")
cfg_file:write(" pass\n")
cfg_file:write(" {\n")
cfg_file:write(" ambient 0 0 0 0\n")
cfg_file:write(" diffuse 0 0 0 0\n")
cfg_file:write(" specular 0 0 0 0\n")
cfg_file:write(" emissive ", target_dark_color[1] / 100, " ", target_dark_color[2] / 100, " ", target_dark_color[3] / 100, "\n")
cfg_file:write(" }\n")
cfg_file:write(" }\n")
cfg_file:write("}\n")
cfg_file:close()
-- prepare the datafolder
foldername = box:get_config("${Player_ScenarioDirectory}/signals/userdata-[$core{date}-$core{time}]")
os.execute(string.format("mkdir \"%s\"", foldername))
box:log("Info", box:get_config("Writing additional configuration to '${Player_ScenarioDirectory}/appconf/application-configuration.conf'"))
-- this file was generated by configuration-peripheral-settings.lua, here we just add to it
cfg_file = assert(io.open(box:get_config("${Player_ScenarioDirectory}/appconf/application-configuration.conf"), "a"))
for i=1,frequency_count do
cfg_file:write("SSVEP_Frequency_", i, " = ", string.format("%g", stimulation_frequencies[i]), "\n")
end
cfg_file:write(string.format("SSVEP_TargetLightColourRed = %f\n", target_light_color[1] / 100))
cfg_file:write(string.format("SSVEP_TargetLightColourGreen = %f\n", target_light_color[2] / 100))
cfg_file:write(string.format("SSVEP_TargetLightColourBlue = %f\n", target_light_color[3] / 100))
cfg_file:write(string.format("SSVEP_TargetDarkColourRed = %f\n", target_dark_color[1] / 100))
cfg_file:write(string.format("SSVEP_TargetDarkColourGreen = %f\n", target_dark_color[2] / 100))
cfg_file:write(string.format("SSVEP_TargetDarkColourBlue = %f\n", target_dark_color[3] / 100))
cfg_file:write("SSVEP_UserDataFolder = ", foldername, "\n")
cfg_file:write("SSVEP_FocusPoint = ", s_focus_point, "\n")
cfg_file:close()
-- create configuration files for temporal filters
for i=1,frequency_count do
box:log("Info", string.format(box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/temporal-filter-freq-%db.cfg'"), i))
cfg_file = assert(io.open(string.format(box:get_config("${Player_ScenarioDirectory}/configuration/temporal-filter-freq-%db.cfg"), i), "w"))
cfg_file:write("<OpenViBE-SettingsOverride>\n")
cfg_file:write("<SettingValue>Butterworth</SettingValue>\n")
cfg_file:write("<SettingValue>Band pass</SettingValue>\n")
cfg_file:write("<SettingValue>4</SettingValue>\n")
cfg_file:write(string.format("<SettingValue>%g</SettingValue>\n", stimulation_frequencies[i] - processing_frequency_tolerance))
cfg_file:write(string.format("<SettingValue>%g</SettingValue>\n", stimulation_frequencies[i] + processing_frequency_tolerance))
cfg_file:write("<SettingValue>0.500000</SettingValue>\n")
cfg_file:write("</OpenViBE-SettingsOverride>\n")
cfg_file:close()
box:log("Info", string.format(box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/temporal-filter-freq-%dh1.cfg'"), i))
cfg_file = assert(io.open(string.format(box:get_config("${Player_ScenarioDirectory}/configuration/temporal-filter-freq-%dh1.cfg"), i), "w"))
cfg_file:write("<OpenViBE-SettingsOverride>\n")
cfg_file:write("<SettingValue>Butterworth</SettingValue>\n")
cfg_file:write("<SettingValue>Band pass</SettingValue>\n")
cfg_file:write("<SettingValue>4</SettingValue>\n")
cfg_file:write(string.format("<SettingValue>%g</SettingValue>\n", stimulation_frequencies[i] * 2 - processing_frequency_tolerance))
cfg_file:write(string.format("<SettingValue>%g</SettingValue>\n", stimulation_frequencies[i] * 2 + processing_frequency_tolerance))
cfg_file:write("<SettingValue>0.500000</SettingValue>\n")
cfg_file:write("</OpenViBE-SettingsOverride>\n")
cfg_file:close()
end
-- create configuration file for CSP Trainer
cfg_filename = box:get_config("${Player_ScenarioDirectory}/configuration/regularized-csp-trainer.cfg")
box:log("Info", "Writing file '" .. cfg_filename .. "'")
cfg_file = assert(io.open(cfg_filename, "w"))
cfg_file:write("<OpenViBE-SettingsOverride>\n")
cfg_file:write(" <SettingValue>OVTK_StimulationId_ExperimentStop</SettingValue>\n")
cfg_file:write(" <SettingValue>${Player_ScenarioDirectory}/classifiers/csp-filters.cfg</SettingValue>\n")
cfg_file:write(string.format(" <SettingValue>%d</SettingValue>\n", csp_filter_order))
cfg_file:write(" <SettingValue>false</SettingValue>\n")
cfg_file:write(" <SettingValue>Chunk average</SettingValue>\n")
cfg_file:write(" <SettingValue>true</SettingValue>\n")
cfg_file:write(" <SettingValue>0.0</SettingValue>\n")
cfg_file:write(" <SettingValue>0.0</SettingValue>\n")
cfg_file:write("</OpenViBE-SettingsOverride>\n")
cfg_file:close()
-- create configuration file for time based epoching
box:log("Info", box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg'"))
cfg_file = assert(io.open(box:get_config("${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg"), "w"))
cfg_file:write("<OpenViBE-SettingsOverride>\n")
cfg_file:write(string.format("<SettingValue>%g</SettingValue>\n", processing_epoch_duration))
cfg_file:write(string.format("<SettingValue>%g</SettingValue>\n", processing_epoch_interval))
cfg_file:write("</OpenViBE-SettingsOverride>\n")
cfg_file:close()
-- create the file writer configuration
box:log("Info", box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/file-writer.cfg'"))
cfg_file = assert(io.open(box:get_config("${Player_ScenarioDirectory}/configuration/file-writer.cfg"), "w"))
cfg_file:write("<OpenViBE-SettingsOverride>\n")
cfg_file:write(string.format("<SettingValue>%s/eeg-data-[$core{date}-$core{time}].ov</SettingValue>\n", foldername))
cfg_file:write("<SettingValue>false</SettingValue>\n")
cfg_file:write("</OpenViBE-SettingsOverride>\n")
cfg_file:close()
-- notify the scenario that the configuration process is complete
box:send_stimulation(1, OVTK_StimulationId_TrainCompleted, box:get_current_time() + 0.2, 0)
end
@@ -0,0 +1,53 @@
vrpn_host = nil
vrpn_port = nil
screen_refresh_rate = nil
window_width = nil
window_height = nil
fullscreen = nil
function initialize(box)
screen_refresh_rate = box:get_setting(2)
window_width = box:get_setting(3)
window_height = box:get_setting(4)
fullscreen = box:get_setting(5)
end
function uninitialize(box)
end
function process(box)
dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua")
box:log("Info", box:get_config("Generating '${Player_ScenarioDirectory}/appconf/application-configuration.conf'"))
cfg_file = assert(io.open(box:get_config("${Player_ScenarioDirectory}/appconf/application-configuration.conf"), "w"))
cfg_file:write("# This file was automatically generated!\n\n")
cfg_file:write("# If you want to change the SSVEP configuration\n")
cfg_file:write("# please use the provided ssvep-configuration scenario.\n")
cfg_file:write("SSVEP_ScreenRefreshRate = ", screen_refresh_rate, "\n")
cfg_file:write("SSVEP_VRPNServerPort = 1337\n")
cfg_file:write("SSVEP_VRPNHost = localhost\n")
-- cfg_file:close()
-- box:log("Info", box:get_config("Generating '${Player_ScenarioDirectory}/appconf/ogre-configuration.conf'"))
-- cfg_file = io.open(box:get_config("${Player_ScenarioDirectory}/appconf/ogre-configuration.conf"), "w")
-- cfg_file:write("# This file was automatically generated!\n\n")
-- cfg_file:write("# If you want to change the SSVEP configuration\n")
-- cfg_file:write("# please use the provided ssvep-configuration scenario.\n")
cfg_file:write("SSVEP_Ogre_LogToConsole = False\n")
cfg_file:write("SSVEP_Ogre_ScreenWidth = ", window_width, "\n")
cfg_file:write("SSVEP_Ogre_ScreenHeight = ", window_height, "\n")
cfg_file:write("SSVEP_Ogre_FullScreen = ", fullscreen, "\n")
cfg_file:close()
box:send_stimulation(1, OVTK_StimulationId_TrainCompleted, box:get_current_time() + 0.2, 0)
end
@@ -0,0 +1,109 @@
classes = nil
current_target = nil
start_time = 0;
stop_time = -1;
do_debug = false;
score = {}
function initialize(box)
dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua")
classes = box:get_setting(2)
for j = 1, classes do
score[j] = {}
for i = 1, classes do
score[j][i] = 0
end
end
end
function uninitialize(box)
correct = 0
incorrect = 0
for j = 1, classes do
output = string.format("Target %d : ", j - 1)
inClass = 0
for i = 1, classes do
inClass = inClass + score[j][i]
end
for i = 1, classes do
output = output .. string.format("%d : %5.1f%%, ", i - 1, 100*score[j][i]/inClass)
if i == j then
correct = correct + score[j][i]
else
incorrect = incorrect + score[j][i]
end
end
box:log("Info", string.format("%s total %d", output, inClass))
end
box:log("Info", string.format("Correct %4d -> %5.1f%%", correct, 100*correct/(correct+incorrect)))
box:log("Info", string.format("Incorrect %4d -> %5.1f%%", incorrect, 100*incorrect/(correct+incorrect)))
end
function process(box)
finished = false
while not finished do
-- time = box:get_current_time()
while box:get_stimulation_count(1) > 0 do
s_code, s_date, s_duration = box:get_stimulation(1, 1)
box:remove_stimulation(1, 1)
if s_code >= OVTK_StimulationId_Label_00 and s_code <= OVTK_StimulationId_Label_1F then
if do_debug then box:log("Info", string.format("Received target %d at ", s_code) .. s_date) end
current_target = s_code - OVTK_StimulationId_Label_00
elseif s_code == OVTK_StimulationId_VisualStimulationStart then
if do_debug then box:log("Info", "Trial started at " .. s_date) end
start_time = s_date
-- We don't know the stop time yet, so for now accept anything in range [start_time, infty]
stop_time = -1
elseif s_code == OVTK_StimulationId_VisualStimulationStop then
if do_debug then box:log("Info", "Trial ended at " .. s_date) end
stop_time = s_date
elseif s_code == OVTK_StimulationId_ExperimentStop then
finished = true
end
end
while box:get_stimulation_count(2) > 0 do
s_code, s_date, s_duration = box:get_stimulation(2, 1)
box:remove_stimulation(2, 1)
if do_debug then box:log("Info", string.format("Received prediction %d at ", s_code) .. s_date) end
if s_date >= start_time and (stop_time < 0 or s_date < stop_time) and (s_code >= OVTK_StimulationId_Label_00 and s_code <= OVTK_StimulationId_Label_1F) then
if do_debug then box:log("Info", string.format("Accepted prediction %d at ", s_code) .. s_date) end
real_target = current_target + 1
prediction = s_code - OVTK_StimulationId_Label_00 + 1
score[real_target][prediction] = score[real_target][prediction] + 1
end
end
box:sleep()
end
end
@@ -0,0 +1,35 @@
buffer = {}
function initialize(box)
end
function uninitialize(box)
end
-- This script receives stimulations and lets pass only every other one
-- for each stimulation code
-- Useful to remove "key up" events of keyboard stimulator
function process(box)
while (box:keep_processing()) do
for index = 1, box:get_stimulation_count(1) do
stimulation = box:get_stimulation(1, index)
if buffer[stimulation] == nil then
box:send_stimulation(1, stimulation, box:get_current_time(), 0)
buffer[stimulation] = 1
else
buffer[stimulation] = nil
end
box:remove_stimulation(1, 1)
end
box:sleep()
end
end
@@ -0,0 +1,70 @@
sequence = {}
flickeringDelay = nil
function initialize(box)
dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua")
s_sequence_types = box:get_setting(2)
s_sequence_positions = box:get_setting(3)
s_target_lockdown = box:get_setting(4)
s_pilot_assist = box:get_setting(5)
s_feedback = box:get_setting(6)
s_onebyone = box:get_setting(7)
s_analog_control = box:get_setting(8)
s_log_level = box:get_setting(9)
box:log("Info", string.format("Target Types Sequence : [%s]\n", s_sequence_types))
for target in s_sequence_positions:gmatch("%d+") do
table.insert(sequence, target)
end
-- create the configuration file for the shooter application
cfg_file = io.open(box:get_config("${Player_ScenarioDirectory}/appconf/shooter-configuration.conf"), "w")
cfg_file:write("SSVEP_EnemyOrder = ", s_sequence_types, "\n")
cfg_file:write("SSVEP_TargetLockdown = ", s_target_lockdown, "\n")
cfg_file:write("SSVEP_PilotAssist = ", s_pilot_assist, "\n")
cfg_file:write("SSVEP_Feedback = ", s_feedback, "\n")
cfg_file:write("SSVEP_OneByOne = ", s_onebyone, "\n")
cfg_file:write("SSVEP_AnalogControl = ", s_analog_control, "\n")
cfg_file:write("SSVEP_LogLevel = ", s_log_level, "\n")
cfg_file:close()
end
function uninitialize(box)
end
function process(box)
-- while targets are available, send a stimulation with new target
-- position for each request
while box:keep_processing() do
if box:get_stimulation_count(1) > 0 then
identifier, date, duration = box:get_stimulation(1, 1)
if identifier == OVTK_StimulationId_Target then
current_time = box:get_current_time() + 1
-- if no targets are available, quit the game
if # sequence == 0 then
box:send_stimulation(1, OVTK_StimulationId_ExperimentStop, current_time, 0)
break
end
next_target = sequence[1]
table.remove(sequence, 1)
box:send_stimulation(1, OVTK_StimulationId_Label_00 + next_target , current_time, 0)
end
box:remove_stimulation(1, 1)
end
box:sleep()
end
end
@@ -0,0 +1,21 @@
delay = 1
function initialize(box)
s_delay = box:get_setting(2);
io.write(string.format("Delay : [%s]\n", s_delay))
if (s_delay:find("^%d+$") ~= nil) then
delay = tonumber(s_delay)
else
io.write("[ERROR] The parameter should be a numeric value\n")
end
end
function uninitialize(box)
end
function process(box)
box:send_stimulation(1, 0x00008001, delay, 0)
end
@@ -0,0 +1,80 @@
sequence = {}
number_of_cycles = 0
stimulation_duration = 7
break_duration = 2
flickering_delay = 3.5
epoching_delay = 1
function initialize(box)
dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua")
-- load the goal sequence
s_sequence = box:get_setting(2)
for target in s_sequence:gmatch("%d+") do
table.insert(sequence, target)
number_of_cycles = number_of_cycles + 1
end
stimulation_duration = box:get_setting(3)
break_duration = box:get_setting(4)
flickering_delay = box:get_setting(5)
epoching_delay = box:get_setting(6)
box:log("Info", string.format("Number of goals in sequence: [%d]", number_of_cycles))
if stimulation_duration-epoching_delay <= 0 then
box:log("Error", "Stimulation duration - epoching delay is not greater than 0.")
end
-- These specify how long and with what offset data will be collected after the flicker start
-- for csp/classifier training. A positive epoching delay is to avoid the ERP effect due to stimulus onset
cfg_file = io.open(box:get_config("${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg"), "w")
cfg_file:write("<OpenViBE-SettingsOverride>\n")
cfg_file:write(" <SettingValue>", stimulation_duration-epoching_delay, "</SettingValue>\n")
cfg_file:write(" <SettingValue>", epoching_delay, "</SettingValue>\n")
cfg_file:write(" <SettingValue>OVTK_StimulationId_VisualStimulationStart</SettingValue>\n")
cfg_file:write("</OpenViBE-SettingsOverride>\n")
cfg_file:close()
end
function uninitialize(box)
end
function process(box)
while box:keep_processing() and box:get_stimulation_count(1) == 0 do
box:sleep()
end
current_time = box:get_current_time() + 1
box:send_stimulation(1, OVTK_StimulationId_ExperimentStart, current_time, 0)
current_time = current_time + 2
for i,target in ipairs(sequence) do
box:log("Info", string.format("Goal no %d is %d at %d", i, target, current_time))
-- mark goal
box:send_stimulation(2, OVTK_StimulationId_LabelStart + target, current_time, 0)
-- wait for Flickering_delay seconds
current_time = current_time + flickering_delay
-- start flickering
box:send_stimulation(1, OVTK_StimulationId_VisualStimulationStart, current_time, 0)
-- wait for Stimulation_duration seconds
current_time = current_time + stimulation_duration
-- unmark goal and stop flickering
box:send_stimulation(1, OVTK_StimulationId_VisualStimulationStop, current_time, 0)
-- wait for Break_duration seconds
current_time = current_time + break_duration
end
current_time = current_time + 2
box:send_stimulation(1, OVTK_StimulationId_ExperimentStop, current_time, 0)
box:sleep()
end
@@ -0,0 +1 @@
This folder contains signals recorded by the SSVEP scenarios.