source file of the GNU LilyPond music typesetter
- (c) 1997--2003 Jan Nieuwenhuizen <janneke@gnu.org>
+ (c) 1997--2004 Jan Nieuwenhuizen <janneke@gnu.org>
*/
#include "warn.hh"
#include "killing-cons.tcc"
+#define PITCH_WHEEL_TOP 0x3FFF
+#define PITCH_WHEEL_CENTER 0x2000
+#define PITCH_WHEEL_BOTTOM 0x0000
+#define PITCH_WHEEL_RANGE (PITCH_WHEEL_TOP - PITCH_WHEEL_BOTTOM)
+
Midi_item*
Midi_item::get_midi (Audio_item* a)
{
if (found)
program_byte = gh_scm2int(program);
else
- warning (_f ("no such instrument: `%s'", audio_->str_.to_str0 ()));
+ warning (_f ("no such MIDI instrument: `%s'", audio_->str_.to_str0 ()));
String str = ::to_string ((char) (0xc0 + channel_)); //YIKES! FIXME: Should be track. -rz
str += ::to_string ((char)program_byte);
Midi_note::get_length () const
{
Moment m = audio_->length_mom_;
-#if 0
- //junkme?
- if (m < Moment (Rational (1, 1000)))
- {
- warning (_ ("silly duration"));
- m = 1;
- }
-#endif
return m;
}
+int
+Midi_note::get_fine_tuning () const
+{
+ int ft = audio_->pitch_.quartertone_pitch ();
+ ft -= 2 * audio_->pitch_.semitone_pitch();
+ ft *= 50; // 1 quarter tone = 50 cents
+ return ft;
+}
+
int
Midi_note::get_pitch () const
{
Midi_note::to_string () const
{
Byte status_byte = (char) (0x90 + channel_);
+ String str = "";
+ int finetune;
- String str = ::to_string ((char)status_byte);
- str += ::to_string ((char) (get_pitch () + c0_pitch_i_));
+ // print warning if fine tuning was needed, HJJ
+ if (get_fine_tuning () != 0)
+ {
+ warning (_f ("Experimental: temporarily fine tuning (of %d cents) a channel.",
+ get_fine_tuning ()));
+
+ finetune = PITCH_WHEEL_CENTER;
+ // Move pitch wheel to a shifted position.
+ // The pitch wheel range (of 4 semitones) is multiplied by the cents.
+ finetune += (PITCH_WHEEL_RANGE * get_fine_tuning ()) / (4 * 100);
+
+ str += ::to_string ((char) (0xE0 + channel_));
+ str += ::to_string ((char) (finetune & 0x7F));
+ str += ::to_string ((char) (finetune >> 7));
+ str += ::to_string ((char) (0x00));
+ }
+ str += ::to_string ((char)status_byte);
+ str += ::to_string ((char) (get_pitch () + c0_pitch_i_));
str += ::to_string ((char)dynamic_byte_);
+
return str;
}
String str = ::to_string ((char)status_byte);
str += ::to_string ((char) (get_pitch () + Midi_note::c0_pitch_i_));
str += ::to_string ((char)aftertouch_byte_);
+
+ if (get_fine_tuning () != 0)
+ {
+ // Move pitch wheel back to the central position.
+ str += ::to_string ((char) 0x00);
+ str += ::to_string ((char) (0xE0 + channel_));
+ str += ::to_string ((char) (PITCH_WHEEL_CENTER & 0x7F));
+ str += ::to_string ((char) (PITCH_WHEEL_CENTER >> 7));
+ }
+
return str;
}