sound player box & timing

Concerning processing components: filters, file load/save, visualizations, communication ...
Post Reply
stede
Posts: 10
Joined: Tue Dec 06, 2011 9:37 pm

sound player box & timing

Post by stede »

Hi there,

I am trying to get a simple auditory oddball paradigm running, and use the lua stimulator and the sound player (one for standards, one for deviants), followed by the stimulation multiplexer, to write the data into a gdf file. Sounds are wav files of 50ms duration, the isi is jittered (scenario attached). Now it seems that I have a stimulator timing problem. First I noticed a jitter between onset and offset stimulators, beyond the one sample period uncertainty. Second, in the online (only) signal display, most (but not all) stimulators are shown only after a considerable delay (of several seconds). This is probably negligible, but a bit strange, as I do not have these problems with, say, the P3 speller. And finally the AEPs seems shifted in latency (by approx. 100 ms) and not as solid in quality as one might expect, so I assume some real, unwanted jitter. Does anybody have any idea how I could improve event timing?

Big thanks!
stede
Attachments
aud_oddball.xml
(24.28 KiB) Downloaded 408 times

lbonnet
Site Admin
Posts: 417
Joined: Wed Oct 07, 2009 12:11 pm

Re: sound player box & timing

Post by lbonnet »

Hi stede !

Indeed there is a problem with latest version of the Sound Player. The stimulation are not correctly generated.
I check that right now, I'll come back here when I find a solution.

Laurent-
Follow us on twitter >> openvibebci

Checkout my (old) blog for some OpenViBE tips & tricks : here !

lbonnet
Site Admin
Posts: 417
Joined: Wed Oct 07, 2009 12:11 pm

Re: sound player box & timing

Post by lbonnet »

Hi stede,

I investigated this problem.
The stimulation stream outputed by the sound player box was incorrect.
In OpenViBE, the stim stream must be continuous, i.e. even if you don't have stimulation, you must send an empty chunk so the boxes after yours know that there is nothing to expect at that time range.

This resulted in a bad processing of the streams by the Stimulation Multiplexer.

I corrected the sound Player (latest version in the svn trunk). It now works with the Stimulation Multiplexer for instance.
In my tests, I do get good stimulation timing, corresponding to the time when OpenAL status has been reported playing or stopping the sound.
As you may saw, there is some delta between the request and the sound actually playing.

However, if you display the stimulations in a signal display afterward, please note that you will experience very bad sound generation. As the signal display box is far from optimized, it is not capable of reaching real time display of many stimulations (e.g. one every 100 ms), slowing down the whole pipeline including the sound player boxes.

Laurent-
Follow us on twitter >> openvibebci

Checkout my (old) blog for some OpenViBE tips & tricks : here !

stede
Posts: 10
Joined: Tue Dec 06, 2011 9:37 pm

Re: sound player box & timing

Post by stede »

Hi lbonnet,

Thanks much for working on this!!! I checked the new version, and apparently you fixed one of my problems, which is great: The sound-off event marker (stimulation) is now much more precise in timing, so the Stimulation Multiplexer seems happy now. However, my main problem is the temporal jitter between sound-on stimulation code and the actual playing of the sound. I am exploring this by recording the wav file directly into the EEG, and exploring the trial-by-trial fluctuations, and there is a jitter beyond the period of one sample. It seems that the problem is more evident for larger sound files)as compared to shorter ones (e.g. a 44kKhz vs. a 11kHz pure tone file of 60 ms duration), and more pronounced for shorter sound onset asynchronies (e.g. 330 ms SOA) compared to longer ones (like 1 sec SOA). Do you have any idea what the underlying problem could be? I will repeat my tests now on different hardware (currently win7 os, up to date intel i3 notebook) but it might be a problem inherent in the code of the sound player box....

By the way, has anybody done similar tests for visual stimulus presentation with OV (by using a photo diode)? I remember looking at VEPs from the P300 speller task and I found much smaller (almost absent) VEPs for non-target as compared to target trials. Initially I thought this would be due to presentation of non-targets in largely different visual fields (compared to targets, which are presented at fixation) and this might cause smearing of the VEP responses - but now I feel like I should also check visual timing accuracy.

Thanks much for any comments/ideas....
Best,
stede

stede
Posts: 10
Joined: Tue Dec 06, 2011 9:37 pm

Re: sound player box & timing

Post by stede »

