X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fmidi-item.cc;h=33dd9f11bde71fedb14e67b0174fc4b0e277fc1a;hb=84ac019c437ea40b7b18ab46da1772f6db344a83;hp=c17c369dcaf5d42df096f0691be196b4e5413e66;hpb=458bc4053203ec3f916e07dcc50de7f34003d130;p=lilypond.git diff --git a/lily/midi-item.cc b/lily/midi-item.cc index c17c369dca..33dd9f11bd 100644 --- a/lily/midi-item.cc +++ b/lily/midi-item.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Jan Nieuwenhuizen + Copyright (C) 1997--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,12 +21,14 @@ #include "duration.hh" #include "international.hh" +#include "libc-extension.hh" #include "main.hh" #include "midi-stream.hh" #include "misc.hh" #include "program-option.hh" #include "string-convert.hh" #include "warn.hh" +#include "lily-imports.hh" #define PITCH_WHEEL_CENTER 0x2000 #define PITCH_WHEEL_SEMITONE 0X1000 @@ -83,9 +85,8 @@ Midi_instrument::to_string () const Byte program_byte = 0; bool found = false; - SCM proc = ly_lily_module_constant ("midi-program"); - SCM program = scm_call_1 (proc, ly_symbol2scm (audio_->str_.c_str ())); - found = (program != SCM_BOOL_F); + SCM program = Lily::midi_program (ly_symbol2scm (audio_->str_.c_str ())); + found = (scm_is_true (program)); if (found) program_byte = (Byte) scm_to_int (program); else @@ -192,8 +193,10 @@ Midi_time_signature::to_string () const Midi_note::Midi_note (Audio_note *a) : Midi_channel_item (a), audio_ (a), - dynamic_byte_ (a->dynamic_ && a->dynamic_->volume_ >= 0 - ? Byte (a->dynamic_->volume_ * 0x7f) : Byte (0x5a)) + dynamic_byte_ (min (max (Byte ((a->dynamic_ && a->dynamic_->volume_ >= 0 + ? a->dynamic_->volume_ * 0x7f : 0x5a) + + a->extra_velocity_), + Byte (0)), Byte (0x7f))) { } @@ -390,6 +393,7 @@ Midi_control_function_value_change::to_string () const { 8, 40 }, // balance { 10, 42 }, // pan position + { 11, 43 }, // expression { 91, -1 }, // reverb level (only coarse resolution available) { 93, -1 } // chorus level (only coarse resolution available) }; @@ -399,8 +403,12 @@ Midi_control_function_value_change::to_string () const static const Real full_fine_scale = 0x3FFF; static const Real full_coarse_scale = 0x7F; bool fine_resolution = (control_function->lsb_control_number_ >= 0); - int value = lround (value_ * (fine_resolution ? - full_fine_scale : full_coarse_scale)); + // value_ is in range [0.0 .. 1.0]. For directional value ranges, + // #CENTER will correspond to 0.5 exactly, and my_round rounds + // upwards when in case of doubt. That means that center position + // will round to 0x40 or 0x2000 by a hair's breadth. + int value = (int) my_round (value_ * (fine_resolution ? + full_fine_scale : full_coarse_scale)); Byte status_byte = (char) (0xB0 + channel_); str += ::to_string ((char)status_byte); str += ::to_string ((char)(control_function->msb_control_number_)); @@ -418,5 +426,5 @@ Midi_control_function_value_change::to_string () const char const * Midi_item::name () const { - return this->class_name (); + return class_name (); }