lmms
Cross-platform music production software
Loading...
Searching...
No Matches
Sf2Player.h
Go to the documentation of this file.
1/*
2 * Sf2Player.h - a soundfont2 player using fluidSynth
3 *
4 * Copyright (c) 2008 Paul Giblock <drfaygo/at/gmail/dot/com>
5 * Copyright (c) 2009-2014 Tobias Doerffel <tobydox/at/users.sourceforge.net>
6 *
7 * This file is part of LMMS - https://lmms.io
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public
11 * License as published by the Free Software Foundation; either
12 * version 2 of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public
20 * License along with this program (see COPYING); if not, write to the
21 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
22 * Boston, MA 02110-1301 USA.
23 *
24 */
25
26
27#ifndef SF2_PLAYER_H
28#define SF2_PLAYER_H
29
30#include <array>
31#include <fluidsynth/types.h>
32#include <QMutex>
33#include <samplerate.h>
34
35#include "AudioEngine.h"
36#include "AudioResampler.h"
37#include "Instrument.h"
38#include "InstrumentView.h"
39#include "LcdSpinBox.h"
40#include "SampleFrame.h"
41
42class QLabel;
43
44namespace lmms
45{
46
47
48struct Sf2PluginData;
49class NotePlayHandle;
50
51namespace gui
52{
53class Knob;
54class PixmapButton;
56class PatchesDialog;
57} // namespace gui
58
59
61{
62 Q_OBJECT
63 mapPropertyFromModel(int,getBank,setBank,m_bankNum);
64 mapPropertyFromModel(int,getPatch,setPatch,m_patchNum);
65
66public:
67 Sf2Instrument( InstrumentTrack * _instrument_track );
68 ~Sf2Instrument() override;
69
70 void play( SampleFrame* _working_buffer ) override;
71
72 void playNote( NotePlayHandle * _n,
73 SampleFrame* _working_buffer ) override;
74 void deleteNotePluginData( NotePlayHandle * _n ) override;
75
76
77 void saveSettings( QDomDocument & _doc, QDomElement & _parent ) override;
78 void loadSettings( const QDomElement & _this ) override;
79
80 void loadFile( const QString & _file ) override;
81
82 auto midiPatch() const -> std::optional<MidiPatch> override;
83 AutomatableModel* childModel(std::string_view modelName) override;
84
85 QString nodeName() const override;
86
87 gui::PluginView* instantiateView( QWidget * _parent ) override;
88
89 QString getCurrentPatchName();
90
91
92 void setParameter( const QString & _param, const QString & _value );
93
94
95public slots:
96 void openFile( const QString & _sf2File, bool updateTrackName = true );
97 void updatePatch();
98 void reloadSynth();
99
100 // We can't really support sample-exact with the way IPH and FS work.
101 // So, sig/slots work just fine for the synth settings right now.
102 void updateReverbOn();
103 void updateReverb();
104 void updateChorusOn();
105 void updateChorus();
106 void updateGain();
107 void updateTuning();
108
109private:
113
114 fluid_settings_t* m_settings;
115 fluid_synth_t* m_synth;
116
117 fluid_sfont_t* m_font;
118
120 QString m_filename;
121
122 // Protect the array of active notes
124
125 // Protect synth when we are re-creating it.
128
129 std::array<int, 128> m_notesRunning = {};
134
137
139
145
151
152 QVector<NotePlayHandle *> m_playingNotes;
154
155private:
156 void freeFont();
157 void noteOn( Sf2PluginData * n );
158 void noteOff( Sf2PluginData * n );
159 void renderFrames( f_cnt_t frames, SampleFrame* buf );
160
162
163signals:
167
168} ;
169
170
171namespace gui
172{
173
174
218
219
220} // namespace gui
221
222} // namespace lmms
223
224#endif
A utility class for resampling interleaved audio buffers using various resampling algorithms.
Definition AudioResampler.h:41
Definition AutomatableModel.h:77
Definition AutomatableModel.h:502
Definition AutomatableModel.h:468
Definition Instrument.h:54
Instrument(InstrumentTrack *_instrument_track, const Descriptor *_descriptor, const Descriptor::SubPluginFeatures::Key *key=nullptr, Flags flags=Flag::NoFlags)
Definition Instrument.cpp:38
Definition InstrumentTrack.h:62
Definition NotePlayHandle.h:48
Definition SampleFrame.h:41
mapPropertyFromModel(int, getBank, setBank, m_bankNum)
void renderFrames(f_cnt_t frames, SampleFrame *buf)
Definition Sf2Player.cpp:853
Sf2Instrument(InstrumentTrack *_instrument_track)
Definition Sf2Player.cpp:133
AudioResampler m_resampler
Definition Sf2Player.h:110
mapPropertyFromModel(int, getPatch, setPatch, m_patchNum)
void saveSettings(QDomDocument &_doc, QDomElement &_parent) override
Definition Sf2Player.cpp:246
void play(SampleFrame *_working_buffer) override
Definition Sf2Player.cpp:767
gui::PluginView * instantiateView(QWidget *_parent) override
Create a view for the model.
Definition Sf2Player.cpp:912
void openFile(const QString &_sf2File, bool updateTrackName=true)
Definition Sf2Player.cpp:395
auto midiPatch() const -> std::optional< MidiPatch > override
For applicable instruments: Provides host with current MIDI bank and program.
Definition Sf2Player.cpp:343
FloatModel m_reverbDamping
Definition Sf2Player.h:142
FloatModel m_chorusNum
Definition Sf2Player.h:147
void updateReverb()
Definition Sf2Player.cpp:512
FloatModel m_reverbLevel
Definition Sf2Player.h:144
fluid_settings_t * m_settings
Definition Sf2Player.h:114
QMutex m_playingNotesMutex
Definition Sf2Player.h:153
void updateReverbOn()
Definition Sf2Player.cpp:507
QString getCurrentPatchName()
Definition Sf2Player.cpp:461
void deleteNotePluginData(NotePlayHandle *_n) override
Definition Sf2Player.cpp:892
QMutex m_loadMutex
Definition Sf2Player.h:127
void loadFile(const QString &_file) override
Definition Sf2Player.cpp:299
FloatModel m_reverbWidth
Definition Sf2Player.h:143
QVector< NotePlayHandle * > m_playingNotes
Definition Sf2Player.h:152
int m_channel
Definition Sf2Player.h:133
void noteOn(Sf2PluginData *n)
Definition Sf2Player.cpp:695
QString nodeName() const override
Definition Sf2Player.cpp:372
std::array< SampleFrame, DEFAULT_BUFFER_SIZE > m_buffer
Definition Sf2Player.h:111
void updateTuning()
Definition Sf2Player.cpp:534
fluid_sfont_t * m_font
Definition Sf2Player.h:117
void setParameter(const QString &_param, const QString &_value)
QMutex m_synthMutex
Definition Sf2Player.h:126
void updatePatch()
Definition Sf2Player.cpp:449
BoolModel m_reverbOn
Definition Sf2Player.h:140
void freeFont()
Definition Sf2Player.cpp:380
void updateGain()
Definition Sf2Player.cpp:502
QString m_filename
Definition Sf2Player.h:120
FloatModel m_chorusLevel
Definition Sf2Player.h:148
void playNote(NotePlayHandle *_n, SampleFrame *_working_buffer) override
Definition Sf2Player.cpp:634
FloatModel m_chorusDepth
Definition Sf2Player.h:150
int m_lastMidiPitch
Definition Sf2Player.h:131
gui::LcdSpinBoxModel m_patchNum
Definition Sf2Player.h:136
int m_lastMidiPitchRange
Definition Sf2Player.h:132
BoolModel m_chorusOn
Definition Sf2Player.h:146
void updateChorusOn()
Definition Sf2Player.cpp:520
void noteOff(Sf2PluginData *n)
Definition Sf2Player.cpp:751
void reloadSynth()
Definition Sf2Player.cpp:566
FloatModel m_reverbRoomSize
Definition Sf2Player.h:141
sample_rate_t m_internalSampleRate
Definition Sf2Player.h:130
void loadSettings(const QDomElement &_this) override
Definition Sf2Player.cpp:270
QMutex m_notesRunningMutex
Definition Sf2Player.h:123
std::span< SampleFrame > m_bufferView
Definition Sf2Player.h:112
gui::LcdSpinBoxModel m_bankNum
Definition Sf2Player.h:135
FloatModel m_chorusSpeed
Definition Sf2Player.h:149
int m_fontId
Definition Sf2Player.h:119
AutomatableModel * childModel(std::string_view modelName) override
Definition Sf2Player.cpp:354
void updateChorus()
Definition Sf2Player.cpp:525
fluid_synth_t * m_synth
Definition Sf2Player.h:115
std::array< int, 128 > m_notesRunning
Definition Sf2Player.h:129
FloatModel m_gain
Definition Sf2Player.h:138
Instrument view with fixed LMMS-default size.
Definition InstrumentView.h:66
Definition Knob.h:47
Definition LcdSpinBox.h:35
Definition PatchesDialog.h:44
Definition PixmapButton.h:37
Definition Sf2Player.h:176
LcdSpinBox * m_bankNumLcd
Definition Sf2Player.h:189
PixmapButton * m_reverbButton
Definition Sf2Player.h:197
Sf2InstrumentView(Instrument *_instrument, QWidget *_parent)
Definition Sf2Player.cpp:936
Knob * m_reverbWidthKnob
Definition Sf2Player.h:200
PixmapButton * m_fileDialogButton
Definition Sf2Player.h:186
Knob * m_reverbLevelKnob
Definition Sf2Player.h:201
void showPatchDialog()
Definition Sf2Player.cpp:1201
void updateFilename()
Definition Sf2Player.cpp:1119
QLabel * m_patchLabel
Definition Sf2Player.h:193
Knob * m_chorusNumKnob
Definition Sf2Player.h:204
~Sf2InstrumentView() override=default
Knob * m_chorusDepthKnob
Definition Sf2Player.h:207
void modelChanged() override
Definition Sf2Player.cpp:1088
PixmapButton * m_chorusButton
Definition Sf2Player.h:203
static PatchesDialog * s_patchDialog
Definition Sf2Player.h:209
Knob * m_reverbRoomSizeKnob
Definition Sf2Player.h:198
void invalidateFile()
Definition Sf2Player.cpp:1153
void updatePatchName()
Definition Sf2Player.cpp:1139
LcdSpinBox * m_patchNumLcd
Definition Sf2Player.h:190
Knob * m_gainKnob
Definition Sf2Player.h:195
Knob * m_chorusLevelKnob
Definition Sf2Player.h:205
QLabel * m_filenameLabel
Definition Sf2Player.h:192
PixmapButton * m_patchDialogButton
Definition Sf2Player.h:187
void showFileDialog()
Definition Sf2Player.cpp:1161
Knob * m_reverbDampingKnob
Definition Sf2Player.h:199
Knob * m_chorusSpeedKnob
Definition Sf2Player.h:206
Definition AudioPortAudio.cpp:209
IntModel LcdSpinBoxModel
Definition LcdSpinBox.h:88
Definition RemotePluginBase.cpp:34
std::uint32_t sample_rate_t
Definition LmmsTypes.h:42
constexpr f_cnt_t DEFAULT_BUFFER_SIZE
Definition AudioEngine.h:53
std::uint64_t f_cnt_t
Definition LmmsTypes.h:43
Definition MidiPatch.h:34
Definition Sf2Player.cpp:117