<commit_before>import Tone from "../core/Tone";
import "../signal/Signal";
import "../source/Source";
import "../core/Transport";
import "../source/OscillatorNode";

/**
 *  @class Tone.Oscillator supports a number of features including
 *         phase rotation, multiple oscillator types (see Tone.Oscillator.type),
 *         and Transport syncing (see Tone.Oscillator.syncFrequency).
 *
 *  @constructor
 *  @extends {Tone.Source}
 *  @param {Frequency} [frequency] Starting frequency
 *  @param {string} [type] The oscillator type. Read more about type below.
 *  @example
 * //make and start a 440hz sine tone
 * var osc = new Tone.Oscillator(440, "sine").toMaster().start();
 */
Tone.Oscillator = function(){

	var options = Tone.defaults(arguments, ["frequency", "type"], Tone.Oscillator);
	Tone.Source.call(this, options);

	/**
	 *  the main oscillator
	 *  @type {OscillatorNode}
	 *  @private
	 */
	this._oscillator = null;

	/**
	 *  The frequency control.
	 *  @type {Frequency}
	 *  @signal
	 */
	this.frequency = new Tone.Signal(options.frequency, Tone.Type.Frequency);

	/**
	 *  The detune control signal.
	 *  @type {Cents}
	 *  @signal
	 */
	this.detune = new Tone.Signal(options.detune, Tone.Type.Cents);

	/**
	 *  the periodic wave
	 *  @type {PeriodicWave}
	 *  @private
	 */
	this._wave = null;

	/**
	 *  The partials of the oscillator
	 *  @type {Array}
	 *  @private
	 */
	this._partials = options.partials;

	/**
	 *  The number of partials to limit or extend the periodic wave by
	 *  @type {Number}
	 *  @private
	 */
	this._partialCount = options.partialCount;

	/**
	 *  the phase of the oscillator
	 *  between 0 - 360
	 *  @type {number}
	 *  @private
	 */
	this._phase = options.phase;

	/**
	 *  the type of the oscillator
	 *  @type {string}
	 *  @private
	 */
	this._type = options.type;

	//setup
	if (options.partialCount && options.type !== Tone.Oscillator.Type.Custom){
		this._type = this.baseType + options.partialCount.toString();
	}
	this.phase = this._phase;
	this._readOnly(["frequency", "detune"]);
};

Tone.extend(Tone.Oscillator, Tone.Source);

/**
 *  the default parameters
 *  @type {Object}
 */
Tone.Oscillator.defaults = {
	"type" : "sine",
	"frequency" : 440,
	"detune" : 0,
	"phase" : 0,
	"partials" : [],
	"partialCount" : 0
};

/**
 *  The Oscillator types
 *  @enum {String}
 */
Tone.Oscillator.Type = {
	Sine : "sine",
	Triangle : "triangle",
	Sawtooth : "sawtooth",
	Square : "square",
	Custom : "custom"
};

/**
 *  start the oscillator
 *  @param  {Time} [time=now]
 *  @private
 */
Tone.Oscillator.prototype._start = function(time){
	this.log("start", time);
	//new oscillator with previous values
	var oscillator = new Tone.OscillatorNode();
	this._oscillator = oscillator;
	if (this._wave){
		this._oscillator.setPeriodicWave(this._wave);
	} else {
		this._oscillator.type = this._type;
	}
	//connect the control signal to the oscillator frequency & detune
	this._oscillator.connect(this.output);
	this.frequency.connect(this._oscillator.frequency);
	this.detune.connect(this._oscillator.detune);

	//disconnect onended
	oscillator.onended = function(){
		//defer the callback for the offline context rendering
		setTimeout(function(){
			this.frequency.disconnect(oscillator.frequency);
			this.detune.disconnect(oscillator.detune);
		}.bind(this), 100);
	}.bind(this);

	//start the oscillator
	time = this.toSeconds(time);
	this._oscillator.start(time);
};

/**
 *  stop the oscillator
 *  @private
 *  @param  {Time} [time=now] (optional) timing parameter
 *  @returns {Tone.Oscillator} this
 */
Tone.Oscillator.prototype._stop = function(time){
	this.log("stop", time);
	if (this._oscillator){
		time = this.toSeconds(time);
		this._oscillator.stop(time);
	}
	return this;
};

/**
 * Restart the oscillator. Does not stop the oscillator, but instead
 * just cancels any scheduled 'stop' from being invoked.
 * @param  {Time=} time
 * @return {Tone.Oscillator}      this
 */
Tone.Oscillator.prototype.restart = function(time){
	if (this._oscillator){
		this._oscillator.cancelStop();
	}
	this._state.cancel(this.toSeconds(time));
	return this;
};

/**
 *  Sync the signal to the Transport's bpm. Any changes to the transports bpm,
 *  will also affect the oscillators frequency.
 *  @returns {Tone.Oscillator} this
 *  @example
 * Tone.Transport.bpm.value = 120;
 * osc.frequency.value = 440;
 * //the ration between the bpm and the frequency will be maintained
 * osc.syncFrequency();
 * Tone.Transport.bpm.value = 240;
 * // the frequency of the oscillator is doubled to 880
 */
