class PureTone(CarrierSignals.CarrierSignal): """The PureTone Carrier Signal class represents a Sinusoidal waveform. As such, it has the parameters Frequency, Amplitude, and Phase""" def __init__(self, parent, id, pos=(-1,-1), guiPanel=None): CarrierSignals.CarrierSignal.__init__(self, parent, id, pos, guiPanel) self.name = "Pure Tone" self.frequency = SignalParameter(name="Frequency", type=float, default=1000, range = (0,5000), unit="Hz") self.amplitude = SignalParameter(name="Amplitude", type=float, default=50, range = (0, 10), unit="V") self.phase = SignalParameter(name="Phase", type=float, default = 0, range = (-1, 1), unit="radians (pi)") self.rFrequency = SignalParameter(name="Right Ear Frequency", type=float, default=1000, range=(0,5000), unit="Hz", linkable=True) self.lFrequency = SignalParameter(name="Left Ear Frequency", type=float, default=1000, range=(0,5000), unit="Hz", linkable=True) self.rAmplitude = SignalParameter(name="Right Ear Amplitude", type=float, default=50, range = (0, 10), unit="V", linkable=True) self.lAmplitude = SignalParameter(name="Left Ear Amplitude", type=float, default=50, range = (0, 10), unit="V", linkable=True) self.rPhase = SignalParameter(name="Right Ear Phase", type=float, default = 0, range = (-1, 1), unit="radians (pi)", linkable=True) self.lPhase = SignalParameter(name="Left Ear Phase", type=float, default = 0, range = (-1, 1), unit="radians (pi)", linkable=True) self.monoParameters = [self.frequency, self.amplitude, self.phase] self.stereoParameters = self.monoParameters + [self.rFrequency, self.lFrequency, self.rAmplitude, self.lAmplitude, self.rPhase, self.lPhase] self.parameters = self.monoParameters self.setUpView() self.createParameterGUI(defaultAxes = {"xy":[(self.parameters[0], self.parameters[1])], "y":[self.parameters[2]]}) def setupLink(self, linkableParam, linkedParam): def linkDifferenceFunc(linkableParam=linkableParam, linkedParam=linkedParam): return linkableParam.value - linkedParam.value linkableParam.bindLinkDifferenceFunc(linkDifferenceFunc) def changeUnitsWave(self, unit, range=None): self.amplitude.setUnit(unit, range) def setStereo(self, stereo): if stereo == self.stereo: return self.stereo = stereo if self.stereo: self.parameters = self.stereoParameters else: self.parameters = self.monoParameters self.setUpView() self.createParameterGUI(defaultAxes = {"xy":[(self.parameters[3], self.parameters[1])], "y":[self.parameters[2]]}) self.loseFocus() self.gainFocus() def createWaveform(self, samplesPerSecond=44100, durationInSeconds=1, startAtSample=0): freqWaveform = self.parameters[0].createWaveform(samplesPerSecond, durationInSeconds, startAtSample) amplitudeWaveform = self.parameters[1].createWaveform(samplesPerSecond, durationInSeconds, startAtSample) phaseWaveform = numpy.pi * self.parameters[2].createWaveform(samplesPerSecond, durationInSeconds, startAtSample) time = numpy.arange(len(amplitudeWaveform))/float(samplesPerSecond) #print "Freq:",len(freqWaveform),freqWaveform #print "Ampl:", len(amplitudeWaveform),amplitudeWaveform #print "Phase:",len(phaseWaveform), phaseWaveform #print "time:",len(time),time wave = amplitudeWaveform * numpy.sin(2*numpy.pi*freqWaveform*time+phaseWaveform) """f=open('pureAM.csv','w') for i in xrange(len(wave)): f.write(str(wave[i])+'\n') f.close() """ return wave
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
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
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
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
def __init__(self, parent, id, pos=(-1,-1), guiPanel=None): CarrierSignals.CarrierSignal.__init__(self, parent, id, pos, guiPanel) self.name = "Pure Tone" self.frequency = SignalParameter(name="Frequency", type=float, default=1000, range = (0,5000), unit="Hz") self.amplitude = SignalParameter(name="Amplitude", type=float, default=50, range = (0, 10), unit="V") self.phase = SignalParameter(name="Phase", type=float, default = 0, range = (-1, 1), unit="radians (pi)") self.rFrequency = SignalParameter(name="Right Ear Frequency", type=float, default=1000, range=(0,5000), unit="Hz", linkable=True) self.lFrequency = SignalParameter(name="Left Ear Frequency", type=float, default=1000, range=(0,5000), unit="Hz", linkable=True) self.rAmplitude = SignalParameter(name="Right Ear Amplitude", type=float, default=50, range = (0, 10), unit="V", linkable=True) self.lAmplitude = SignalParameter(name="Left Ear Amplitude", type=float, default=50, range = (0, 10), unit="V", linkable=True) self.rPhase = SignalParameter(name="Right Ear Phase", type=float, default = 0, range = (-1, 1), unit="radians (pi)", linkable=True) self.lPhase = SignalParameter(name="Left Ear Phase", type=float, default = 0, range = (-1, 1), unit="radians (pi)", linkable=True) self.monoParameters = [self.frequency, self.amplitude, self.phase] self.stereoParameters = self.monoParameters + [self.rFrequency, self.lFrequency, self.rAmplitude, self.lAmplitude, self.rPhase, self.lPhase] self.parameters = self.monoParameters self.setUpView() self.createParameterGUI(defaultAxes = {"xy":[(self.parameters[0], self.parameters[1])], "y":[self.parameters[2]]})