mirror of
https://github.com/ZDoom/fluidsynth.git
synced 2024-11-27 06:22:06 +00:00
Merge branch '2.2.x' into master
This commit is contained in:
commit
a0ca05e16d
13 changed files with 130 additions and 83 deletions
|
@ -31,7 +31,7 @@ variables:
|
||||||
toolset: 'v142'
|
toolset: 'v142'
|
||||||
generator: 'Visual Studio 16 2019'
|
generator: 'Visual Studio 16 2019'
|
||||||
configuration: 'RelWithDebInfo'
|
configuration: 'RelWithDebInfo'
|
||||||
VCPKG_REVISION: 'e6dcc079c81161786eb7b052209a2047e79f2c6c'
|
VCPKG_REVISION: 'e809a42f87565e803b2178a0c11263f462d1800a'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
- job: vcpkg
|
- job: vcpkg
|
||||||
|
|
|
@ -24,11 +24,15 @@ jobs:
|
||||||
gtk-bundle: $(gtk-bundle-x86)
|
gtk-bundle: $(gtk-bundle-x86)
|
||||||
libsndfile-url: $(libsndfile-url-x86)
|
libsndfile-url: $(libsndfile-url-x86)
|
||||||
artifact-prefix: "fluidsynth"
|
artifact-prefix: "fluidsynth"
|
||||||
|
CFLAGS: "/arch:IA32"
|
||||||
|
CXXFLAGS: "/arch:IA32"
|
||||||
x64:
|
x64:
|
||||||
platform: x64
|
platform: x64
|
||||||
gtk-bundle: $(gtk-bundle-x64)
|
gtk-bundle: $(gtk-bundle-x64)
|
||||||
libsndfile-url: $(libsndfile-url-x64)
|
libsndfile-url: $(libsndfile-url-x64)
|
||||||
artifact-prefix: "fluidsynth"
|
artifact-prefix: "fluidsynth"
|
||||||
|
CFLAGS: ""
|
||||||
|
CXXFLAGS: ""
|
||||||
pool:
|
pool:
|
||||||
vmImage: 'windows-2019'
|
vmImage: 'windows-2019'
|
||||||
steps:
|
steps:
|
||||||
|
@ -38,7 +42,7 @@ jobs:
|
||||||
# https://dev.azure.com/tommbrt/_apis/projects?api-version=5.0
|
# https://dev.azure.com/tommbrt/_apis/projects?api-version=5.0
|
||||||
project: 'd3638885-de4a-4ce7-afe7-f237ae461c07'
|
project: 'd3638885-de4a-4ce7-afe7-f237ae461c07'
|
||||||
pipeline: 1
|
pipeline: 1
|
||||||
artifactName: libinstpatch-$(platform)
|
artifactName: libinstpatch-XP-$(platform)
|
||||||
downloadPath: '$(Build.ArtifactStagingDirectory)'
|
downloadPath: '$(Build.ArtifactStagingDirectory)'
|
||||||
displayName: 'Get libinstpatch'
|
displayName: 'Get libinstpatch'
|
||||||
- script: |
|
- script: |
|
||||||
|
@ -52,11 +56,11 @@ jobs:
|
||||||
REM need to fix the naming of libsndfile otherwise the linker won't find it
|
REM need to fix the naming of libsndfile otherwise the linker won't find it
|
||||||
mv lib\libsndfile-1.lib lib\sndfile.lib || exit -1
|
mv lib\libsndfile-1.lib lib\sndfile.lib || exit -1
|
||||||
mv lib\libsndfile-1.def lib\sndfile.def || exit -1
|
mv lib\libsndfile-1.def lib\sndfile.def || exit -1
|
||||||
cd $(Build.ArtifactStagingDirectory)\libinstpatch-$(platform)
|
cd $(Build.ArtifactStagingDirectory)\libinstpatch-XP-$(platform)
|
||||||
cp -rf * d:\deps\
|
cp -rf * d:\deps\
|
||||||
mv -f * ..
|
mv -f * ..
|
||||||
cd ..
|
cd ..
|
||||||
rmdir $(Build.ArtifactStagingDirectory)\libinstpatch-$(platform)\
|
rmdir $(Build.ArtifactStagingDirectory)\libinstpatch-XP-$(platform)\
|
||||||
DEL /F C:\Strawberry\perl\bin\pkg-config.bat
|
DEL /F C:\Strawberry\perl\bin\pkg-config.bat
|
||||||
displayName: 'Prerequisites'
|
displayName: 'Prerequisites'
|
||||||
- script: |
|
- script: |
|
||||||
|
|
|
@ -41,7 +41,7 @@ set ( PACKAGE "fluidsynth" )
|
||||||
# FluidSynth package version
|
# FluidSynth package version
|
||||||
set ( FLUIDSYNTH_VERSION_MAJOR 2 )
|
set ( FLUIDSYNTH_VERSION_MAJOR 2 )
|
||||||
set ( FLUIDSYNTH_VERSION_MINOR 2 )
|
set ( FLUIDSYNTH_VERSION_MINOR 2 )
|
||||||
set ( FLUIDSYNTH_VERSION_MICRO 5 )
|
set ( FLUIDSYNTH_VERSION_MICRO 6 )
|
||||||
set ( VERSION "${FLUIDSYNTH_VERSION_MAJOR}.${FLUIDSYNTH_VERSION_MINOR}.${FLUIDSYNTH_VERSION_MICRO}" )
|
set ( VERSION "${FLUIDSYNTH_VERSION_MAJOR}.${FLUIDSYNTH_VERSION_MINOR}.${FLUIDSYNTH_VERSION_MICRO}" )
|
||||||
set ( FLUIDSYNTH_VERSION "\"${VERSION}\"" )
|
set ( FLUIDSYNTH_VERSION "\"${VERSION}\"" )
|
||||||
|
|
||||||
|
@ -56,7 +56,7 @@ set ( FLUIDSYNTH_VERSION "\"${VERSION}\"" )
|
||||||
# This is not exactly the same algorithm as the libtool one, but the results are the same.
|
# This is not exactly the same algorithm as the libtool one, but the results are the same.
|
||||||
set ( LIB_VERSION_CURRENT 3 )
|
set ( LIB_VERSION_CURRENT 3 )
|
||||||
set ( LIB_VERSION_AGE 0 )
|
set ( LIB_VERSION_AGE 0 )
|
||||||
set ( LIB_VERSION_REVISION 5 )
|
set ( LIB_VERSION_REVISION 6 )
|
||||||
set ( LIB_VERSION_INFO
|
set ( LIB_VERSION_INFO
|
||||||
"${LIB_VERSION_CURRENT}.${LIB_VERSION_AGE}.${LIB_VERSION_REVISION}" )
|
"${LIB_VERSION_CURRENT}.${LIB_VERSION_AGE}.${LIB_VERSION_REVISION}" )
|
||||||
|
|
||||||
|
|
|
@ -8,8 +8,8 @@
|
||||||
\author David Henningsson
|
\author David Henningsson
|
||||||
\author Tom Moebert
|
\author Tom Moebert
|
||||||
\author Copyright © 2003-2022 Peter Hanappe, Conrad Berhörster, Antoine Schmitt, Pedro López-Cabanillas, Josh Green, David Henningsson, Tom Moebert
|
\author Copyright © 2003-2022 Peter Hanappe, Conrad Berhörster, Antoine Schmitt, Pedro López-Cabanillas, Josh Green, David Henningsson, Tom Moebert
|
||||||
\version Revision 2.2.5
|
\version Revision 2.2.6
|
||||||
\date 2022-01-16
|
\date 2022-03-19
|
||||||
|
|
||||||
All the source code examples in this document are in the public domain; you can use them as you please. This document is licensed under the Creative Commons Attribution-Share Alike 3.0 Unported License. To view a copy of this license, visit https://creativecommons.org/licenses/by-sa/3.0/ . The FluidSynth library is distributed under the GNU Lesser General Public License. A copy of the GNU Lesser General Public License is contained in the FluidSynth package; if not, visit https://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt or write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
All the source code examples in this document are in the public domain; you can use them as you please. This document is licensed under the Creative Commons Attribution-Share Alike 3.0 Unported License. To view a copy of this license, visit https://creativecommons.org/licenses/by-sa/3.0/ . The FluidSynth library is distributed under the GNU Lesser General Public License. A copy of the GNU Lesser General Public License is contained in the FluidSynth package; if not, visit https://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt or write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,12 @@
|
||||||
/*!
|
/*!
|
||||||
|
|
||||||
\page RecentChanges Recent Changes
|
\page RecentChanges Recent Changes
|
||||||
|
\section NewIn2_2_7 What's new in 2.2.7?
|
||||||
|
|
||||||
|
- Most getter functions of the MIDI event API are now const correct
|
||||||
|
- fluid_event_from_midi_event() has been added
|
||||||
|
|
||||||
|
|
||||||
\section NewIn2_2_0 What's new in 2.2.0?
|
\section NewIn2_2_0 What's new in 2.2.0?
|
||||||
|
|
||||||
- #fluid_file_callbacks_t <span style="color:red">now uses <code>long long</code> as file-offset type (see #fluid_long_long_t).</span><span style="color:red;font-weight:bold">This is a breaking change</span>, which allows to load SoundFonts bigger than 2GiB on Windows. This change required to bump fluidsynth's SOVERSION.
|
- #fluid_file_callbacks_t <span style="color:red">now uses <code>long long</code> as file-offset type (see #fluid_long_long_t).</span><span style="color:red;font-weight:bold">This is a breaking change</span>, which allows to load SoundFonts bigger than 2GiB on Windows. This change required to bump fluidsynth's SOVERSION.
|
||||||
|
|
|
@ -117,6 +117,7 @@ FLUIDSYNTH_API void fluid_event_system_reset(fluid_event_t *evt);
|
||||||
FLUIDSYNTH_API void fluid_event_unregistering(fluid_event_t *evt);
|
FLUIDSYNTH_API void fluid_event_unregistering(fluid_event_t *evt);
|
||||||
|
|
||||||
FLUIDSYNTH_API void fluid_event_scale(fluid_event_t *evt, double new_scale);
|
FLUIDSYNTH_API void fluid_event_scale(fluid_event_t *evt, double new_scale);
|
||||||
|
FLUIDSYNTH_API int fluid_event_from_midi_event(fluid_event_t *, const fluid_midi_event_t *);
|
||||||
|
|
||||||
/* Accessing event data */
|
/* Accessing event data */
|
||||||
FLUIDSYNTH_API int fluid_event_get_type(fluid_event_t *evt);
|
FLUIDSYNTH_API int fluid_event_get_type(fluid_event_t *evt);
|
||||||
|
|
|
@ -114,20 +114,20 @@ FLUIDSYNTH_API void delete_fluid_midi_event(fluid_midi_event_t *event);
|
||||||
/** @endlifecycle */
|
/** @endlifecycle */
|
||||||
|
|
||||||
FLUIDSYNTH_API int fluid_midi_event_set_type(fluid_midi_event_t *evt, int type);
|
FLUIDSYNTH_API int fluid_midi_event_set_type(fluid_midi_event_t *evt, int type);
|
||||||
FLUIDSYNTH_API int fluid_midi_event_get_type(fluid_midi_event_t *evt);
|
FLUIDSYNTH_API int fluid_midi_event_get_type(const fluid_midi_event_t *evt);
|
||||||
FLUIDSYNTH_API int fluid_midi_event_set_channel(fluid_midi_event_t *evt, int chan);
|
FLUIDSYNTH_API int fluid_midi_event_set_channel(fluid_midi_event_t *evt, int chan);
|
||||||
FLUIDSYNTH_API int fluid_midi_event_get_channel(fluid_midi_event_t *evt);
|
FLUIDSYNTH_API int fluid_midi_event_get_channel(const fluid_midi_event_t *evt);
|
||||||
FLUIDSYNTH_API int fluid_midi_event_get_key(fluid_midi_event_t *evt);
|
FLUIDSYNTH_API int fluid_midi_event_get_key(const fluid_midi_event_t *evt);
|
||||||
FLUIDSYNTH_API int fluid_midi_event_set_key(fluid_midi_event_t *evt, int key);
|
FLUIDSYNTH_API int fluid_midi_event_set_key(fluid_midi_event_t *evt, int key);
|
||||||
FLUIDSYNTH_API int fluid_midi_event_get_velocity(fluid_midi_event_t *evt);
|
FLUIDSYNTH_API int fluid_midi_event_get_velocity(const fluid_midi_event_t *evt);
|
||||||
FLUIDSYNTH_API int fluid_midi_event_set_velocity(fluid_midi_event_t *evt, int vel);
|
FLUIDSYNTH_API int fluid_midi_event_set_velocity(fluid_midi_event_t *evt, int vel);
|
||||||
FLUIDSYNTH_API int fluid_midi_event_get_control(fluid_midi_event_t *evt);
|
FLUIDSYNTH_API int fluid_midi_event_get_control(const fluid_midi_event_t *evt);
|
||||||
FLUIDSYNTH_API int fluid_midi_event_set_control(fluid_midi_event_t *evt, int ctrl);
|
FLUIDSYNTH_API int fluid_midi_event_set_control(fluid_midi_event_t *evt, int ctrl);
|
||||||
FLUIDSYNTH_API int fluid_midi_event_get_value(fluid_midi_event_t *evt);
|
FLUIDSYNTH_API int fluid_midi_event_get_value(const fluid_midi_event_t *evt);
|
||||||
FLUIDSYNTH_API int fluid_midi_event_set_value(fluid_midi_event_t *evt, int val);
|
FLUIDSYNTH_API int fluid_midi_event_set_value(fluid_midi_event_t *evt, int val);
|
||||||
FLUIDSYNTH_API int fluid_midi_event_get_program(fluid_midi_event_t *evt);
|
FLUIDSYNTH_API int fluid_midi_event_get_program(const fluid_midi_event_t *evt);
|
||||||
FLUIDSYNTH_API int fluid_midi_event_set_program(fluid_midi_event_t *evt, int val);
|
FLUIDSYNTH_API int fluid_midi_event_set_program(fluid_midi_event_t *evt, int val);
|
||||||
FLUIDSYNTH_API int fluid_midi_event_get_pitch(fluid_midi_event_t *evt);
|
FLUIDSYNTH_API int fluid_midi_event_get_pitch(const fluid_midi_event_t *evt);
|
||||||
FLUIDSYNTH_API int fluid_midi_event_set_pitch(fluid_midi_event_t *evt, int val);
|
FLUIDSYNTH_API int fluid_midi_event_set_pitch(fluid_midi_event_t *evt, int val);
|
||||||
FLUIDSYNTH_API int fluid_midi_event_set_sysex(fluid_midi_event_t *evt, void *data,
|
FLUIDSYNTH_API int fluid_midi_event_set_sysex(fluid_midi_event_t *evt, void *data,
|
||||||
int size, int dynamic);
|
int size, int dynamic);
|
||||||
|
|
|
@ -34,8 +34,8 @@ extern "C" {
|
||||||
*/
|
*/
|
||||||
FLUIDSYNTH_API
|
FLUIDSYNTH_API
|
||||||
fluid_seq_id_t fluid_sequencer_register_fluidsynth(fluid_sequencer_t *seq, fluid_synth_t *synth);
|
fluid_seq_id_t fluid_sequencer_register_fluidsynth(fluid_sequencer_t *seq, fluid_synth_t *synth);
|
||||||
FLUIDSYNTH_API int
|
FLUIDSYNTH_API
|
||||||
fluid_sequencer_add_midi_event_to_buffer(void *data, fluid_midi_event_t *event);
|
int fluid_sequencer_add_midi_event_to_buffer(void *data, fluid_midi_event_t *event);
|
||||||
/* @} */
|
/* @} */
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -39,7 +39,6 @@
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
fluid_audio_driver_t driver;
|
fluid_audio_driver_t driver;
|
||||||
fluid_audio_func_t callback;
|
|
||||||
void *data;
|
void *data;
|
||||||
fluid_file_renderer_t *renderer;
|
fluid_file_renderer_t *renderer;
|
||||||
int period_size;
|
int period_size;
|
||||||
|
@ -49,7 +48,7 @@ typedef struct
|
||||||
} fluid_file_audio_driver_t;
|
} fluid_file_audio_driver_t;
|
||||||
|
|
||||||
|
|
||||||
static int fluid_file_audio_run_s16(void *d, unsigned int msec);
|
static int fluid_file_audio_run(void *d, unsigned int msec);
|
||||||
|
|
||||||
/**************************************************************
|
/**************************************************************
|
||||||
*
|
*
|
||||||
|
@ -78,7 +77,6 @@ new_fluid_file_audio_driver(fluid_settings_t *settings,
|
||||||
fluid_settings_getnum(settings, "synth.sample-rate", &dev->sample_rate);
|
fluid_settings_getnum(settings, "synth.sample-rate", &dev->sample_rate);
|
||||||
|
|
||||||
dev->data = synth;
|
dev->data = synth;
|
||||||
dev->callback = (fluid_audio_func_t) fluid_synth_process;
|
|
||||||
dev->samples = 0;
|
dev->samples = 0;
|
||||||
|
|
||||||
dev->renderer = new_fluid_file_renderer(synth);
|
dev->renderer = new_fluid_file_renderer(synth);
|
||||||
|
@ -89,7 +87,7 @@ new_fluid_file_audio_driver(fluid_settings_t *settings,
|
||||||
}
|
}
|
||||||
|
|
||||||
msec = (int)(0.5 + dev->period_size / dev->sample_rate * 1000.0);
|
msec = (int)(0.5 + dev->period_size / dev->sample_rate * 1000.0);
|
||||||
dev->timer = new_fluid_timer(msec, fluid_file_audio_run_s16, (void *) dev, TRUE, FALSE, TRUE);
|
dev->timer = new_fluid_timer(msec, fluid_file_audio_run, (void *) dev, TRUE, FALSE, TRUE);
|
||||||
|
|
||||||
if(dev->timer == NULL)
|
if(dev->timer == NULL)
|
||||||
{
|
{
|
||||||
|
@ -115,7 +113,7 @@ void delete_fluid_file_audio_driver(fluid_audio_driver_t *p)
|
||||||
FLUID_FREE(dev);
|
FLUID_FREE(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fluid_file_audio_run_s16(void *d, unsigned int clock_time)
|
static int fluid_file_audio_run(void *d, unsigned int clock_time)
|
||||||
{
|
{
|
||||||
fluid_file_audio_driver_t *dev = (fluid_file_audio_driver_t *) d;
|
fluid_file_audio_driver_t *dev = (fluid_file_audio_driver_t *) d;
|
||||||
unsigned int sample_time;
|
unsigned int sample_time;
|
||||||
|
|
|
@ -1106,7 +1106,7 @@ delete_fluid_midi_event(fluid_midi_event_t *evt)
|
||||||
* @return Event type field (MIDI status byte without channel)
|
* @return Event type field (MIDI status byte without channel)
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
fluid_midi_event_get_type(fluid_midi_event_t *evt)
|
fluid_midi_event_get_type(const fluid_midi_event_t *evt)
|
||||||
{
|
{
|
||||||
return evt->type;
|
return evt->type;
|
||||||
}
|
}
|
||||||
|
@ -1130,7 +1130,7 @@ fluid_midi_event_set_type(fluid_midi_event_t *evt, int type)
|
||||||
* @return Channel field
|
* @return Channel field
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
fluid_midi_event_get_channel(fluid_midi_event_t *evt)
|
fluid_midi_event_get_channel(const fluid_midi_event_t *evt)
|
||||||
{
|
{
|
||||||
return evt->channel;
|
return evt->channel;
|
||||||
}
|
}
|
||||||
|
@ -1154,7 +1154,7 @@ fluid_midi_event_set_channel(fluid_midi_event_t *evt, int chan)
|
||||||
* @return MIDI note number (0-127)
|
* @return MIDI note number (0-127)
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
fluid_midi_event_get_key(fluid_midi_event_t *evt)
|
fluid_midi_event_get_key(const fluid_midi_event_t *evt)
|
||||||
{
|
{
|
||||||
return evt->param1;
|
return evt->param1;
|
||||||
}
|
}
|
||||||
|
@ -1178,7 +1178,7 @@ fluid_midi_event_set_key(fluid_midi_event_t *evt, int v)
|
||||||
* @return MIDI velocity number (0-127)
|
* @return MIDI velocity number (0-127)
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
fluid_midi_event_get_velocity(fluid_midi_event_t *evt)
|
fluid_midi_event_get_velocity(const fluid_midi_event_t *evt)
|
||||||
{
|
{
|
||||||
return evt->param2;
|
return evt->param2;
|
||||||
}
|
}
|
||||||
|
@ -1202,7 +1202,7 @@ fluid_midi_event_set_velocity(fluid_midi_event_t *evt, int v)
|
||||||
* @return MIDI control number
|
* @return MIDI control number
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
fluid_midi_event_get_control(fluid_midi_event_t *evt)
|
fluid_midi_event_get_control(const fluid_midi_event_t *evt)
|
||||||
{
|
{
|
||||||
return evt->param1;
|
return evt->param1;
|
||||||
}
|
}
|
||||||
|
@ -1226,7 +1226,7 @@ fluid_midi_event_set_control(fluid_midi_event_t *evt, int v)
|
||||||
* @return Value field
|
* @return Value field
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
fluid_midi_event_get_value(fluid_midi_event_t *evt)
|
fluid_midi_event_get_value(const fluid_midi_event_t *evt)
|
||||||
{
|
{
|
||||||
return evt->param2;
|
return evt->param2;
|
||||||
}
|
}
|
||||||
|
@ -1250,7 +1250,7 @@ fluid_midi_event_set_value(fluid_midi_event_t *evt, int v)
|
||||||
* @return MIDI program number (0-127)
|
* @return MIDI program number (0-127)
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
fluid_midi_event_get_program(fluid_midi_event_t *evt)
|
fluid_midi_event_get_program(const fluid_midi_event_t *evt)
|
||||||
{
|
{
|
||||||
return evt->param1;
|
return evt->param1;
|
||||||
}
|
}
|
||||||
|
@ -1274,7 +1274,7 @@ fluid_midi_event_set_program(fluid_midi_event_t *evt, int val)
|
||||||
* @return Pitch value (14 bit value, 0-16383, 8192 is center)
|
* @return Pitch value (14 bit value, 0-16383, 8192 is center)
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
fluid_midi_event_get_pitch(fluid_midi_event_t *evt)
|
fluid_midi_event_get_pitch(const fluid_midi_event_t *evt)
|
||||||
{
|
{
|
||||||
return evt->param1;
|
return evt->param1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -367,64 +367,20 @@ static fluid_seq_id_t get_fluidsynth_dest(fluid_sequencer_t *seq)
|
||||||
*
|
*
|
||||||
* @since 1.1.0
|
* @since 1.1.0
|
||||||
*/
|
*/
|
||||||
int
|
int fluid_sequencer_add_midi_event_to_buffer(void *data, fluid_midi_event_t *event)
|
||||||
fluid_sequencer_add_midi_event_to_buffer(void *data, fluid_midi_event_t *event)
|
|
||||||
{
|
{
|
||||||
fluid_event_t evt;
|
fluid_event_t evt;
|
||||||
fluid_sequencer_t *seq;
|
fluid_sequencer_t *seq;
|
||||||
int chan;
|
|
||||||
|
|
||||||
fluid_return_val_if_fail(data != NULL, FLUID_FAILED);
|
fluid_return_val_if_fail(data != NULL, FLUID_FAILED);
|
||||||
fluid_return_val_if_fail(event != NULL, FLUID_FAILED);
|
fluid_return_val_if_fail(event != NULL, FLUID_FAILED);
|
||||||
|
|
||||||
seq = (fluid_sequencer_t *) data;
|
seq = (fluid_sequencer_t *)data;
|
||||||
chan = fluid_midi_event_get_channel(event);
|
|
||||||
|
|
||||||
fluid_event_clear(&evt);
|
fluid_event_clear(&evt);
|
||||||
|
fluid_event_from_midi_event(&evt, event);
|
||||||
fluid_event_set_dest(&evt, get_fluidsynth_dest(seq));
|
fluid_event_set_dest(&evt, get_fluidsynth_dest(seq));
|
||||||
|
|
||||||
switch(fluid_midi_event_get_type(event))
|
|
||||||
{
|
|
||||||
case NOTE_OFF:
|
|
||||||
fluid_event_noteoff(&evt, chan, (short)fluid_midi_event_get_key(event));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case NOTE_ON:
|
|
||||||
fluid_event_noteon(&evt, fluid_midi_event_get_channel(event),
|
|
||||||
(short)fluid_midi_event_get_key(event), (short)fluid_midi_event_get_velocity(event));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CONTROL_CHANGE:
|
|
||||||
fluid_event_control_change(&evt, chan, (short)fluid_midi_event_get_control(event),
|
|
||||||
(short)fluid_midi_event_get_value(event));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PROGRAM_CHANGE:
|
|
||||||
fluid_event_program_change(&evt, chan, (short)fluid_midi_event_get_program(event));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PITCH_BEND:
|
|
||||||
fluid_event_pitch_bend(&evt, chan, fluid_midi_event_get_pitch(event));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CHANNEL_PRESSURE:
|
|
||||||
fluid_event_channel_pressure(&evt, chan, (short)fluid_midi_event_get_program(event));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case KEY_PRESSURE:
|
|
||||||
fluid_event_key_pressure(&evt, chan,
|
|
||||||
(short)fluid_midi_event_get_key(event),
|
|
||||||
(short)fluid_midi_event_get_value(event));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MIDI_SYSTEM_RESET:
|
|
||||||
fluid_event_system_reset(&evt);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default: /* Not yet implemented */
|
|
||||||
return FLUID_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Schedule for sending at next call to fluid_sequencer_process */
|
/* Schedule for sending at next call to fluid_sequencer_process */
|
||||||
return fluid_sequencer_send_at(seq, &evt, 0, 0);
|
return fluid_sequencer_send_at(seq, &evt, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
|
|
||||||
#include "fluid_event.h"
|
#include "fluid_event.h"
|
||||||
#include "fluidsynth_priv.h"
|
#include "fluidsynth_priv.h"
|
||||||
|
#include "fluid_midi.h"
|
||||||
|
|
||||||
/***************************************************************
|
/***************************************************************
|
||||||
*
|
*
|
||||||
|
@ -577,7 +578,88 @@ fluid_event_system_reset(fluid_event_t *evt)
|
||||||
evt->type = FLUID_SEQ_SYSTEMRESET;
|
evt->type = FLUID_SEQ_SYSTEMRESET;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transforms an incoming MIDI event (from a MIDI driver or MIDI router) to a
|
||||||
|
* sequencer event.
|
||||||
|
*
|
||||||
|
* @param evt Sequencer event structure
|
||||||
|
* @param event MIDI event
|
||||||
|
* @return #FLUID_OK or #FLUID_FAILED
|
||||||
|
*
|
||||||
|
* @note This function copies the fields of the MIDI event into the provided
|
||||||
|
* sequencer event. Calling applications must create the sequencer event and set
|
||||||
|
* additional fields such as the source and destination of the sequencer event.
|
||||||
|
*
|
||||||
|
* @code{.cpp}
|
||||||
|
* // ... get MIDI event, e.g. using player_callback()
|
||||||
|
*
|
||||||
|
* // Send MIDI event to sequencer to play
|
||||||
|
* fluid_event_t *evt = new_fluid_event();
|
||||||
|
* fluid_event_set_source(evt, -1);
|
||||||
|
* fluid_event_set_dest(evt, seqid);
|
||||||
|
* fluid_event_from_midi_event(evt, event);
|
||||||
|
* fluid_sequencer_send_at(sequencer, evt, 50, 0); // relative time
|
||||||
|
* delete_fluid_event(evt);
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @since 2.2.7
|
||||||
|
*/
|
||||||
|
int fluid_event_from_midi_event(fluid_event_t *evt, const fluid_midi_event_t *event)
|
||||||
|
{
|
||||||
|
int chan;
|
||||||
|
fluid_return_val_if_fail(event != NULL, FLUID_FAILED);
|
||||||
|
|
||||||
|
chan = fluid_midi_event_get_channel(event);
|
||||||
|
|
||||||
|
switch (fluid_midi_event_get_type(event))
|
||||||
|
{
|
||||||
|
case NOTE_OFF:
|
||||||
|
fluid_event_noteoff(evt, chan, (short)fluid_midi_event_get_key(event));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NOTE_ON:
|
||||||
|
fluid_event_noteon(evt,
|
||||||
|
fluid_midi_event_get_channel(event),
|
||||||
|
(short)fluid_midi_event_get_key(event),
|
||||||
|
(short)fluid_midi_event_get_velocity(event));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CONTROL_CHANGE:
|
||||||
|
fluid_event_control_change(evt,
|
||||||
|
chan,
|
||||||
|
(short)fluid_midi_event_get_control(event),
|
||||||
|
(short)fluid_midi_event_get_value(event));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROGRAM_CHANGE:
|
||||||
|
fluid_event_program_change(evt, chan, (short)fluid_midi_event_get_program(event));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PITCH_BEND:
|
||||||
|
fluid_event_pitch_bend(evt, chan, fluid_midi_event_get_pitch(event));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CHANNEL_PRESSURE:
|
||||||
|
fluid_event_channel_pressure(evt, chan, (short)fluid_midi_event_get_program(event));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case KEY_PRESSURE:
|
||||||
|
fluid_event_key_pressure(evt,
|
||||||
|
chan,
|
||||||
|
(short)fluid_midi_event_get_key(event),
|
||||||
|
(short)fluid_midi_event_get_value(event));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MIDI_SYSTEM_RESET:
|
||||||
|
fluid_event_system_reset(evt);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default: /* Not yet implemented */
|
||||||
|
return FLUID_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FLUID_OK;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Accessing event data
|
* Accessing event data
|
||||||
|
|
|
@ -387,17 +387,17 @@ void fluid_msleep(unsigned int msecs)
|
||||||
*/
|
*/
|
||||||
unsigned int fluid_curtime(void)
|
unsigned int fluid_curtime(void)
|
||||||
{
|
{
|
||||||
float now;
|
double now;
|
||||||
static float initial_time = 0;
|
static double initial_time = 0;
|
||||||
|
|
||||||
if(initial_time == 0)
|
if(initial_time == 0)
|
||||||
{
|
{
|
||||||
initial_time = (float)fluid_utime();
|
initial_time = fluid_utime();
|
||||||
}
|
}
|
||||||
|
|
||||||
now = (float)fluid_utime();
|
now = fluid_utime();
|
||||||
|
|
||||||
return (unsigned int)((now - initial_time) / 1000.0f);
|
return (unsigned int)((now - initial_time) / 1000.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue