LMMS
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 AutomatableModel * childModel( const QString & _modelName ) override;
83
84 QString nodeName() const override;
85
86 gui::PluginView* instantiateView( QWidget * _parent ) override;
87
88 QString getCurrentPatchName();
89
90
91 void setParameter( const QString & _param, const QString & _value );
92
93
94public slots:
95 void openFile( const QString & _sf2File, bool updateTrackName = true );
96 void updatePatch();
97 void reloadSynth();
98
99 // We can't really support sample-exact with the way IPH and FS work.
100 // So, sig/slots work just fine for the synth settings right now.
101 void updateReverbOn();
102 void updateReverb();
103 void updateChorusOn();
104 void updateChorus();
105 void updateGain();
106 void updateTuning();
107
108private:
110 std::array<SampleFrame, DEFAULT_BUFFER_SIZE> m_buffer;
111 std::span<SampleFrame> m_bufferView;
112
113 fluid_settings_t* m_settings;
114 fluid_synth_t* m_synth;
115
116 fluid_sfont_t* m_font;
117
119 QString m_filename;
120
121 // Protect the array of active notes
123
124 // Protect synth when we are re-creating it.
127
128 std::array<int, 128> m_notesRunning = {};
133
136
138
144
150
151 QVector<NotePlayHandle *> m_playingNotes;
153
154private:
155 void freeFont();
156 void noteOn( Sf2PluginData * n );
157 void noteOff( Sf2PluginData * n );
158 void renderFrames( f_cnt_t frames, SampleFrame* buf );
159
161
162signals:
166
167} ;
168
169
170namespace gui
171{
172
173
217
218
219} // namespace gui
220
221} // namespace lmms
222
223#endif
A utility class for resampling interleaved audio buffers using various resampling algorithms.
Definition AudioResampler.h:41
Definition AutomatableModel.h:77
Definition AutomatableModel.h:497
Definition AutomatableModel.h:463
Definition Instrument.h:52
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:870
Sf2Instrument(InstrumentTrack *_instrument_track)
Definition Sf2Player.cpp:124
AudioResampler m_resampler
Definition Sf2Player.h:109
mapPropertyFromModel(int, getPatch, setPatch, m_patchNum)
void saveSettings(QDomDocument &_doc, QDomElement &_parent) override
Definition Sf2Player.cpp:242
void play(SampleFrame *_working_buffer) override
Definition Sf2Player.cpp:784
~Sf2Instrument() override
Definition Sf2Player.cpp:230
gui::PluginView * instantiateView(QWidget *_parent) override
Create a view for the model.
Definition Sf2Player.cpp:929
void openFile(const QString &_sf2File, bool updateTrackName=true)
Definition Sf2Player.cpp:378
FloatModel m_reverbDamping
Definition Sf2Player.h:141
FloatModel m_chorusNum
Definition Sf2Player.h:146
void updateReverb()
Definition Sf2Player.cpp:511
FloatModel m_reverbLevel
Definition Sf2Player.h:143
fluid_settings_t * m_settings
Definition Sf2Player.h:113
QMutex m_playingNotesMutex
Definition Sf2Player.h:152
void updateReverbOn()
Definition Sf2Player.cpp:502
QString getCurrentPatchName()
Definition Sf2Player.cpp:447
void deleteNotePluginData(NotePlayHandle *_n) override
Definition Sf2Player.cpp:909
QMutex m_loadMutex
Definition Sf2Player.h:126
void loadFile(const QString &_file) override
Definition Sf2Player.cpp:291
FloatModel m_reverbWidth
Definition Sf2Player.h:142
QVector< NotePlayHandle * > m_playingNotes
Definition Sf2Player.h:151
int m_channel
Definition Sf2Player.h:132
void noteOn(Sf2PluginData *n)
Definition Sf2Player.cpp:710
QString nodeName() const override
Definition Sf2Player.cpp:355
std::array< SampleFrame, DEFAULT_BUFFER_SIZE > m_buffer
Definition Sf2Player.h:110
void updateTuning()
Definition Sf2Player.cpp:549
fluid_sfont_t * m_font
Definition Sf2Player.h:116
void setParameter(const QString &_param, const QString &_value)
QMutex m_synthMutex
Definition Sf2Player.h:125
void updatePatch()
Definition Sf2Player.cpp:435
BoolModel m_reverbOn
Definition Sf2Player.h:139
void freeFont()
Definition Sf2Player.cpp:363
void updateGain()
Definition Sf2Player.cpp:492
QString m_filename
Definition Sf2Player.h:119
FloatModel m_chorusLevel
Definition Sf2Player.h:147
AutomatableModel * childModel(const QString &_modelName) override
Definition Sf2Player.cpp:339
void playNote(NotePlayHandle *_n, SampleFrame *_working_buffer) override
Definition Sf2Player.cpp:649
FloatModel m_chorusDepth
Definition Sf2Player.h:149
int m_lastMidiPitch
Definition Sf2Player.h:130
gui::LcdSpinBoxModel m_patchNum
Definition Sf2Player.h:135
int m_lastMidiPitchRange
Definition Sf2Player.h:131
BoolModel m_chorusOn
Definition Sf2Player.h:145
void updateChorusOn()
Definition Sf2Player.cpp:525
void noteOff(Sf2PluginData *n)
Definition Sf2Player.cpp:768
void reloadSynth()
Definition Sf2Player.cpp:581
FloatModel m_reverbRoomSize
Definition Sf2Player.h:140
sample_rate_t m_internalSampleRate
Definition Sf2Player.h:129
void loadSettings(const QDomElement &_this) override
Definition Sf2Player.cpp:266
QMutex m_notesRunningMutex
Definition Sf2Player.h:122
std::span< SampleFrame > m_bufferView
Definition Sf2Player.h:111
gui::LcdSpinBoxModel m_bankNum
Definition Sf2Player.h:134
FloatModel m_chorusSpeed
Definition Sf2Player.h:148
int m_fontId
Definition Sf2Player.h:118
void updateChorus()
Definition Sf2Player.cpp:534
fluid_synth_t * m_synth
Definition Sf2Player.h:114
std::array< int, 128 > m_notesRunning
Definition Sf2Player.h:128
FloatModel m_gain
Definition Sf2Player.h:137
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 PluginView.h:36
Definition Sf2Player.h:175
LcdSpinBox * m_bankNumLcd
Definition Sf2Player.h:188
PixmapButton * m_reverbButton
Definition Sf2Player.h:196
Sf2InstrumentView(Instrument *_instrument, QWidget *_parent)
Definition Sf2Player.cpp:953
Knob * m_reverbWidthKnob
Definition Sf2Player.h:199
PixmapButton * m_fileDialogButton
Definition Sf2Player.h:185
Knob * m_reverbLevelKnob
Definition Sf2Player.h:200
void showPatchDialog()
Definition Sf2Player.cpp:1218
void updateFilename()
Definition Sf2Player.cpp:1136
QLabel * m_patchLabel
Definition Sf2Player.h:192
Knob * m_chorusNumKnob
Definition Sf2Player.h:203
~Sf2InstrumentView() override=default
Knob * m_chorusDepthKnob
Definition Sf2Player.h:206
void modelChanged() override
Definition Sf2Player.cpp:1105
PixmapButton * m_chorusButton
Definition Sf2Player.h:202
static PatchesDialog * s_patchDialog
Definition Sf2Player.h:208
Knob * m_reverbRoomSizeKnob
Definition Sf2Player.h:197
void invalidateFile()
Definition Sf2Player.cpp:1170
void updatePatchName()
Definition Sf2Player.cpp:1156
LcdSpinBox * m_patchNumLcd
Definition Sf2Player.h:189
Knob * m_gainKnob
Definition Sf2Player.h:194
Knob * m_chorusLevelKnob
Definition Sf2Player.h:204
QLabel * m_filenameLabel
Definition Sf2Player.h:191
PixmapButton * m_patchDialogButton
Definition Sf2Player.h:186
void showFileDialog()
Definition Sf2Player.cpp:1178
Knob * m_reverbDampingKnob
Definition Sf2Player.h:198
Knob * m_chorusSpeedKnob
Definition Sf2Player.h:205
Definition AudioPortAudio.cpp:223
IntModel LcdSpinBoxModel
Definition LcdSpinBox.h:88
Definition AudioAlsa.cpp:35
std::uint32_t sample_rate_t
Definition LmmsTypes.h:42
std::uint64_t f_cnt_t
Definition LmmsTypes.h:43
Definition Sf2Player.cpp:108
int n
Definition crypt.c:458