-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathMIDIRouter.html
More file actions
169 lines (167 loc) · 17.9 KB
/
MIDIRouter.html
File metadata and controls
169 lines (167 loc) · 17.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.9.1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>libfluidsynth: Real-time MIDI router</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="custom.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">libfluidsynth
 <span id="projectnumber">2.5.4</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.1 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('MIDIRouter.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="PageDoc"><div class="header">
<div class="headertitle">
<div class="title">Real-time MIDI router </div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><p>The MIDI router is one more processing layer directly behind the MIDI input. It processes incoming MIDI events and generates control events for the synth. It can be used to filter or modify events prior to sending them to the synthesizer. When created, the MIDI router is transparent and simply passes all MIDI events. Router "rules" must be added to actually make use of its capabilities.</p>
<p>Some examples of MIDI router usage:</p>
<ul>
<li>Filter messages (Example: Pass sustain pedal CCs only to selected channels)</li>
<li>Split the keyboard (Example: noteon with notenr < x: to ch 1, >x to ch 2)</li>
<li>Layer sounds (Example: for each noteon received on ch 1, create a noteon on ch1, ch2, ch3,...)</li>
<li>Velocity scaling (Example: for each noteon event, scale the velocity by 1.27)</li>
<li>Velocity switching (Example: v <= 100: "Angel Choir"; v > 100: "Hell's
Bells")</li>
<li>Get rid of aftertouch</li>
</ul>
<p>The MIDI driver API has a clean separation between the midi thread and the synthesizer. That opens the door to add a midi router module.</p>
<p>MIDI events coming from the MIDI player do not pass through the MIDI router.</p>
<div class="fragment"><div class="line"><span class="preprocessor">#include <fluidsynth.h></span></div>
<div class="line"> </div>
<div class="line"><span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span>** argv) </div>
<div class="line">{</div>
<div class="line"> <a class="code" href="group__Types.html#gaa363402d3c77333b0f070ba531d034ba">fluid_settings_t</a>* settings;</div>
<div class="line"> <a class="code" href="group__Types.html#gae265f10ae174a13afe010de50d87e1a4">fluid_synth_t</a>* synth;</div>
<div class="line"> <a class="code" href="group__Types.html#gaa57b4746220e24506a169f109875e4ad">fluid_midi_router_t</a>* router;</div>
<div class="line"> <a class="code" href="group__Types.html#ga3154253ddb8f9b8f8f737c91f5973278">fluid_midi_router_rule_t</a>* rule;</div>
<div class="line"> </div>
<div class="line"> settings = <a class="code" href="group__settings.html#ga7623af35fb3d1abace21ef7d5b4f4781">new_fluid_settings</a>();</div>
<div class="line"> synth = <a class="code" href="group__synth.html#ga2aab8e0b82dc9fd086849efacb3c1b1b">new_fluid_synth</a>(settings);</div>
<div class="line"> </div>
<div class="line"> <span class="comment">/* Create the MIDI router and pass events to the synthesizer */</span></div>
<div class="line"> router = <a class="code" href="group__midi__router.html#ga11791201fd94c81226b2a7941634f615">new_fluid_midi_router</a> (settings, <a class="code" href="group__midi__input.html#ga2327ed7bf1ff702b0ec4095b59d7d660">fluid_synth_handle_midi_event</a>, synth);</div>
<div class="line"> </div>
<div class="line"> <span class="comment">/* Clear default rules */</span></div>
<div class="line"> <a class="code" href="group__midi__router.html#ga21a8b9673c43955d4296a6ec1b3f0632">fluid_midi_router_clear_rules</a> (router);</div>
<div class="line"> </div>
<div class="line"> <span class="comment">/* Add rule to map all notes < MIDI note #60 on any channel to channel 4 */</span></div>
<div class="line"> rule = <a class="code" href="group__midi__router.html#ga0e9d57b3665c4f4c18e9a03bd8b86f81">new_fluid_midi_router_rule</a> ();</div>
<div class="line"> <a class="code" href="group__midi__router.html#gaca7ef04a4f0342acd40eaad0df8a5c62">fluid_midi_router_rule_set_chan</a> (rule, 0, 15, 0.0, 4); <span class="comment">/* Map all to channel 4 */</span></div>
<div class="line"> <a class="code" href="group__midi__router.html#gad3db6e0086719832d9a31dac5f6acd48">fluid_midi_router_rule_set_param1</a> (rule, 0, 59, 1.0, 0); <span class="comment">/* Match notes < 60 */</span></div>
<div class="line"> <a class="code" href="group__midi__router.html#gafa33ca65b0db6aaf16627c1972edaeb3">fluid_midi_router_add_rule</a> (router, rule, <a class="code" href="group__midi__router.html#ggab798a0a5b95607556c9ecfbeaaab962ba44d3968ac6d884210bdace219f17c684">FLUID_MIDI_ROUTER_RULE_NOTE</a>);</div>
<div class="line"> </div>
<div class="line"> <span class="comment">/* Add rule to map all notes >= MIDI note #60 on any channel to channel 5 */</span></div>
<div class="line"> rule = <a class="code" href="group__midi__router.html#ga0e9d57b3665c4f4c18e9a03bd8b86f81">new_fluid_midi_router_rule</a> ();</div>
<div class="line"> <a class="code" href="group__midi__router.html#gaca7ef04a4f0342acd40eaad0df8a5c62">fluid_midi_router_rule_set_chan</a> (rule, 0, 15, 0.0, 5); <span class="comment">/* Map all to channel 5 */</span></div>
<div class="line"> <a class="code" href="group__midi__router.html#gad3db6e0086719832d9a31dac5f6acd48">fluid_midi_router_rule_set_param1</a> (rule, 60, 127, 1.0, 0); <span class="comment">/* Match notes >= 60 */</span></div>
<div class="line"> <a class="code" href="group__midi__router.html#gafa33ca65b0db6aaf16627c1972edaeb3">fluid_midi_router_add_rule</a> (router, rule, <a class="code" href="group__midi__router.html#ggab798a0a5b95607556c9ecfbeaaab962ba44d3968ac6d884210bdace219f17c684">FLUID_MIDI_ROUTER_RULE_NOTE</a>);</div>
<div class="line"> </div>
<div class="line"> <span class="comment">/* Add rule to reverse direction of pitch bender on channel 7 */</span></div>
<div class="line"> rule = <a class="code" href="group__midi__router.html#ga0e9d57b3665c4f4c18e9a03bd8b86f81">new_fluid_midi_router_rule</a> ();</div>
<div class="line"> <a class="code" href="group__midi__router.html#gaca7ef04a4f0342acd40eaad0df8a5c62">fluid_midi_router_rule_set_chan</a> (rule, 7, 7, 1.0, 0); <span class="comment">/* Match channel 7 only */</span></div>
<div class="line"> <a class="code" href="group__midi__router.html#gad3db6e0086719832d9a31dac5f6acd48">fluid_midi_router_rule_set_param1</a> (rule, 0, 16383, -1.0, 16383); <span class="comment">/* Reverse pitch bender */</span></div>
<div class="line"> <a class="code" href="group__midi__router.html#gafa33ca65b0db6aaf16627c1972edaeb3">fluid_midi_router_add_rule</a> (router, rule, <a class="code" href="group__midi__router.html#ggab798a0a5b95607556c9ecfbeaaab962ba087309f49bb501d67d74a9d5a128e621">FLUID_MIDI_ROUTER_RULE_PITCH_BEND</a>);</div>
<div class="line"> </div>
<div class="line"> <span class="comment">/* ... Create audio driver, process events, etc ... */</span></div>
<div class="line"> </div>
<div class="line"> <span class="comment">/* cleanup */</span></div>
<div class="line"> <a class="code" href="group__midi__router.html#ga434ab832c0cda10d153b558e62a75631">delete_fluid_midi_router</a>(router);</div>
<div class="line"> <a class="code" href="group__synth.html#gab42ea6e25476be548deb428c839d7d2b">delete_fluid_synth</a>(synth);</div>
<div class="line"> <a class="code" href="group__settings.html#gabd13a1e869bfaaaebfc58a72af5a66ac">delete_fluid_settings</a>(settings);</div>
<div class="line"> <span class="keywordflow">return</span> 0;</div>
<div class="line">}</div>
<div class="ttc" id="agroup__Types_html_ga3154253ddb8f9b8f8f737c91f5973278"><div class="ttname"><a href="group__Types.html#ga3154253ddb8f9b8f8f737c91f5973278">fluid_midi_router_rule_t</a></div><div class="ttdeci">struct _fluid_midi_router_rule_t fluid_midi_router_rule_t</div><div class="ttdoc">MIDI router rule.</div><div class="ttdef"><b>Definition:</b> types.h:51</div></div>
<div class="ttc" id="agroup__Types_html_gaa363402d3c77333b0f070ba531d034ba"><div class="ttname"><a href="group__Types.html#gaa363402d3c77333b0f070ba531d034ba">fluid_settings_t</a></div><div class="ttdeci">struct _fluid_hashtable_t fluid_settings_t</div><div class="ttdoc">Configuration settings instance.</div><div class="ttdef"><b>Definition:</b> types.h:37</div></div>
<div class="ttc" id="agroup__Types_html_gaa57b4746220e24506a169f109875e4ad"><div class="ttname"><a href="group__Types.html#gaa57b4746220e24506a169f109875e4ad">fluid_midi_router_t</a></div><div class="ttdeci">struct _fluid_midi_router_t fluid_midi_router_t</div><div class="ttdoc">MIDI router instance.</div><div class="ttdef"><b>Definition:</b> types.h:50</div></div>
<div class="ttc" id="agroup__Types_html_gae265f10ae174a13afe010de50d87e1a4"><div class="ttname"><a href="group__Types.html#gae265f10ae174a13afe010de50d87e1a4">fluid_synth_t</a></div><div class="ttdeci">struct _fluid_synth_t fluid_synth_t</div><div class="ttdoc">Synthesizer instance.</div><div class="ttdef"><b>Definition:</b> types.h:38</div></div>
<div class="ttc" id="agroup__midi__input_html_ga2327ed7bf1ff702b0ec4095b59d7d660"><div class="ttname"><a href="group__midi__input.html#ga2327ed7bf1ff702b0ec4095b59d7d660">fluid_synth_handle_midi_event</a></div><div class="ttdeci">int fluid_synth_handle_midi_event(void *data, fluid_midi_event_t *event)</div><div class="ttdoc">Handle MIDI event from MIDI router, used as a callback function.</div><div class="ttdef"><b>Definition:</b> fluid_synth.c:8020</div></div>
<div class="ttc" id="agroup__midi__router_html_ga0e9d57b3665c4f4c18e9a03bd8b86f81"><div class="ttname"><a href="group__midi__router.html#ga0e9d57b3665c4f4c18e9a03bd8b86f81">new_fluid_midi_router_rule</a></div><div class="ttdeci">fluid_midi_router_rule_t * new_fluid_midi_router_rule(void)</div><div class="ttdoc">Create a new MIDI router rule.</div><div class="ttdef"><b>Definition:</b> fluid_midi_router.c:375</div></div>
<div class="ttc" id="agroup__midi__router_html_ga11791201fd94c81226b2a7941634f615"><div class="ttname"><a href="group__midi__router.html#ga11791201fd94c81226b2a7941634f615">new_fluid_midi_router</a></div><div class="ttdeci">fluid_midi_router_t * new_fluid_midi_router(fluid_settings_t *settings, handle_midi_event_func_t handler, void *event_handler_data)</div><div class="ttdoc">Create a new midi router.</div><div class="ttdef"><b>Definition:</b> fluid_midi_router.c:85</div></div>
<div class="ttc" id="agroup__midi__router_html_ga21a8b9673c43955d4296a6ec1b3f0632"><div class="ttname"><a href="group__midi__router.html#ga21a8b9673c43955d4296a6ec1b3f0632">fluid_midi_router_clear_rules</a></div><div class="ttdeci">int fluid_midi_router_clear_rules(fluid_midi_router_t *router)</div><div class="ttdoc">Clear all rules in a MIDI router.</div><div class="ttdef"><b>Definition:</b> fluid_midi_router.c:260</div></div>
<div class="ttc" id="agroup__midi__router_html_ga434ab832c0cda10d153b558e62a75631"><div class="ttname"><a href="group__midi__router.html#ga434ab832c0cda10d153b558e62a75631">delete_fluid_midi_router</a></div><div class="ttdeci">void delete_fluid_midi_router(fluid_midi_router_t *handler)</div><div class="ttdoc">Delete a MIDI router instance.</div><div class="ttdef"><b>Definition:</b> fluid_midi_router.c:132</div></div>
<div class="ttc" id="agroup__midi__router_html_gaca7ef04a4f0342acd40eaad0df8a5c62"><div class="ttname"><a href="group__midi__router.html#gaca7ef04a4f0342acd40eaad0df8a5c62">fluid_midi_router_rule_set_chan</a></div><div class="ttdeci">void fluid_midi_router_rule_set_chan(fluid_midi_router_rule_t *rule, int min, int max, float mul, int add)</div><div class="ttdoc">Set the channel portion of a rule.</div><div class="ttdef"><b>Definition:</b> fluid_midi_router.c:443</div></div>
<div class="ttc" id="agroup__midi__router_html_gad3db6e0086719832d9a31dac5f6acd48"><div class="ttname"><a href="group__midi__router.html#gad3db6e0086719832d9a31dac5f6acd48">fluid_midi_router_rule_set_param1</a></div><div class="ttdeci">void fluid_midi_router_rule_set_param1(fluid_midi_router_rule_t *rule, int min, int max, float mul, int add)</div><div class="ttdoc">Set the first parameter portion of a rule.</div><div class="ttdef"><b>Definition:</b> fluid_midi_router.c:483</div></div>
<div class="ttc" id="agroup__midi__router_html_gafa33ca65b0db6aaf16627c1972edaeb3"><div class="ttname"><a href="group__midi__router.html#gafa33ca65b0db6aaf16627c1972edaeb3">fluid_midi_router_add_rule</a></div><div class="ttdeci">int fluid_midi_router_add_rule(fluid_midi_router_t *router, fluid_midi_router_rule_t *rule, int type)</div><div class="ttdoc">Add a rule to a MIDI router.</div><div class="ttdef"><b>Definition:</b> fluid_midi_router.c:331</div></div>
<div class="ttc" id="agroup__midi__router_html_ggab798a0a5b95607556c9ecfbeaaab962ba087309f49bb501d67d74a9d5a128e621"><div class="ttname"><a href="group__midi__router.html#ggab798a0a5b95607556c9ecfbeaaab962ba087309f49bb501d67d74a9d5a128e621">FLUID_MIDI_ROUTER_RULE_PITCH_BEND</a></div><div class="ttdeci">@ FLUID_MIDI_ROUTER_RULE_PITCH_BEND</div><div class="ttdoc">MIDI pitch bend rule.</div><div class="ttdef"><b>Definition:</b> midi.h:162</div></div>
<div class="ttc" id="agroup__midi__router_html_ggab798a0a5b95607556c9ecfbeaaab962ba44d3968ac6d884210bdace219f17c684"><div class="ttname"><a href="group__midi__router.html#ggab798a0a5b95607556c9ecfbeaaab962ba44d3968ac6d884210bdace219f17c684">FLUID_MIDI_ROUTER_RULE_NOTE</a></div><div class="ttdeci">@ FLUID_MIDI_ROUTER_RULE_NOTE</div><div class="ttdoc">MIDI note rule.</div><div class="ttdef"><b>Definition:</b> midi.h:159</div></div>
<div class="ttc" id="agroup__settings_html_ga7623af35fb3d1abace21ef7d5b4f4781"><div class="ttname"><a href="group__settings.html#ga7623af35fb3d1abace21ef7d5b4f4781">new_fluid_settings</a></div><div class="ttdeci">fluid_settings_t * new_fluid_settings(void)</div><div class="ttdoc">Create a new settings object.</div><div class="ttdef"><b>Definition:</b> fluid_settings.c:261</div></div>
<div class="ttc" id="agroup__settings_html_gabd13a1e869bfaaaebfc58a72af5a66ac"><div class="ttname"><a href="group__settings.html#gabd13a1e869bfaaaebfc58a72af5a66ac">delete_fluid_settings</a></div><div class="ttdeci">void delete_fluid_settings(fluid_settings_t *settings)</div><div class="ttdoc">Delete the provided settings object.</div><div class="ttdef"><b>Definition:</b> fluid_settings.c:285</div></div>
<div class="ttc" id="agroup__synth_html_ga2aab8e0b82dc9fd086849efacb3c1b1b"><div class="ttname"><a href="group__synth.html#ga2aab8e0b82dc9fd086849efacb3c1b1b">new_fluid_synth</a></div><div class="ttdeci">fluid_synth_t * new_fluid_synth(fluid_settings_t *settings)</div><div class="ttdoc">Create new FluidSynth instance.</div><div class="ttdef"><b>Definition:</b> fluid_synth.c:711</div></div>
<div class="ttc" id="agroup__synth_html_gab42ea6e25476be548deb428c839d7d2b"><div class="ttname"><a href="group__synth.html#gab42ea6e25476be548deb428c839d7d2b">delete_fluid_synth</a></div><div class="ttdeci">void delete_fluid_synth(fluid_synth_t *synth)</div><div class="ttdoc">Delete a FluidSynth instance.</div><div class="ttdef"><b>Definition:</b> fluid_synth.c:1192</div></div>
</div><!-- fragment --> </div></div><!-- contents -->
</div><!-- PageDoc -->
</div><!-- doc-content -->
</body>
</html>