Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
	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
Ejemplo n.º 3
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
Ejemplo n.º 4
0
	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
Ejemplo n.º 5
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
Ejemplo n.º 6
0
	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]]})