annotate base/Pitch.h @ 1394:9ef1cc26024c

Add Range01 normalisation method to ColumnOp. This is the normalisation that is actually used in the Colour 3D Plot layer historically when column normalisation is enabled (not Max1 after all).
author Chris Cannam
date Tue, 28 Feb 2017 14:04:16 +0000
parents 88b54a185a0a
children 48e9f538e6e9
rev   line source
Chris@49 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@19 2
Chris@19 3 /*
Chris@52 4 Sonic Visualiser
Chris@52 5 An audio file viewer and annotation editor.
Chris@52 6 Centre for Digital Music, Queen Mary, University of London.
Chris@52 7 This file copyright 2006 Chris Cannam.
Chris@19 8
Chris@52 9 This program is free software; you can redistribute it and/or
Chris@52 10 modify it under the terms of the GNU General Public License as
Chris@52 11 published by the Free Software Foundation; either version 2 of the
Chris@52 12 License, or (at your option) any later version. See the file
Chris@52 13 COPYING included with this distribution for more information.
Chris@19 14 */
Chris@19 15
Chris@19 16 #ifndef _PITCH_H_
Chris@19 17 #define _PITCH_H_
Chris@19 18
Chris@19 19 #include <QString>
Chris@19 20
Chris@19 21 class Pitch
Chris@19 22 {
Chris@19 23 public:
Chris@274 24 /**
Chris@274 25 * Return the frequency at the given MIDI pitch plus centsOffset
Chris@274 26 * cents (1/100ths of a semitone). centsOffset does not have to
Chris@274 27 * be in any particular range or sign.
Chris@274 28 *
Chris@274 29 * If concertA is non-zero, use that as the reference frequency
Chris@274 30 * for the A at MIDI pitch 69; otherwise use the tuning frequency
Chris@274 31 * specified in the application preferences (default 440Hz).
Chris@274 32 */
Chris@1025 33 static double getFrequencyForPitch(int midiPitch,
Chris@1025 34 double centsOffset = 0,
Chris@1025 35 double concertA = 0.0);
Chris@19 36
Chris@274 37 /**
Chris@274 38 * Return the nearest MIDI pitch to the given frequency.
Chris@274 39 *
Chris@274 40 * If centsOffsetReturn is non-NULL, return in *centsOffsetReturn
Chris@274 41 * the number of cents (1/100ths of a semitone) difference between
Chris@274 42 * the given frequency and that of the returned MIDI pitch. The
Chris@274 43 * cents offset will be in the range [-50,50).
Chris@274 44 *
Chris@274 45 * If concertA is non-zero, use that as the reference frequency
Chris@274 46 * for the A at MIDI pitch 69; otherwise use the tuning frequency
Chris@274 47 * specified in the application preferences (default 440Hz).
Chris@274 48 */
Chris@1025 49 static int getPitchForFrequency(double frequency,
Chris@1025 50 double *centsOffsetReturn = 0,
Chris@1025 51 double concertA = 0.0);
Chris@1025 52
Chris@1025 53 /**
Chris@1025 54 * Compatibility version of getPitchForFrequency accepting float
Chris@1025 55 * pointer argument.
Chris@1025 56 */
Chris@1025 57 static int getPitchForFrequency(double frequency,
Chris@1025 58 float *centsOffsetReturn,
Chris@1025 59 double concertA = 0.0) {
Chris@1025 60 double c;
Chris@1025 61 int p = getPitchForFrequency(frequency, &c, concertA);
Chris@1025 62 if (centsOffsetReturn) *centsOffsetReturn = float(c);
Chris@1025 63 return p;
Chris@1025 64 }
Chris@19 65
Chris@274 66 /**
Chris@373 67 * Return the nearest MIDI pitch range to the given frequency
Chris@373 68 * range, that is, the difference in MIDI pitch values between the
Chris@373 69 * higher and lower frequencies.
Chris@373 70 *
Chris@373 71 * If centsOffsetReturn is non-NULL, return in *centsOffsetReturn
Chris@373 72 * the number of cents (1/100ths of a semitone) difference between
Chris@373 73 * the given frequency difference and the returned MIDI pitch
Chris@373 74 * range. The cents offset will be in the range [-50,50).
Chris@373 75 *
Chris@373 76 * If concertA is non-zero, use that as the reference frequency
Chris@373 77 * for the A at MIDI pitch 69; otherwise use the tuning frequency
Chris@373 78 * specified in the application preferences (default 440Hz).
Chris@373 79 */
Chris@1025 80 static int getPitchForFrequencyDifference(double frequencyA,
Chris@1025 81 double frequencyB,
Chris@1025 82 double *centsOffsetReturn = 0,
Chris@1025 83 double concertA = 0.0);
Chris@373 84
Chris@373 85 /**
Chris@1025 86 * Compatibility version of getPitchForFrequencyDifference
Chris@1025 87 * accepting float pointer argument.
Chris@1025 88 */
Chris@1025 89 static int getPitchForFrequencyDifference(double frequencyA,
Chris@1025 90 double frequencyB,
Chris@1025 91 float *centsOffsetReturn,
Chris@1025 92 double concertA = 0.0) {
Chris@1025 93 double c;
Chris@1025 94 int p = getPitchForFrequencyDifference(frequencyA, frequencyB,
Chris@1025 95 &c, concertA);
Chris@1025 96 if (centsOffsetReturn) *centsOffsetReturn = float(c);
Chris@1025 97 return p;
Chris@1025 98 }
Chris@1025 99
Chris@1025 100 /**
Chris@1024 101 * Return the MIDI pitch for the given note number (0-12 where 0
Chris@1024 102 * is C) and octave number. The octave numbering system is based
Chris@1024 103 * on the application preferences (default is C4 = middle C,
Chris@1024 104 * though in previous SV releases that was C3).
Chris@1024 105 */
Chris@1024 106 static int getPitchForNoteAndOctave(int note, int octave);
Chris@1024 107
Chris@1024 108 /**
Chris@1024 109 * Return the note number (0-12 where 0 is C) and octave number
Chris@1024 110 * for the given MIDI pitch. The octave numbering system is based
Chris@1024 111 * on the application preferences (default is C4 = middle C,
Chris@1024 112 * though in previous SV releases that was C3).
Chris@1024 113 */
Chris@1024 114 static void getNoteAndOctaveForPitch(int midiPitch, int &note, int &octave);
Chris@1024 115
Chris@1024 116 /**
Chris@274 117 * Return a string describing the given MIDI pitch, with optional
Chris@892 118 * cents offset. This consists of the note name, octave number,
Chris@892 119 * and optional cents. The octave numbering system is based on the
Chris@892 120 * application preferences (default is C4 = middle C, though in
Chris@892 121 * previous SV releases that was C3).
Chris@274 122 *
Chris@274 123 * For example, "A#3" (A# in octave 3) or "C2-12c" (C in octave 2,
Chris@274 124 * minus 12 cents).
Chris@274 125 *
Chris@274 126 * If useFlats is true, spell notes with flats instead of sharps,
Chris@274 127 * e.g. Bb3 instead of A#3.
Chris@274 128 */
Chris@19 129 static QString getPitchLabel(int midiPitch,
Chris@1025 130 double centsOffset = 0,
Chris@26 131 bool useFlats = false);
Chris@1023 132
Chris@274 133 /**
Chris@274 134 * Return a string describing the nearest MIDI pitch to the given
Chris@274 135 * frequency, with cents offset.
Chris@274 136 *
Chris@274 137 * If concertA is non-zero, use that as the reference frequency
Chris@274 138 * for the A at MIDI pitch 69; otherwise use the tuning frequency
Chris@274 139 * specified in the application preferences (default 440Hz).
Chris@274 140 *
Chris@274 141 * If useFlats is true, spell notes with flats instead of sharps,
Chris@274 142 * e.g. Bb3 instead of A#3.
Chris@274 143 */
Chris@1025 144 static QString getPitchLabelForFrequency(double frequency,
Chris@1025 145 double concertA = 0.0,
Chris@26 146 bool useFlats = false);
Chris@274 147
Chris@274 148 /**
Chris@373 149 * Return a string describing the given pitch range in octaves,
Chris@373 150 * semitones and cents. This is in the form e.g. "1'2+4c".
Chris@373 151 */
Chris@1025 152 static QString getLabelForPitchRange(int semis, double cents = 0);
Chris@373 153
Chris@373 154 /**
Chris@274 155 * Return true if the given frequency falls within the range of
Chris@274 156 * MIDI note pitches, plus or minus half a semitone. This is
Chris@274 157 * equivalent to testing whether getPitchForFrequency returns a
Chris@274 158 * pitch in the MIDI range (0 to 127 inclusive) with any cents
Chris@274 159 * offset.
Chris@274 160 *
Chris@274 161 * If concertA is non-zero, use that as the reference frequency
Chris@274 162 * for the A at MIDI pitch 69; otherwise use the tuning frequency
Chris@274 163 * specified in the application preferences (default 440Hz).
Chris@274 164 */
Chris@1025 165 static bool isFrequencyInMidiRange(double frequency,
Chris@1025 166 double concertA = 0.0);
Chris@19 167 };
Chris@19 168
Chris@19 169
Chris@19 170 #endif