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
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