Skip to content

Commit

Permalink
Random: introduce dedicated randomization class
Browse files Browse the repository at this point in the history
to more elegantly make the random number generating function of the AudioEngine available to other parts of the code as well.

It looks quite empty but will likely be filled with life at some future point in time when I have time to look at hydrogen-music#627 again
  • Loading branch information
theGreatWhiteShark committed Nov 5, 2022
1 parent 24a59da commit 0d6bb3e
Show file tree
Hide file tree
Showing 4 changed files with 92 additions and 26 deletions.
28 changes: 4 additions & 24 deletions src/core/AudioEngine/AudioEngine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
#include <core/Basics/InstrumentComponent.h>
#include <core/Sampler/Sampler.h>
#include <core/Helpers/Filesystem.h>
#include <core/Helpers/Random.h>

#include <core/IO/AudioOutput.h>
#include <core/IO/JackAudioDriver.h>
Expand All @@ -65,33 +66,12 @@
#include <core/Preferences/Preferences.h>

#include <limits>
#include <random>

namespace H2Core
{

const int AudioEngine::nMaxTimeHumanize = 2000;

inline int randomValue( int max )
{
return rand() % max;
}

inline float getGaussian( float z )
{
// gaussian distribution -- dimss
float x1, x2, w;
do {
x1 = 2.0 * ( ( ( float ) rand() ) / static_cast<float>(RAND_MAX) ) - 1.0;
x2 = 2.0 * ( ( ( float ) rand() ) / static_cast<float>(RAND_MAX) ) - 1.0;
w = x1 * x1 + x2 * x2;
} while ( w >= 1.0 );

w = sqrtf( ( -2.0 * logf( w ) ) / w );
return x1 * w * z + 0.0; // tunable
}


/** Gets the current time.
* \return Current time obtained by gettimeofday()*/
inline timeval currentTime2()
Expand Down Expand Up @@ -1158,12 +1138,12 @@ void AudioEngine::processPlayNotes( unsigned long nframes )
if ( pSong->getHumanizeVelocityValue() != 0 ) {
pNote->set_velocity( pNote->get_velocity() +
pSong->getHumanizeVelocityValue() *
getGaussian( AudioEngine::fHumanizeVelocitySD ) );
Random::getGaussian( AudioEngine::fHumanizeVelocitySD ) );
}

float fPitch = pNote->get_pitch() + pNote->get_instrument()->get_pitch_offset();
if ( pNote->get_instrument()->get_random_pitch_factor() != 0. ) {
fPitch += getGaussian( AudioEngine::fHumanizePitchSD ) *
fPitch += Random::getGaussian( AudioEngine::fHumanizePitchSD ) *
pNote->get_instrument()->get_random_pitch_factor();
}
pNote->set_pitch( fPitch );
Expand Down Expand Up @@ -2382,7 +2362,7 @@ int AudioEngine::updateNoteQueue( unsigned nIntervalLengthInFrames )
*/
if ( pSong->getHumanizeTimeValue() != 0 ) {
nOffset += (int) (
getGaussian( AudioEngine::fHumanizeTimingSD ) *
Random::getGaussian( AudioEngine::fHumanizeTimingSD ) *
pSong->getHumanizeTimeValue() *
AudioEngine::nMaxTimeHumanize );
}
Expand Down
38 changes: 38 additions & 0 deletions src/core/Helpers/Random.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/*
* Hydrogen
* Copyright(c) 2008-2021 The hydrogen development team [hydrogen-devel@lists.sourceforge.net]
*
* http://www.hydrogen-music.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY, without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see https://www.gnu.org/licenses
*
*/

#include <core/Helpers/Random.h>

namespace H2Core {

float Random::getGaussian( float fStandardDeviation ) {
// gaussian distribution -- dimss
float x1, x2, w;
do {
x1 = 2.0 * ( ( ( float ) rand() ) / static_cast<float>(RAND_MAX) ) - 1.0;
x2 = 2.0 * ( ( ( float ) rand() ) / static_cast<float>(RAND_MAX) ) - 1.0;
w = x1 * x1 + x2 * x2;
} while ( w >= 1.0 );

w = sqrtf( ( -2.0 * logf( w ) ) / w );
return x1 * w * fStandardDeviation + 0.0; // tunable
}
};
50 changes: 50 additions & 0 deletions src/core/Helpers/Random.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/*
* Hydrogen
* Copyright(c) 2008-2021 The hydrogen development team [hydrogen-devel@lists.sourceforge.net]
*
* http://www.hydrogen-music.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY, without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see https://www.gnu.org/licenses
*
*/

#ifndef H2C_RANDOM_H
#define H2C_RANDOM_H

#include <core/Object.h>

namespace H2Core
{

/**
* Container for functions generating random number.
*
* \ingroup docCore
*/
class Random : public H2Core::Object<Random>
{
H2_OBJECT(Random)
public:
/**
* Draws an uncorrelated random value from a Gaussian distribution
* of mean 0 and @a fStandardDeviation.
*
* @param fStandardDeviation Defines the width of the distribution used.
*/
static float getGaussian( float fStandardDeviation );
};

};

#endif // H2C_RANDOM_H
2 changes: 0 additions & 2 deletions src/core/Hydrogen.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,6 @@
#include <cassert>
#include <memory>

inline int randomValue( int max );

namespace H2Core
{
class CoreActionController;
Expand Down

0 comments on commit 0d6bb3e

Please sign in to comment.