⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 noisegenerator.java

📁 一个用java写成的gb模拟器的源代码。
💻 JAVA
字号:
/*

JavaBoy
                                  
COPYRIGHT (C) 2001 Neil Millstone and The Victoria University of Manchester
                                                                         ;;;
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2 of the License, or (at your option)
any later version.        

This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
more details.


You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place - Suite 330, Boston, MA 02111-1307, USA.

*/

/** This is a white noise generator.  It is used to emulate
 *  channel 4.
 */

class NoiseGenerator {
	/** Indicates sound is to be played on the left channel of a stereo sound */
	public static final int CHAN_LEFT = 1;

	/** Indictaes sound is to be played on the right channel of a stereo sound */
	public static final int CHAN_RIGHT = 2;

	/** Indicates that sound is mono */
	public static final int CHAN_MONO = 4;

	/** Indicates the length of the sound in frames */
	int totalLength;
	int cyclePos;

	/** The length of one cycle, in samples */
	int cycleLength;

	/** Amplitude of the wave function */
	int amplitude;

	/** Channel being played on.  Combination of CHAN_LEFT and CHAN_RIGHT, or CHAN_MONO */
	int channel;

	/** Sampling rate of the output channel */
	int sampleRate;

	/** Initial value of the envelope */
	int initialEnvelope;

	int numStepsEnvelope;

	/** Whether the envelope is an increase/decrease in amplitude */
	boolean increaseEnvelope;

	int counterEnvelope;

	/** Creates a white noise generator with the specified wavelength, amplitude, channel, and sample rate */
	public NoiseGenerator(int waveLength, int ampl, int chan, int rate) {
		cycleLength = waveLength;
		amplitude = ampl;
		cyclePos = 0;
		channel = chan;
		sampleRate = rate;
	}

	/** Creates a white noise generator with the specified sample rate */
	public NoiseGenerator(int rate) {
		cyclePos = 0;
		channel = CHAN_LEFT | CHAN_RIGHT;
		cycleLength = 2;
		totalLength = 0;
		sampleRate = rate;
		amplitude = 32;
	}

	public void setSampleRate(int sr) {
		sampleRate = sr;
	}

	/** Set the channel that the white noise is playing on */
	public void setChannel(int chan) {
		channel = chan;
	}

	/** Setup the envelope, and restart it from the beginning */
	public void setEnvelope(int initialValue, int numSteps, boolean increase) {
		initialEnvelope = initialValue;
		numStepsEnvelope = numSteps;
		increaseEnvelope = increase;
		amplitude = initialValue * 2;
	}

	public int getLength() {
		return totalLength;
	}
	
	/** Set the length of the sound */
	public void setLength(int gbLength) {
		if (gbLength == -1) {
			totalLength = -1;
		} else {
			totalLength = (64 - gbLength) / 4;
		}
	}

	/** Output a single frame of samples, of specified length.  Start at position indicated in the
	 *  output array.
	 */
	public void play(byte[] b, int length, int offset) {
		int val;

		if (totalLength != 0) {
			totalLength--;

			counterEnvelope++;
			if (numStepsEnvelope != 0) {
				if (((counterEnvelope % numStepsEnvelope) == 0)
					&& (amplitude > 0)) {
					if (!increaseEnvelope) {
						if (amplitude > 0)
							amplitude -= 2;
					} else {
						if (amplitude < 16)
							amplitude += 2;
					}
				}
			}
			for (int r = offset; r < offset + length; r++) {
				val = (int) ((Math.random() * amplitude * 2) - amplitude);

				if ((channel & CHAN_LEFT) != 0)
					b[r * 2] += val;
				if ((channel & CHAN_RIGHT) != 0)
					b[r * 2 + 1] += val;
				if ((channel & CHAN_MONO) != 0)
					b[r] += val;

				//   System.out.print(val + " ");

				cyclePos = (cyclePos + 256) % cycleLength;

			}
		}
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -