View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0001286 | OpenMPT | libopenmpt | public | 2020-01-07 10:24 | 2020-01-07 14:50 |
Reporter | Saga Musix | Assigned To | Saga Musix | ||
Priority | normal | Severity | feature | Reproducibility | N/A |
Status | resolved | Resolution | fixed | ||
Target Version | OpenMPT 1.29.01.00 / libopenmpt 0.5.0 (upgrade first) | Fixed in Version | OpenMPT 1.29.01.00 / libopenmpt 0.5.0 (upgrade first) | ||
Summary | 0001286: Provide real BPM estimation | ||||
Description |
For a use case, see https://forum.openmpt.org/index.php?topic=6241.msg46716#msg46716 | ||||
Tags | No tags attached. | ||||
Has the bug occurred in previous versions? | |||||
Tested code revision (in case you know it) | |||||
First implementation. Up for discussion: Change the default sample rate in estimate_bpm_v1.patch (5,045 bytes)
Index: libopenmpt/bindings/freebasic/libopenmpt.bi =================================================================== --- libopenmpt/bindings/freebasic/libopenmpt.bi (revision 12451) +++ libopenmpt/bindings/freebasic/libopenmpt.bi (working copy) @@ -1055,6 +1055,15 @@ '/ Declare Function openmpt_module_get_metadata_ Alias "openmpt_module_get_metadata" (ByVal module As openmpt_module Ptr, ByVal key As Const ZString Ptr) As Const ZString Ptr +/'* \brief Get the current estimated beats per minute (BPM). + + \param module The module handle to work on. + \remarks Many module formats lack time signature metadata. It is common that this estimate is off by a factor of two, but other multipliers are also possible. + \remarks Due to the nature of how module tempo works, the estimate may change slightly after switching libopenmpt's output to a different sample rate. + \return The current estimated BPM. +'/ +Declare Function openmpt_module_get_estimated_bpm(ByVal module As openmpt_module Ptr) As Double + /'* \brief Get the current speed \param module The module handle to work on. Index: libopenmpt/libopenmpt.h =================================================================== --- libopenmpt/libopenmpt.h (revision 12451) +++ libopenmpt/libopenmpt.h (working copy) @@ -1140,6 +1140,14 @@ */ LIBOPENMPT_API const char * openmpt_module_get_metadata( openmpt_module * mod, const char * key ); +/*! Get the current estimated beats per minute (BPM). + * + * \param mod The module handle to work on. + * \remarks Many module formats lack time signature metadata. It is common that this estimate is off by a factor of two, but other multipliers are also possible. + * \remarks Due to the nature of how module tempo works, the estimate may change slightly after switching libopenmpt's output to a different sample rate. + * \return The current estimated BPM. + */ +double openmpt_module_get_estimated_bpm( openmpt_module * mod ); /*! \brief Get the current speed * * \param mod The module handle to work on. Index: libopenmpt/libopenmpt.hpp =================================================================== --- libopenmpt/libopenmpt.hpp (revision 12451) +++ libopenmpt/libopenmpt.hpp (working copy) @@ -815,6 +815,13 @@ */ std::string get_metadata( const std::string & key ) const; + //! Get the current estimated beats per minute (BPM). + /*! + \remarks Many module formats lack time signature metadata. It is common that this estimate is off by a factor of two, but other multipliers are also possible. + \remarks Due to the nature of how module tempo works, the estimate may change slightly after switching libopenmpt's output to a different sample rate. + \return The current estimated BPM. + */ + double get_estimated_bpm() const; //! Get the current speed /*! \return The current speed in ticks per row. Index: libopenmpt/libopenmpt_c.cpp =================================================================== --- libopenmpt/libopenmpt_c.cpp (revision 12451) +++ libopenmpt/libopenmpt_c.cpp (working copy) @@ -924,6 +924,15 @@ return NULL; } +LIBOPENMPT_API double openmpt_module_get_estimated_bpm( openmpt_module * mod ) { + try { + openmpt::interface::check_soundfile( mod ); + return mod->impl->get_estimated_bpm(); + } catch ( ... ) { + openmpt::report_exception( __func__, mod ); + } + return 0.0; +} LIBOPENMPT_API int32_t openmpt_module_get_current_speed( openmpt_module * mod ) { try { openmpt::interface::check_soundfile( mod ); Index: libopenmpt/libopenmpt_cxx.cpp =================================================================== --- libopenmpt/libopenmpt_cxx.cpp (revision 12451) +++ libopenmpt/libopenmpt_cxx.cpp (working copy) @@ -305,6 +305,9 @@ return impl->get_metadata( key ); } +double module::get_estimated_bpm() const { + return impl->get_estimated_bpm(); +} std::int32_t module::get_current_speed() const { return impl->get_current_speed(); } Index: libopenmpt/libopenmpt_impl.cpp =================================================================== --- libopenmpt/libopenmpt_impl.cpp (revision 12451) +++ libopenmpt/libopenmpt_impl.cpp (working copy) @@ -1275,6 +1275,9 @@ return ""; } +double module_impl::get_estimated_bpm() const { + return m_sndFile->GetCurrentBPM(); +} std::int32_t module_impl::get_current_speed() const { return m_sndFile->m_PlayState.m_nMusicSpeed; } Index: libopenmpt/libopenmpt_impl.hpp =================================================================== --- libopenmpt/libopenmpt_impl.hpp (revision 12451) +++ libopenmpt/libopenmpt_impl.hpp (working copy) @@ -198,6 +198,7 @@ std::size_t read_interleaved_quad( std::int32_t samplerate, std::size_t count, float * interleaved_quad ); std::vector<std::string> get_metadata_keys() const; std::string get_metadata( const std::string & key ) const; + double get_estimated_bpm() const; std::int32_t get_current_speed() const; std::int32_t get_current_tempo() const; std::int32_t get_current_order() const; |
|
I would prefer "get_current_estimated_bpm" as the API name, because it emphasizes the fact that this value can change over time. Looks good otherwise.
Very likely a good idea. Would there be any implications for OpenMPT doing that? (sound devices default to 48000 for a long time (1.23.03 / 2014-05) already anyway). |
|
New version with renamed function and changing the default sample rate.
There shouldn't be any changes because the current audio parameters are applied instantly in the estimate_bpm_v2.patch (5,455 bytes)
Index: libopenmpt/bindings/freebasic/libopenmpt.bi =================================================================== --- libopenmpt/bindings/freebasic/libopenmpt.bi (revision 12451) +++ libopenmpt/bindings/freebasic/libopenmpt.bi (working copy) @@ -1055,6 +1055,15 @@ '/ Declare Function openmpt_module_get_metadata_ Alias "openmpt_module_get_metadata" (ByVal module As openmpt_module Ptr, ByVal key As Const ZString Ptr) As Const ZString Ptr +/'* \brief Get the current estimated beats per minute (BPM). + + \param module The module handle to work on. + \remarks Many module formats lack time signature metadata. It is common that this estimate is off by a factor of two, but other multipliers are also possible. + \remarks Due to the nature of how module tempo works, the estimate may change slightly after switching libopenmpt's output to a different sample rate. + \return The current estimated BPM. +'/ +Declare Function openmpt_module_get_current_estimated_bpm(ByVal module As openmpt_module Ptr) As Double + /'* \brief Get the current speed \param module The module handle to work on. Index: libopenmpt/libopenmpt.h =================================================================== --- libopenmpt/libopenmpt.h (revision 12451) +++ libopenmpt/libopenmpt.h (working copy) @@ -1140,6 +1140,14 @@ */ LIBOPENMPT_API const char * openmpt_module_get_metadata( openmpt_module * mod, const char * key ); +/*! Get the current estimated beats per minute (BPM). + * + * \param mod The module handle to work on. + * \remarks Many module formats lack time signature metadata. It is common that this estimate is off by a factor of two, but other multipliers are also possible. + * \remarks Due to the nature of how module tempo works, the estimate may change slightly after switching libopenmpt's output to a different sample rate. + * \return The current estimated BPM. + */ +double openmpt_module_get_current_estimated_bpm( openmpt_module * mod ); /*! \brief Get the current speed * * \param mod The module handle to work on. Index: libopenmpt/libopenmpt.hpp =================================================================== --- libopenmpt/libopenmpt.hpp (revision 12451) +++ libopenmpt/libopenmpt.hpp (working copy) @@ -815,6 +815,13 @@ */ std::string get_metadata( const std::string & key ) const; + //! Get the current estimated beats per minute (BPM). + /*! + \remarks Many module formats lack time signature metadata. It is common that this estimate is off by a factor of two, but other multipliers are also possible. + \remarks Due to the nature of how module tempo works, the estimate may change slightly after switching libopenmpt's output to a different sample rate. + \return The current estimated BPM. + */ + double get_current_estimated_bpm() const; //! Get the current speed /*! \return The current speed in ticks per row. Index: libopenmpt/libopenmpt_c.cpp =================================================================== --- libopenmpt/libopenmpt_c.cpp (revision 12451) +++ libopenmpt/libopenmpt_c.cpp (working copy) @@ -924,6 +924,15 @@ return NULL; } +LIBOPENMPT_API double openmpt_module_get_current_estimated_bpm( openmpt_module * mod ) { + try { + openmpt::interface::check_soundfile( mod ); + return mod->impl->get_current_estimated_bpm(); + } catch ( ... ) { + openmpt::report_exception( __func__, mod ); + } + return 0.0; +} LIBOPENMPT_API int32_t openmpt_module_get_current_speed( openmpt_module * mod ) { try { openmpt::interface::check_soundfile( mod ); Index: libopenmpt/libopenmpt_cxx.cpp =================================================================== --- libopenmpt/libopenmpt_cxx.cpp (revision 12451) +++ libopenmpt/libopenmpt_cxx.cpp (working copy) @@ -305,6 +305,9 @@ return impl->get_metadata( key ); } +double module::get_current_estimated_bpm() const { + return impl->get_current_estimated_bpm(); +} std::int32_t module::get_current_speed() const { return impl->get_current_speed(); } Index: libopenmpt/libopenmpt_impl.cpp =================================================================== --- libopenmpt/libopenmpt_impl.cpp (revision 12451) +++ libopenmpt/libopenmpt_impl.cpp (working copy) @@ -1275,6 +1275,9 @@ return ""; } +double module_impl::get_current_estimated_bpm() const { + return m_sndFile->GetCurrentBPM(); +} std::int32_t module_impl::get_current_speed() const { return m_sndFile->m_PlayState.m_nMusicSpeed; } Index: libopenmpt/libopenmpt_impl.hpp =================================================================== --- libopenmpt/libopenmpt_impl.hpp (revision 12451) +++ libopenmpt/libopenmpt_impl.hpp (working copy) @@ -198,6 +198,7 @@ std::size_t read_interleaved_quad( std::int32_t samplerate, std::size_t count, float * interleaved_quad ); std::vector<std::string> get_metadata_keys() const; std::string get_metadata( const std::string & key ) const; + double get_current_estimated_bpm() const; std::int32_t get_current_speed() const; std::int32_t get_current_tempo() const; std::int32_t get_current_order() const; Index: soundlib/MixerSettings.cpp =================================================================== --- soundlib/MixerSettings.cpp (revision 12451) +++ soundlib/MixerSettings.cpp (working copy) @@ -26,7 +26,7 @@ // Mixing Configuration gnChannels = 2; - gdwMixingFreq = 44100; + gdwMixingFreq = 48000; m_nPreAmp = 128; |
|
Looks good. |
|
Date Modified | Username | Field | Change |
---|---|---|---|
2020-01-07 10:24 | Saga Musix | New Issue | |
2020-01-07 10:26 | manx | Target Version | => OpenMPT 1.30.01.00 / libopenmpt 0.6.0 (upgrade first) |
2020-01-07 10:54 | manx | Relationship added | related to 0001287 |
2020-01-07 13:00 | Saga Musix | Note Added: 0004179 | |
2020-01-07 13:00 | Saga Musix | File Added: estimate_bpm_v1.patch | |
2020-01-07 13:01 | Saga Musix | Target Version | OpenMPT 1.30.01.00 / libopenmpt 0.6.0 (upgrade first) => OpenMPT 1.29.01.00 / libopenmpt 0.5.0 (upgrade first) |
2020-01-07 14:01 | manx | Note Added: 0004180 | |
2020-01-07 14:35 | Saga Musix | Note Added: 0004181 | |
2020-01-07 14:35 | Saga Musix | File Added: estimate_bpm_v2.patch | |
2020-01-07 14:43 | manx | Note Added: 0004182 | |
2020-01-07 14:50 | manx | Assigned To | => Saga Musix |
2020-01-07 14:50 | manx | Status | new => resolved |
2020-01-07 14:50 | manx | Resolution | open => fixed |
2020-01-07 14:50 | manx | Fixed in Version | => OpenMPT 1.29.01.00 / libopenmpt 0.5.0 (upgrade first) |
2020-01-07 14:50 | manx | Note Added: 0004183 |