Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

/** * The Immutable Class Note. */ public class Note { /** Static Constants */ p

ID: 3882399 • Letter: #

Question

/**

* The Immutable Class Note.

*/

public class Note {

/** Static Constants */

public static final int DEFAULT_INTENSITY = 50;

public static final int REST_PITCH = 128; // First illegal pitch, used for rests.

private static final int PITCHES_PER_OCTAVE = 12;

private static final String[] NOTE_LETTERS = {"c","c#","d","d#","e","f","f#","g","g#","a","a#","b"};

private static final double MIN_DURATION = 1.0/64, // One sixty-fourth

MAX_DURATION = 8.0; // Eight whole notes

/** Fields (Immutable) */

private final String pitch;

private final int midiValue;

private final double duration;

/**

* Instantiates a new note based on a string denoting note letter and octave.

*

* @param pitch the pitch (e.g. "f6")

* @param duration the duration

* @throws NullPointerException if pitch is null

* @throws IllegalArgumentException if:

* 1. The pitch parameter is malformed or out of range.

* 2. The duration parameter is out of range.

*/

public Note(String pitch, double duration) {

// TODO

// Recommended: First implement toMidi(String).

}

/**

* Instantiates a new note based on MIDI value.

*

* @param midiValue the MIDI value (e.g. 68)

* @param duration the duration

* @throws IllegalArgumentException if:

* 1. The MIDI pitch parameter is out of range.

* 2. The duration parameter is out of range.

*/

public Note(int midiValue, double duration) {

// TODO

// Recommended: First implement toPitch(int).

}

/**

* Instantiates a new note from a String matching the format of Note's toString() method.

*

* @param note the string representation

*

* @throws IndexOutOfBoundsException if parameter isn't in correct format

* @throws NumberFormatException if duration representation cannot be parsed as double

* @throws IllegalArgumentException if the elements in the format are not permitted.

*/

public Note(String note) {

this(note.split(" x ")[0], Double.parseDouble(note.split(" x ")[1]));

}

/**

* Converts a pitch string to a MIDI value.

* The pitch "rest" should return {@link #REST_PITCH}.

*

* @param pitch the pitch to convert

* @throws NullPointerException if pitch is null

* @throws IllegalArgumentException is the String is not a legal pitch

* @return the MIDI value

*/

public static int toMidi(String pitch) {

// TODO

return -1;

}

/**

* Converts a MIDI value to a pitch string.

* The MIDI value 128 should return "rest".

*

* @param midiValue the MIDI value to convert

* @throws IllegalArgumentException if the MIDI value is outside of legal range

* @return the pitch string

*/

public static String toPitch(int midiValue) {

// TODO

return null;

}

/**

* Gets the pitch string of this note.

*

* @return the pitch

*/

public String getPitch() { return pitch; }

/**

* Gets the MIDI value of this note.

*

* @return the MIDI value

*/

public int getMidiPitch() { return midiValue; }

/**

* Gets the duration of this note.

*

* @return the duration

*/

public double getDuration() { return duration; }

/**

* Returns a new note with the same pitch, but with its duration multiplied by the parameter.

*

* @param factor the amount to scale by

* @throws IllegalArgumentException if resultant duration is outside of valid range

* @return the stretched note

*/

public Note stretch(double factor) {

// TODO

return null;

}

/**

* Returns a (new) note with the same duration, but transposed by the given interval.

*

* @param interval the interval to transpose by

* @throws IllegalArgumentException if note is transposed beyond valid bounds [c0, g10]

* @return the transposed note

*/

public Note transpose(int interval) {

// TODO

return null;

}

/**

* Returns a string representation of this Note.

* It should follow the format found in songs/InMyLife.song, namely:

* For a Note with pitch "g#4" and duration 1.0625 -> "g#4 x 1.0625"

* NB1: Identical spacing and format are important!

* NB2: For a "rest" note, the same format must be used (including duration).

*

* @return the string representation

*/

@Override

public String toString() {

// TODO

return null;

}

/* (non-Javadoc)

* @see java.lang.Object#equals(java.lang.Object)

*/

@Override

public boolean equals(Object o) {

// TODO: Return equal if the argument is a Note and the midiValue and duration are equal

return false;

}

@Override

public int hashCode() {

// TODO: Compute hash using pieces. (Don't take hash code of strings.)

return -1;

}

}

Explanation / Answer

the code so far modified

public class Note {

/** Static Constants */
public static final int DEFAULT_INTENSITY = 50;
public static final int REST_PITCH = 128; // First illegal pitch, used for rests.
private static final int PITCHES_PER_OCTAVE = 12;
private static final String[] NOTE_LETTERS = {"c","c#","d","d#","e","f","f#","g","g#","a","a#","b"};
private static final double MIN_DURATION = 1.0/64, // One sixty-fourth
MAX_DURATION = 8.0; // Eight whole notes

/** Fields (Immutable) */
private final String pitch;
private final int midiValue;
private final double duration;

/**
* Instantiates a new note based on a string denoting note letter and octave.
*
* @param pitch the pitch (e.g. "f6")
* @param duration the duration
* @throws NullPointerException if pitch is null
* @throws IllegalArgumentException if:
* 1. The pitch parameter is malformed or out of range.
* 2. The duration parameter is out of range.
*/
public Note(String pitch, double duration) {
// TODO
// Recommended: First implement toMidi(String).
}

/**
* Instantiates a new note based on MIDI value.
*
* @param midiValue the MIDI value (e.g. 68)
* @param duration the duration
* @throws IllegalArgumentException if:
* 1. The MIDI pitch parameter is out of range.
* 2. The duration parameter is out of range.
*/
public Note(int midiValue, double duration) {
// TODO
// Recommended: First implement toPitch(int).
}

/**
* Instantiates a new note from a String matching the format of Note's toString() method.
*
* @param note the string representation
*
* @throws IndexOutOfBoundsException if parameter isn't in correct format
* @throws NumberFormatException if duration representation cannot be parsed as double
* @throws IllegalArgumentException if the elements in the format are not permitted.
*/
public Note(String note) {
this(note.split(" x ")[0], Double.parseDouble(note.split(" x ")[1]));
}

/**
* Converts a pitch string to a MIDI value.
* The pitch "rest" should return {@link #REST_PITCH}.
*
* @param pitch the pitch to convert
* @throws NullPointerException if pitch is null
* @throws IllegalArgumentException is the String is not a legal pitch
* @return the MIDI value
*/
public static int toMidi(String pitch) {
// TODO
return -1;
}

/**
* Converts a MIDI value to a pitch string.
* The MIDI value 128 should return "rest".
*
* @param midiValue the MIDI value to convert
* @throws IllegalArgumentException if the MIDI value is outside of legal range
* @return the pitch string
*/
public static String toPitch(int midiValue) {
// TODO
return null;
}

/**
* Gets the pitch string of this note.
*
* @return the pitch
*/
public String getPitch() { return pitch; }

/**
* Gets the MIDI value of this note.
*
* @return the MIDI value
*/
public int getMidiPitch() { return midiValue; }

/**
* Gets the duration of this note.
*
* @return the duration
*/
public double getDuration() { return duration; }

/**
* Returns a new note with the same pitch, but with its duration multiplied by the parameter.
*
* @param factor the amount to scale by
* @throws IllegalArgumentException if resultant duration is outside of valid range
* @return the stretched note
*/
public Note stretch(double factor) {
// TODO
return null;
}

/**
* Returns a (new) note with the same duration, but transposed by the given interval.
*
* @param interval the interval to transpose by
* @throws IllegalArgumentException if note is transposed beyond valid bounds [c0, g10]
* @return the transposed note
*/
public Note transpose(int interval) {
// TODO
return null;
}

/**
* Returns a string representation of this Note.
* It should follow the format found in songs/InMyLife.song, namely:
* For a Note with pitch "g#4" and duration 1.0625 -> "g#4 x 1.0625"
* NB1: Identical spacing and format are important!
* NB2: For a "rest" note, the same format must be used (including duration).
*
* @return the string representation
*/
@Override
public String toString() {
// TODO
return null;
}

/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object o) {
// TODO: Return equal if the argument is a Note and the midiValue and duration are equal
return false;
}

@Override
public int hashCode() {
// TODO: Compute hash using pieces. (Don't take hash code of strings.)
return -1;
}
}