docs: def modulate(data):
  	'''
  	Generate Bell 202 AFSK samples for the given symbol generator
  
  	Consumes raw wire symbols and produces the corresponding AFSK samples. 
  	'''
  	seconds_per_sample = 1.0 / audiogen.sampler.FRAME_RATE
  	phase, seconds, bits = 0, 0, 0
  
  	# construct generators
  	clock = (x / BAUD_RATE for x in itertools.count(1))
  	tones = (MARK_HZ if bit else SPACE_HZ for bit in data)
  
  	for boundary, frequency in itertools.izip(clock, tones):
  		# frequency of current symbol is determined by how much 
  		# we advance the signal's phase in each audio frame
  		phase_change_per_sample = TWO_PI / (audiogen.sampler.FRAME_RATE / frequency)
  
  		# produce samples for the current symbol 
  		# until we reach the next clock boundary
  		while seconds < boundary:
  			yield math.sin(phase)
  
  			seconds += seconds_per_sample
  			phase += phase_change_per_sample
  
  			if phase > TWO_PI:
  				phase -= TWO_PI
  
  		bits += 1
  		logger.debug("bits = %d, time = %.7f ms, expected time = %.7f ms, error = %.7f ms, baud rate = %.6f Hz" \
  			% (bits, 1000 * seconds, 1000 * bits / BAUD_RATE, 1000 * (seconds - bits / BAUD_RATE), bits / seconds))