Hi there,
I did some more testing, using different hardware (two notebooks, one PC), but the problem persists. The two figures illustrate the jitter: Each figure shows the single-trial EEG response (and average in red) for the off-stimulation (left), a condition a (middle) and a condition b (right) onset-trigger. The sound files are 1000 (b) and 1200 kHz (c) 62 ms wav files, recorded into one EEG channel. As can be seen there is a delay (which I don't care much about), but the delay is not constant (which concerns me a lot) but jitters. Jitter is given in std ms (at threshold indicate b red line). This jitter must be introduced in between sending the on-stimulation trigger and playing the sound. Interestingly, the problem is much larger when the sounds are repeated more quickly (top figure, SOA 333 ms) compare to a longer delay (bottom, SOA 1000 ms). I believe the last fix of lbonnet improved a bit the jitter of the off-stimulation trigger (but I am not 100% sure, as I did not do a direct comparison), but neither off nor on stimulation triggers seem to sync perfectly with the actual playing of the sound. Hay anybody any idea for fixing this?

Thanks much,
stede
Attachments
mao02-odd-soa333.png
mao02-odd-soa333.png (36.28 KiB) Viewed 15213 times
mao02-odd-soa1000.png
mao02-odd-soa1000.png (29.14 KiB) Viewed 15213 times

mdv
Posts: 6
Joined: Wed Feb 22, 2012 12:37 pm

Re: sound player box & timing

Post by mdv »

hi Laurent,

to follow up on stedes timing problem, we tried to look into the source code in order to figure out how the sending of the trigger is synchronized with the actual playing of the sound.

It is the first day of looking into the code, so I am still trying to get the big picture, but:

in ovpCBoxAlgorithmSoundPlayer, it is reasonably clear how the sound is played in the process function.
however, I do not see where the output trigger is generated and sent. If this trigger is independently generated (where?), it would mean that any delay in soundprocessing (in openvibe or in the hardware) would cause stedes unexpected jitter ...

Thanks a lot for your feedback on this problem
mdv

lbonnet
Site Admin
Posts: 417
Joined: Wed Oct 07, 2009 12:11 pm

Re: sound player box & timing

Post by lbonnet »

Hello,

I'm sorry for the late reply, but if I want to be useful I need to spend some time on it (actually more than 10 minutes here and there when I can).
Here is my 2 cents, maybe it can help (I'll try to do more soon :) )

The Sound player box uses openal, but only on mono-source. Maybe using multi-sources implementation can be relevant.
however, I do not see where the output trigger is generated and sent.
The output stimulation is managed in the process function, line ~160:

Code: Select all

ALint l_uiStatus;
alGetSourcei(m_uiSourceHandle, AL_SOURCE_STATE, &l_uiStatus);
// CASE : the sound has stopped, and we need to send the stimulation
if(l_uiStatus == AL_STOPPED && !m_bEndOfSoundSent)
{
	ip_pStimulationSet->clear();
	ip_pStimulationSet->appendStimulation(
		m_ui64StopTrigger,
		this->getPlayerContext().getCurrentTime(),
		0);
	m_pStreamEncoder->process(OVP_GD_Algorithm_StimulationStreamEncoder_InputTriggerId_EncodeBuffer);
	l_rDynamicBoxContext.markOutputAsReadyToSend(0, m_ui64LastOutputChunkDate, this->getPlayerContext().getCurrentTime());
	m_bEndOfSoundSent = true;
}
This first case happens when the status of openal engine is "sound stopped" but no stim has been sent yet to trigger the "end of sound" event (m_ui64StopTrigger).
There is indeed a delay between this time (the box detected that the sound engine is stopped) and the real stop time. NB : The box process function is called at full openvibe speed (128 Hz).

The cases afterwards are similar:
- The engine is now playing a sound, but no "sound start" stim has been sent yet
- The engine is either stopped or playing, but corresponding stim has already been sent ("idle"), then we send empty chunks of data through the stimulation output of the box, to tell the other boxes that nothing happened at that time.

I hope it will help to understand the implementation.

Laurent
Follow us on twitter >> openvibebci

Checkout my (old) blog for some OpenViBE tips & tricks : here !

etallen3
Posts: 3
Joined: Mon Sep 22, 2014 11:28 pm

Re: sound player box & timing

Post by etallen3 »

Hi,
I am attempting to set up an auditory oddball experiment. (The code for the openvibe scenario file that I am working with is below). My openvibe scenario uses the clock stimulator, but I am wondering if it is possible to set this paradigm up without the clock stimulator. I found your post and was wondering if you could share the lua script that you wrote for the scenario that you created.

Is it possible to set up an auditory oddball experiment without the clock generator? Or is it possible to create a clock stimulator with variable stimulation intervals? Are there clock scripts that permit me to create controlled jitter in the stimulation intervals (or randomization of the interval times)?

Thanks!

Erin


<OpenViBE-Scenario>
<Boxes>
<Box>
<Identifier>(0x00000a6e, 0x0000673d)</Identifier>
<Name>Sound Player</Name>
<AlgorithmClassIdentifier>(0x7ac2396f, 0x7ee52efe)</AlgorithmClassIdentifier>
<Inputs>
<Input>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>Input triggers</Name>
</Input>
</Inputs>
<Outputs>
<Output>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>Resync triggers</Name>
</Output>
</Outputs>
<Settings>
<Setting>
<TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier>
<Name>PLAY trigger</Name>
<DefaultValue>OVTK_StimulationId_Label_00</DefaultValue>
<Value>OVTK_StimulationId_Label_01</Value>
</Setting>
<Setting>
<TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier>
<Name>STOP trigger</Name>
<DefaultValue>OVTK_StimulationId_Label_01</DefaultValue>
<Value>OVTK_StimulationId_EndOfFile</Value>
</Setting>
<Setting>
<TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier>
<Name>File to play</Name>
<DefaultValue>${Path_Data}/plugins/stimulation/ov_beep.wav</DefaultValue>
<Value>C:/Program Files (x86)/openvibe/Audio/Low WoodBlock.wav</Value>
</Setting>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Loop</Name>
<DefaultValue>False</DefaultValue>
<Value>False</Value>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>192</Value>
</Attribute>
<Attribute>
<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
<Value>23</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>400</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0xd327e20a, 0xaae6b1f8)</Value>
</Attribute>
<Attribute>
<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
<Value>84</Value>
</Attribute>
<Attribute>
<Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier>
<Value>false</Value>
</Attribute>
<Attribute>
<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
<Value>1</Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>4</Value>
</Attribute>
<Attribute>
<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
<Value>1</Value>
</Attribute>
</Attributes>
</Box>
<Box>
<Identifier>(0x00002015, 0x00005db9)</Identifier>
<Name>Keyboard stimulator</Name>
<AlgorithmClassIdentifier>(0x00d317b9, 0x6324c3ff)</AlgorithmClassIdentifier>
<Outputs>
<Output>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>Outgoing Stimulations</Name>
</Output>
</Outputs>
<Settings>
<Setting>
<TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier>
<Name>Filename</Name>
<DefaultValue>../share/openvibe-plugins/stimulation/simple-keyboard-to-stimulations.txt</DefaultValue>
<Value>C:/Alez/eeglike/simple-keyboard-to-stimulations.txt</Value>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>96</Value>
</Attribute>
<Attribute>
<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
<Value>23</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>112</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0x8d89d3b7, 0x8339d210)</Value>
</Attribute>
<Attribute>
<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
<Value>126</Value>
</Attribute>
<Attribute>
<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
<Value>1</Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>1</Value>
</Attribute>
</Attributes>
</Box>
<Box>
<Identifier>(0x0000275b, 0x00004963)</Identifier>
<Name>Lua Stimulator</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>C:/Program Files (x86)/openvibe/openvibe_oddball/oddball2.lua</Value>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x17ee7c08, 0x94c14893)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>112</Value>
</Attribute>
<Attribute>
<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
<Value>34</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>256</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0xd6e3f48b, 0xbee3523a)</Value>
</Attribute>
<Attribute>
<Identifier>(0x61d11811, 0x71e65362)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
<Value>93</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>(0x00004ef7, 0x000021ec)</Identifier>
<Name>Clock stimulator</Name>
<AlgorithmClassIdentifier>(0x4f756d3f, 0x29ff0b96)</AlgorithmClassIdentifier>
<Outputs>
<Output>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>Generated stimulations</Name>
</Output>
</Outputs>
<Settings>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Interstimulation interval (in sec)</Name>
<DefaultValue>1.0</DefaultValue>
<Value>4.0</Value>
</Setting>
<Setting>
<TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier>
<Name>Stimulation</Name>
<DefaultValue>OVTK_StimulationId_Label_00</DefaultValue>
<Value>OVTK_StimulationId_Label_01</Value>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>64</Value>
</Attribute>
<Attribute>
<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
<Value>23</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>256</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0x27b3ee3c, 0xc50527e6)</Value>
</Attribute>
<Attribute>
<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
<Value>102</Value>
</Attribute>
<Attribute>
<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
<Value>1</Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>2</Value>
</Attribute>
</Attributes>
</Box>
<Box>
<Identifier>(0x00005b60, 0x00003d90)</Identifier>
<Name>Stimulation multiplexer</Name>
<AlgorithmClassIdentifier>(0x07db4efa, 0x472b0938)</AlgorithmClassIdentifier>
<Inputs>
<Input>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>Input stimulations 1</Name>
</Input>
<Input>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>Input stimulations 2</Name>
</Input>
</Inputs>
<Outputs>
<Output>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>Multiplexed stimulations</Name>
</Output>
</Outputs>
<Attributes>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>224</Value>
</Attribute>
<Attribute>
<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
<Value>34</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>128</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0xd5da9c1d, 0x1cc7dbf9)</Value>
</Attribute>
<Attribute>
<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
<Value>117</Value>
</Attribute>
<Attribute>
<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
<Value>1</Value>
</Attribute>
<Attribute>
<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
<Value>2</Value>
</Attribute>
<Attribute>
<Identifier>(0xfba64161, 0x65304e21)</Identifier>
<Value></Value>
</Attribute>
</Attributes>
</Box>
<Box>
<Identifier>(0x000064e0, 0x000015e2)</Identifier>
<Name>Sound Player</Name>
<AlgorithmClassIdentifier>(0x7ac2396f, 0x7ee52efe)</AlgorithmClassIdentifier>
<Inputs>
<Input>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>Input triggers</Name>
</Input>
</Inputs>
<Outputs>
<Output>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>Resync triggers</Name>
</Output>
</Outputs>
<Settings>
<Setting>
<TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier>
<Name>PLAY trigger</Name>
<DefaultValue>OVTK_StimulationId_Label_00</DefaultValue>
<Value>OVTK_StimulationId_Label_02</Value>
</Setting>
<Setting>
<TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier>
<Name>STOP trigger</Name>
<DefaultValue>OVTK_StimulationId_Label_01</DefaultValue>
<Value>OVTK_StimulationId_Label_00</Value>
</Setting>
<Setting>
<TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier>
<Name>File to play</Name>
<DefaultValue>${Path_Data}/plugins/stimulation/ov_beep.wav</DefaultValue>
<Value>C:/Program Files (x86)/openvibe/Audio/QuintoM2R.wav</Value>
</Setting>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Loop</Name>
<DefaultValue>False</DefaultValue>
<Value>False</Value>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>192</Value>
</Attribute>
<Attribute>
<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
<Value>23</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>304</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0xd327e20a, 0xaae6b1f8)</Value>
</Attribute>
<Attribute>
<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
<Value>84</Value>
</Attribute>
<Attribute>
<Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier>
<Value>false</Value>
</Attribute>
<Attribute>
<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
<Value>1</Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>4</Value>
</Attribute>
<Attribute>
<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
<Value>1</Value>
</Attribute>
</Attributes>
</Box>
<Box>
<Identifier>(0x00006d7b, 0x00000ff5)</Identifier>
<Name>Sound Player</Name>
<AlgorithmClassIdentifier>(0x7ac2396f, 0x7ee52efe)</AlgorithmClassIdentifier>
<Inputs>
<Input>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>Input triggers</Name>
</Input>
</Inputs>
<Outputs>
<Output>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>Resync triggers</Name>
</Output>
</Outputs>
<Settings>
<Setting>
<TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier>
<Name>PLAY trigger</Name>
<DefaultValue>OVTK_StimulationId_Label_00</DefaultValue>
<Value>OVTK_StimulationId_Label_03</Value>
</Setting>
<Setting>
<TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier>
<Name>STOP trigger</Name>
<DefaultValue>OVTK_StimulationId_Label_01</DefaultValue>
<Value>OVTK_StimulationId_EndOfFile</Value>
</Setting>
<Setting>
<TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier>
<Name>File to play</Name>
<DefaultValue>${Path_Data}/plugins/stimulation/ov_beep.wav</DefaultValue>
<Value>C:/Program Files (x86)/openvibe/Audio/Taiko drum.wav</Value>
</Setting>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Loop</Name>
<DefaultValue>False</DefaultValue>
<Value>False</Value>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>192</Value>
</Attribute>
<Attribute>
<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
<Value>23</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>512</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0xd327e20a, 0xaae6b1f8)</Value>
</Attribute>
<Attribute>
<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
<Value>84</Value>
</Attribute>
<Attribute>
<Identifier>(0xc67a01dc, 0x28ce06c1)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier>
<Value>false</Value>
</Attribute>
<Attribute>
<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
<Value>1</Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>4</Value>
</Attribute>
<Attribute>
<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
<Value>1</Value>
</Attribute>
</Attributes>
</Box>
</Boxes>
<Links>
<Link>
<Identifier>(0x0000164a, 0x0000093c)</Identifier>
<Source>
<BoxIdentifier>(0x00004ef7, 0x000021ec)</BoxIdentifier>
<BoxOutputIndex>0</BoxOutputIndex>
</Source>
<Target>
<BoxIdentifier>(0x0000275b, 0x00004963)</BoxIdentifier>
<BoxInputIndex>0</BoxInputIndex>
</Target>
<Attributes>
<Attribute>
<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
<Value>82</Value>
</Attribute>
<Attribute>
<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
<Value>256</Value>
</Attribute>
<Attribute>
<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
<Value>90</Value>
</Attribute>
<Attribute>
<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
<Value>256</Value>
</Attribute>
</Attributes>
</Link>
<Link>
<Identifier>(0x0000188f, 0x00005d28)</Identifier>
<Source>
<BoxIdentifier>(0x00002015, 0x00005db9)</BoxIdentifier>
<BoxOutputIndex>0</BoxOutputIndex>
</Source>
<Target>
<BoxIdentifier>(0x00005b60, 0x00003d90)</BoxIdentifier>
<BoxInputIndex>0</BoxInputIndex>
</Target>
<Attributes>
<Attribute>
<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
<Value>114</Value>
</Attribute>
<Attribute>
<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
<Value>112</Value>
</Attribute>
<Attribute>
<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
<Value>202</Value>
</Attribute>
<Attribute>
<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
<Value>120</Value>
</Attribute>
</Attributes>
</Link>
<Link>
<Identifier>(0x00002332, 0x0000569c)</Identifier>
<Source>
<BoxIdentifier>(0x0000275b, 0x00004963)</BoxIdentifier>
<BoxOutputIndex>0</BoxOutputIndex>
</Source>
<Target>
<BoxIdentifier>(0x00005b60, 0x00003d90)</BoxIdentifier>
<BoxInputIndex>1</BoxInputIndex>
</Target>
<Attributes>
<Attribute>
<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
<Value>135</Value>
</Attribute>
<Attribute>
<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
<Value>256</Value>
</Attribute>
<Attribute>
<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
<Value>202</Value>
</Attribute>
<Attribute>
<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
<Value>135</Value>
</Attribute>
</Attributes>
</Link>
<Link>
<Identifier>(0x00003c8a, 0x0000618b)</Identifier>
<Source>
<BoxIdentifier>(0x0000275b, 0x00004963)</BoxIdentifier>
<BoxOutputIndex>0</BoxOutputIndex>
</Source>
<Target>
<BoxIdentifier>(0x00006d7b, 0x00000ff5)</BoxIdentifier>
<BoxInputIndex>0</BoxInputIndex>
</Target>
<Attributes>
<Attribute>
<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
<Value>135</Value>
</Attribute>
<Attribute>
<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
<Value>256</Value>
</Attribute>
<Attribute>
<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
<Value>176</Value>
</Attribute>
<Attribute>
<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
<Value>512</Value>
</Attribute>
</Attributes>
</Link>
<Link>
<Identifier>(0x000052e5, 0x00005888)</Identifier>
<Source>
<BoxIdentifier>(0x0000275b, 0x00004963)</BoxIdentifier>
<BoxOutputIndex>0</BoxOutputIndex>
</Source>
<Target>
<BoxIdentifier>(0x000064e0, 0x000015e2)</BoxIdentifier>
<BoxInputIndex>0</BoxInputIndex>
</Target>
<Attributes>
<Attribute>
<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
<Value>135</Value>
</Attribute>
<Attribute>
<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
<Value>256</Value>
</Attribute>
<Attribute>
<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
<Value>176</Value>
</Attribute>
<Attribute>
<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
<Value>304</Value>
</Attribute>
</Attributes>
</Link>
<Link>
<Identifier>(0x00007f5c, 0x000001f8)</Identifier>
<Source>
<BoxIdentifier>(0x0000275b, 0x00004963)</BoxIdentifier>
<BoxOutputIndex>0</BoxOutputIndex>
</Source>
<Target>
<BoxIdentifier>(0x00000a6e, 0x0000673d)</BoxIdentifier>
<BoxInputIndex>0</BoxInputIndex>
</Target>
<Attributes>
<Attribute>
<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
<Value>135</Value>
</Attribute>
<Attribute>
<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
<Value>256</Value>
</Attribute>
<Attribute>
<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
<Value>176</Value>
</Attribute>
<Attribute>
<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
<Value>400</Value>
</Attribute>
</Attributes>
</Link>
</Links>
<MessageLinks></MessageLinks>
<Comments></Comments>
<VisualisationTree>
<VisualisationWidget>
<Identifier>(0x00002f84, 0x000063c6)</Identifier>
<Type>3</Type>
<ParentIdentifier>(0xffffffff, 0xffffffff)</ParentIdentifier>
<BoxIdentifier>(0x00002015, 0x00005db9)</BoxIdentifier>
<NumChildren>0</NumChildren>
</VisualisationWidget>
<VisualisationWidget>
<Identifier>(0x00006b61, 0x00004740)</Identifier>
<Name>Default window</Name>
<Type>1</Type>
<ParentIdentifier>(0xffffffff, 0xffffffff)</ParentIdentifier>
<BoxIdentifier>(0xffffffff, 0xffffffff)</BoxIdentifier>
<NumChildren>1</NumChildren>
<Attributes>
<Attribute>
<Identifier>(0x4c90d4ad, 0x7a2554ec)</Identifier>
<Value>320</Value>
</Attribute>
<Attribute>
<Identifier>(0x7b814cca, 0x271df6dd)</Identifier>
<Value>480</Value>
</Attribute>
</Attributes>
</VisualisationWidget>
<VisualisationWidget>
<Identifier>(0x00001dc3, 0x000051b1)</Identifier>
<Name>Default tab</Name>
<Type>2</Type>
<ParentIdentifier>(0x00006b61, 0x00004740)</ParentIdentifier>
<Index>0</Index>
<BoxIdentifier>(0xffffffff, 0xffffffff)</BoxIdentifier>
<NumChildren>1</NumChildren>
</VisualisationWidget>
<VisualisationWidget>
<Identifier>(0x00001da7, 0x00001a30)</Identifier>
<Name>Empty</Name>
<Type>0</Type>
<ParentIdentifier>(0x00001dc3, 0x000051b1)</ParentIdentifier>
<Index>0</Index>
<BoxIdentifier>(0xffffffff, 0xffffffff)</BoxIdentifier>
<NumChildren>0</NumChildren>
</VisualisationWidget>
</VisualisationTree>
</OpenViBE-Scenario>

