Is there any legroom left for optimization (without switching to C)? static byte[] generateSound(double frequency, int sampleRate, int samples) { byte output[] = new byte[2 * samples]; int idx = 0; double _tone = 2 * Math.PI / (sampleRate / frequency); for (int i = 0; i < samples; ++i) { double dVal = Math.sin(_tone * i); final short val = (short) ((dVal * 32767)); output[idx++] = (byte) (val & 0x00ff); output[idx++] = (byte) ((val & 0xff00) >>> 8); } return output; }