Magnitude Estimation in Pitch Notes
From KubovyLab
Contents |
Tone Specification
We should use only the ascending **pitch notation (i.e., only #, no b).
We take A4 = 440 Hz and a semitone step up as A#4 = 440 * 2^(1/12). A semitone down would be G#4 = 440 / 2^(1/12) .
If we wanted quarter tones we would use A4+50 or A4-50 as Huron's notation suggests.
- Humdrum notation toolkit
- http://dactyl.som.ohio-state.edu/Humdrum/
- The pitch translations
- http://dactyl.som.ohio-state.edu/Humdrum/guide04.html
- Cents to frequency
- http://www.sengpielaudio.com/calculator-centsratio.htm
Range Definitions
Middle C is C4.
- For flexibility, I suggest two lower pitches and two upper ones:
- LT=lowest test pitch
- LV=lowest voice pitch
- likewise for upper (UT, UV).
- The lowest and highest test should be filled automatically to LT = LV - (UV - LV) and UT = UV + (UV - LV), but modifiable.
- Percentage of deviation from chromatic (i.e., a number 0 ≤ d ≤ 50, where 100 = 1 semitone):
- A4+k*d = 440 * 2^(d/(12*100)) where k = {-1,1} with prob = .5 . Default d = 50.
Note names, MIDI numbers, and frequencies
Typical Ranges
(From http://www.vocalist.org.uk/vocal_range_key.html)
- Soprano - High female voice, G3 (below middle C4) to F6 above high C6 although anywhere above high C can be included.
- Coloratura - A singer, usually soprano, who sings ornamental passages in music - C4 to F6 or G6 above high C6
- Lyric Soprano - Warmer middle sound - Bb3 below middle C4 to high C6 or D6
- Dramatic Soprano - The loudest and lowest with cutting power - low Bb3 or A3, to a pushed high C6
- Mezzo-Soprano - Middle female voice with dark quality, Low A3 or G3 (below middle C4) to at least high C although it is not uncommon for high A6 or Bb6 to Eb6 above high C6.
- Alto or Contralto - Low Female Voice, low C3 (below middle C4) to high C6 or up to high A6.
- Tenor - High Male Voice, C (an octave below middle C) up to high C or D (or above).
- Baritone - Middle Male Voice, low G/F an octave below middle C to B, F or G above middle C (just below the Tenor high C).
- Bass - Low Male Voice, low E (or lower) an octave below middle C to E, F G above middle C.
- Basso Profundo - Deep bass voice encompassing about two octaves above C below the bass staff
Untrained singers will have a much more restricted range, but we should count for a singing range of up to 2.5 octaves or so.
- Vocal Range Chart
- http://www.jazzwise.com/catalog/media/vocalchart.pdf
Experiment Design
- Code for generating the trials for each block
for (Float width : _modulusWidths) {
for(boolean inout : new boolean[] {true, false}) {
for(boolean updown : new boolean[] {true, false}) {
_trials.add(Trial.generateRandomTrial(
_session, width, inout, updown));
}
}
}
- Code responsible for generating trials based on selected modulus width, sample region, and sample direction.
/**
* Generate a random trial based on the provided constraints.
*
*
* @param session Current session.
* @param modWidthSemi modulus width to use
* @param sampleInside true if stimulus should fall inside test pitch range,
* false to fall outside test range.
* @param sampleUpward true if stimulus range should fall above center,
* false if below.
* @return Random trial meeting given conditions.
*/
public static Trial generateRandomTrial(
Session session, float modWidthSemi, boolean sampleInside, boolean sampleUpward) {
PitchRange vocalPitchRange = session.getVocalPitchRange();
Pitch center = vocalPitchRange.center();
PitchRange modulus = new PitchRange(center, modWidthSemi);
PitchRange stimulus;
/* This diagram help illustrate the sampling regions selected
* by the code below:
*
* |TL |VL |ML : MU| VU| TU|
* +---------+-------+-----c-----+-------+---------+
* | A | B | C : D | E | F |
*
* TL: test lower TU: test upper
* VL: vocal lower VU: vocal upper
* c: vocal center
* ML: mod. MU: modulus upper
* lower
*
* A->F: potential sampling regions
*/
if(sampleUpward) {
// Sample from region E or F
PitchRange sampleRange;
if(sampleInside) {
// Region E
sampleRange = new PitchRange(modulus.getUpper(), vocalPitchRange.getUpper());
}
else {
// Region F
sampleRange = new PitchRange(vocalPitchRange.getUpper(), session.getTestPitchRange().getUpper());
}
// Stimulus upper is sampled, stimulus lower is ML
stimulus = new PitchRange(modulus.getLower(), sampleRange.randomInRange());
}
else {
// Sample from region A or B
PitchRange sampleRange;
if(sampleInside) {
// Region B
sampleRange = new PitchRange(vocalPitchRange.getLower(), modulus.getLower());
}
else {
// Region A
sampleRange = new PitchRange(session.getTestPitchRange().getLower(), vocalPitchRange.getLower());
}
// Stimulus lower is sampled, stimulus upper is MU
stimulus = new PitchRange(sampleRange.randomInRange(), modulus.getUpper());
}
return new Trial(modulus, stimulus);
}