fabien.lotte
Posts: 112
Joined: Sun Mar 14, 2010 12:58 pm

Re: sound player box & timing

Post by fabien.lotte »

Dear Erin,

Indeed, you could setup an auditory oddball using the Lua stimulator rather than the clock stimulator. Using a Lua script you can basically send stimulation whenever you want, including with variable intervals between trials/stimulations. I would recommand you to look at the lua script which is used for the motor imagery CSP scenarios ( in ...\openvibe\share\openvibe\scenarios\bci-examples\motor-imagery-CSP\motor-imagery-bci-graz-stimulator.lua). Indeed, this lua scripts does exactly that, i.e., sending stimulations indicating the trials events at precise timing, including with random variations between trials. You should be able to adapt this script to design an oddball experiment.

I hope this helps,

Best regards,
Fabien

etallen3
Posts: 3
Joined: Mon Sep 22, 2014 11:28 pm

Re: sound player box & timing

Post by etallen3 »

Hi Fabien,
Thanks for the information! Are you able to attach the lua script that you referred me to in this post or provide a direct link to it? I'm not able to find the actual lua script in in...\openvibe\share\openvibe\scenarios\bci-examples\motor-imagery-CSP\motor-imagery-bci-graz-stimulator.lua.

Thanks,
Erin

fabien.lotte
Posts: 112
Joined: Sun Mar 14, 2010 12:58 pm

Re: sound player box & timing

Post by fabien.lotte »

Hi,

I don't have a direct link for that file, but you can have a look at the following OpenViBE scenarios, which also contains a Lua script which does send stimulations at specific times: http://openvibe.inria.fr/openvibe/wp-co ... r-demo.zip

I hope it will be useful,

Best,
Fabien

Post Reply