Port FluidSim core and scenarios to C++20
This commit is contained in:
49
include/FluidSim/MechanicalSoundProcessor.hpp
Normal file
49
include/FluidSim/MechanicalSoundProcessor.hpp
Normal file
@@ -0,0 +1,49 @@
|
||||
#pragma once
|
||||
|
||||
#include "FluidSim/Engine.hpp"
|
||||
#include <random>
|
||||
|
||||
namespace fluidsim::port {
|
||||
|
||||
// Synthetic valve, piston, combustion, chain, and gear sounds driven by live
|
||||
// engine state; direct port of Core/MechanicalSoundProcessor.cs.
|
||||
class MechanicalSoundProcessor {
|
||||
public:
|
||||
float master_gain{0.6f}, valve_tick_gain{0.9f}, piston_slap_gain{1.2f};
|
||||
float combustion_gain{0.5f}, gear_whine_gain{0.12f}, cam_chain_gain{0.25f};
|
||||
|
||||
explicit MechanicalSoundProcessor(int sample_rate = 44100);
|
||||
float process(const Crankshaft& crank, const EngineCylinder& cylinder, float load);
|
||||
|
||||
private:
|
||||
class Resonator {
|
||||
public:
|
||||
Resonator(float frequency_hz, float q, float sample_rate);
|
||||
float process(float input);
|
||||
private:
|
||||
float b1_{}, b2_{}, gain_{}, y1_{}, y2_{};
|
||||
};
|
||||
class OnePoleLowPass {
|
||||
public:
|
||||
OnePoleLowPass(float cutoff_hz, float sample_rate);
|
||||
float process(float input);
|
||||
private:
|
||||
float alpha_{}, state_{};
|
||||
};
|
||||
|
||||
float dt_{};
|
||||
Resonator intake_tick_, exhaust_tick_;
|
||||
OnePoleLowPass slap_filter_, combustion_filter_, chain_filter_;
|
||||
float slap_envelope_{}, combustion_envelope_{}, chain_envelope_{};
|
||||
float slap_decay_{}, combustion_decay_{}, chain_decay_{};
|
||||
float gear_phase1_{}, gear_phase2_{}, gear_phase3_{};
|
||||
float previous_intake_area_{}, previous_exhaust_area_{}, previous_pressure_{};
|
||||
float previous_cycle_position_{-1.0f}, previous_crank_fraction_{-1.0f};
|
||||
std::mt19937 random_{0x5EEDu};
|
||||
std::uniform_real_distribution<float> unit_{-1.0f, 1.0f};
|
||||
|
||||
float random_sample();
|
||||
static bool crossed_fraction(float previous, float current, float target);
|
||||
};
|
||||
|
||||
} // namespace fluidsim::port
|
||||
Reference in New Issue
Block a user