Пример #1
0
class RepeatedTrials(Experiments.Experiment):
	def __init__(self, parent, id, pos=(-1,-1), guiPanel=None):
		Experiments.Experiment.__init__(self, parent, id, pos, guiPanel)
		self.name="Trials Experiment"
		
		self.waveInputs = []
		self.waveInputs.append(WaveInput.WaveInput(name="Input"))
		
		self.trialParameter = SignalParameter(name="Number of Trials", type=int, default = 1, range = (0,10), unit="", attachable=False)
		self.durationParameter = SignalParameter(name="Duration of Trial", type=float, default=1, range=(0,5), unit="sec", attachable=False)
		self.timeBetweenTrials = SignalParameter(name="Time Between Trials", type=float, default=0.5, range=(0,5), unit="sec", attachable=False)
		
		self.parameters = [self.trialParameter, self.durationParameter, self.timeBetweenTrials]
		self.parameterYRanges = []
		
		self.setUpView()
		self.createParameterGUI(defaultAxes = {"xy":[(self.trialParameter, self.durationParameter)], "y":[self.parameters[2]]})
	
		self.currentlyRunningExperiment=False
		#self.dspManager = SimpleDSPInterface()
		
	def gainFocus(self):
		if self.hasFocus: return
		self.guiPanel.focusOn(self.parameterInterface)
		FlowChartItems.FlowChartItem.gainFocus(self)

	def playWave(self):
		trialDuration = self.durationParameter.getValue()
		numTrials = int(self.trialParameter.getValue())
		timeBetweenTrials = self.timeBetweenTrials.getValue()
		
		samplingRate = self.dspManager.getSamplingRate()
		
		wave = self.waveInputs[0].createWaveform(samplesPerSecond=samplingRate, durationInSeconds=trialDuration)
		silence = numpy.zeros(timeBetweenTrials*samplingRate)
		
		buffer = numpy.concatenate([silence, wave]*numTrials)
		
		self.dspManager.uploadBuffer(buffer)
		self.dspManager.start()
	def stopWave(self):
		self.dspManager.stop()
		
	def runExperiment(self):
		self.currentlyRunningExperiment=True
		self.playWave()
	
	def stopExperiment(self):
		self.stopWave()
		self.currentlyRunningExperiment=False
Пример #2
0
class Waveform:
	def __init__(self):
		self.frequency = SignalParameter(name="Frequency", type=float, default=5000, range = (0,30000), unit="Hz")
		self.amplitude = SignalParameter(name="Amplitude", type=float, default = 1, range = (0, 2), unit=None)
		
		self.allParameters = self.getAllParameters()
		
		for parameter in self.allParameters.values():
			parameter.bindOnSet(self.makeDirty)
		
		self.funcCallsOnDirty = []
		
		self.isDirty=self.makeDirty()
		Waveform.__init__ = None
	
	def getAllParameters(self):
		parameterDict = {}
		for variableName, variableValue in self.__dict__.iteritems():
			if isinstance(variableValue, SignalParameter):
				parameterName = variableValue.name if variableValue.name != None else variableName
				parameterDict[parameterName] = variableValue
		return parameterDict
	
	def bindOnChange(self, func):
		self.funcCallsOnDirty.append(func)
		
	def makeDirty(self, *args):
		self.isDirty=True
		for call in self.funcCallsOnDirty:
			call()
	
	def makeClean(self):
		self.isDirty=False
		
	def isDirty(self):
		return self.isDirty
		
	def rawWaveform(self, samplesPerSecond=44100, durationInSeconds=.0001):
		amplitude = self.amplitude.getValue()
		frequency = self.frequency.getValue()
		numSamples = int(math.ceil(durationInSeconds*samplesPerSecond))
		toReturn = numpy.array([amplitude * numpy.sin(2*numpy.pi * frequency * i/float(samplesPerSecond)) for i in xrange(numSamples)]) 
		self.makeClean()
		return toReturn