Tone.Oscillator.prototype.syncFrequency = function(){
	Tone.Transport.syncSignal(this.frequency);
	return this;
};

/**
 *  Unsync the oscillator's frequency from the Transport.
 *  See Tone.Oscillator.syncFrequency
 *  @returns {Tone.Oscillator} this
 */
Tone.Oscillator.prototype.unsyncFrequency = function(){
	Tone.Transport.unsyncSignal(this.frequency);
	return this;
};

/**
 * The type of the oscillator: either sine, square, triangle, or sawtooth. Also capable of
 * setting the first x number of partials of the oscillator. For example: "sine4" would
 * set be the first 4 partials of the sine wave and "triangle8" would set the first
 * 8 partials of the triangle wave.
 * <br><br>
 * Uses PeriodicWave internally even for native types so that it can set the phase.
 * PeriodicWave equations are from the
 * [Webkit Web Audio implementation](https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/modules/webaudio/PeriodicWave.cpp&sq=package:chromium).
 *
 * @memberOf Tone.Oscillator#
 * @type {string}
 * @name type
 * @example
 * //set it to a square wave
 * osc.type = "square";
 * @example
 * //set the first 6 partials of a sawtooth wave
 * osc.type = "sawtooth6";
 */
Object.defineProperty(Tone.Oscillator.prototype, "type", {
	get : function(){
		return this._type;
	},
	set : function(type){
		var isBasicType = [Tone.Oscillator.Type.Sine, Tone.Oscillator.Type.Square, Tone.Oscillator.Type.Triangle, Tone.Oscillator.Type.Sawtooth].includes(type);
		if (this._phase === 0 && isBasicType){
			this._wave = null;
			this._partialCount = 0;
			//just go with the basic approach
			if (this._oscillator !== null){
				this._oscillator.type === type;
			}
		} else {
			var coefs = this._getRealImaginary(type, this._phase);
			var periodicWave = this.context.createPeriodicWave(coefs[0], coefs[1]);
			this._wave = periodicWave;
			if (this._oscillator !== null){
				this._oscillator.setPeriodicWave(this._wave);
			}
		}
		this._type = type;<commit_msg>fixing typo<commit_after>import Tone from "../core/Tone";
import "../signal/Signal";
import "../source/Source";
import "../core/Transport";
import "../source/OscillatorNode";

/**
 *  @class Tone.Oscillator supports a number of features including
 *         phase rotation, multiple oscillator types (see Tone.Oscillator.type),
 *         and Transport syncing (see Tone.Oscillator.syncFrequency).
 *
 *  @constructor
 *  @extends {Tone.Source}
 *  @param {Frequency} [frequency] Starting frequency
 *  @param {string} [type] The oscillator type. Read more about type below.
 *  @example
 * //make and start a 440hz sine tone
 * var osc = new Tone.Oscillator(440, "sine").toMaster().start();
 */
Tone.Oscillator = function(){

	var options = Tone.defaults(arguments, ["frequency", "type"], Tone.Oscillator);
	Tone.Source.call(this, options);

	/**
	 *  the main oscillator
	 *  @type {OscillatorNode}
	 *  @private
	 */
	this._oscillator = null;

	/**
	 *  The frequency control.
	 *  @type {Frequency}
	 *  @signal
	 */
	this.frequency = new Tone.Signal(options.frequency, Tone.Type.Frequency);

	/**
	 *  The detune control signal.
	 *  @type {Cents}
	 *  @signal
	 */
	this.detune = new Tone.Signal(options.detune, Tone.Type.Cents);

	/**
	 *  the periodic wave
	 *  @type {PeriodicWave}
	 *  @private
	 */
	this._wave = null;

	/**
	 *  The partials of the oscillator
	 *  @type {Array}
	 *  @private
	 */
	this._partials = options.partials;

	/**
	 *  The number of partials to limit or extend the periodic wave by
	 *  @type {Number}
	 *  @private
	 */
	this._partialCount = options.partialCount;

	/**
	 *  the phase of the oscillator
	 *  between 0 - 360
	 *  @type {number}
	 *  @private
	 */
	this._phase = options.phase;

	/**
	 *  the type of the oscillator
	 *  @type {string}
	 *  @private
	 */
	this._type = options.type;

	//setup
	if (options.partialCount && options.type !== Tone.Oscillator.Type.Custom){
		this._type = this.baseType + options.partialCount.toString();
	}
	this.phase = this._phase;
	this._readOnly(["frequency", "detune"]);
};

Tone.extend(Tone.Oscillator, Tone.Source);

/**
 *  the default parameters
 *  @type {Object}
 */
Tone.Oscillator.defaults = {
	"type" : "sine",
	"frequency" : 440,
	"detune" : 0,
	"phase" : 0,
	"partials" : [],
	"partialCount" : 0
};

/**
 *  The Oscillator types
 *  @enum {String}
 */
Tone.Oscillator.Type = {
	Sine : "sine",
	Triangle : "triangle",
	Sawtooth : "sawtooth",
	Square : "square",
	Custom : "custom"
};

/**
 *  start the oscillator
 *  @param  {Time} [time=now]
 *  @private
 */
Tone.Oscillator.prototype._start = function(time){
	this.log("start", time);
	//new oscillator with previous values
	var oscillator = new Tone.OscillatorNode();
	this._oscillator = oscillator;
	if (this._wave){
		this._oscillator.setPeriodicWave(this._wave);
	} else {
		this._oscillator.type = this._type;
	}
	//connect the control signal to the oscillator frequency & detune
	this._oscillator.connect(this.output);
	this.frequency.connect(this._oscillator.frequency);
	this.detune.connect(this._oscillator.detune);

	//disconnect onended
	oscillator.onended = function(){
		//defer the callback for the offline context rendering
		setTimeout(function(){
			this.frequency.disconnect(oscillator.frequency);
			this.detune.disconnect(oscillator.detune);
		}.bind(this), 100);
	}.bind(this);

	//start the oscillator
	time = this.toSeconds(time);
	this._oscillator.start(time);
};

/**
 *  stop the oscillator
 *  @private
 *  @param  {Time} [time=now] (optional) timing parameter
 *  @returns {Tone.Oscillator} this
 */
Tone.Oscillator.prototype._stop = function(time){
	this.log("stop", time);
	if (this._oscillator){
		time = this.toSeconds(time);
		this._oscillator.stop(time);
	}
	return this;
};

/**
 * Restart the oscillator. Does not stop the oscillator, but instead
 * just cancels any scheduled 'stop' from being invoked.
 * @param  {Time=} time
 * @return {Tone.Oscillator}      this
 */
Tone.Oscillator.prototype.restart = function(time){
	if (this._oscillator){
		this._oscillator.cancelStop();
	}
	this._state.cancel(this.toSeconds(time));
	return this;
};

/**
 *  Sync the signal to the Transport's bpm. Any changes to the transports bpm,
 *  will also affect the oscillators frequency.
 *  @returns {Tone.Oscillator} this
 *  @example
 * Tone.Transport.bpm.value = 120;
 * osc.frequency.value = 440;
 * //the ration between the bpm and the frequency will be maintained
 * osc.syncFrequency();
 * Tone.Transport.bpm.value = 240;
 * // the frequency of the oscillator is doubled to 880
 */
Tone.Oscillator.prototype.syncFrequency = function(){
	Tone.Transport.syncSignal(this.frequency);
	return this;
};

/**
 *  Unsync the oscillator's frequency from the Transport.
 *  See Tone.Oscillator.syncFrequency
 *  @returns {Tone.Oscillator} this
 */
Tone.Oscillator.prototype.unsyncFrequency = function(){
	Tone.Transport.unsyncSignal(this.frequency);
	return this;
};

/**
 * The type of the oscillator: either sine, square, triangle, or sawtooth. Also capable of
 * setting the first x number of partials of the oscillator. For example: "sine4" would
 * set be the first 4 partials of the sine wave and "triangle8" would set the first
 * 8 partials of the triangle wave.
 * <br><br>
 * Uses PeriodicWave internally even for native types so that it can set the phase.
 * PeriodicWave equations are from the
 * [Webkit Web Audio implementation](https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/modules/webaudio/PeriodicWave.cpp&sq=package:chromium).
 *
 * @memberOf Tone.Oscillator#
 * @type {string}
 * @name type
 * @example
 * //set it to a square wave
 * osc.type = "square";
 * @example
 * //set the first 6 partials of a sawtooth wave
 * osc.type = "sawtooth6";
 */
Object.defineProperty(Tone.Oscillator.prototype, "type", {
	get : function(){
		return this._type;
	},
	set : function(type){
		var isBasicType = [Tone.Oscillator.Type.Sine, Tone.Oscillator.Type.Square, Tone.Oscillator.Type.Triangle, Tone.Oscillator.Type.Sawtooth].includes(type);
		if (this._phase === 0 && isBasicType){
			this._wave = null;
			this._partialCount = 0;
			//just go with the basic approach
			if (this._oscillator !== null){
				this._oscillator.type = type;
			}
		} else {
			var coefs = this._getRealImaginary(type, this._phase);
			var periodicWave = this.context.createPeriodicWave(coefs[0], coefs[1]);
			this._wave = periodicWave;
			if (this._oscillator !== null){
				this._oscillator.setPeriodicWave(this._wave);
			}
		}
		this._type = type;
{'fraction_non_alphanumeric': 0.1415267175572519, 'fraction_numerical': 0.006259541984732824, 'mean_word_length': 3.6856223175965663, 'pattern_counts': {'":': 0, '<': 7, '<?xml version=': 0, '>': 7, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5867793', 'n_tokens_mistral': 4776, 'n_tokens_neox': 4360, 'n_words': 1102}