Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
H
hydrumkit
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container registry
Model registry
Operate
Environments
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
ale
hydrumkit
Commits
a438797f
Commit
a438797f
authored
6 years ago
by
ale
Browse files
Options
Downloads
Patches
Plain Diff
Add comments to all drumkit methods
parent
06081bba
Branches
Branches containing commit
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
engine/drumkit.c
+40
-11
40 additions, 11 deletions
engine/drumkit.c
with
40 additions
and
11 deletions
engine/drumkit.c
+
40
−
11
View file @
a438797f
...
...
@@ -13,6 +13,7 @@
#include
"drumkit.h"
// Set default values on an instrument.
static
void
instrument_set_defaults
(
struct
instrument
*
ins
)
{
ins
->
pan_l
=
ins
->
pan_r
=
1
;
ins
->
gain
=
ins
->
volume
=
1
;
...
...
@@ -24,6 +25,7 @@ static void instrument_set_defaults(struct instrument *ins) {
ins
->
note
=
0
;
}
// Return a sndfile format value in human-readable format.
static
char
*
sf_format_name
(
int
format
)
{
static
char
fmtbuf
[
32
];
const
char
*
major
=
"weird"
,
*
subtype
=
NULL
;
...
...
@@ -52,6 +54,7 @@ static char *sf_format_name(int format) {
return
fmtbuf
;
}
// Dump instrument metadata to standard output.
static
void
print_instrument
(
struct
instrument
*
ins
)
{
int
i
;
printf
(
"instrument %s: pan=%g/%g, gain=%g
\n
"
,
ins
->
name
,
ins
->
pan_l
,
...
...
@@ -64,8 +67,11 @@ static void print_instrument(struct instrument *ins) {
}
}
// Return a string with the content of the result of an XPath
// expression (which should evaluate the text() of a single node), or
// NULL if the expression returned no nodes.
static
const
char
*
xpath_value_as_string
(
xmlNodePtr
node
,
const
char
*
xpathExpr
,
xmlXPathContextPtr
xpathCtx
)
{
xmlXPathContextPtr
xpathCtx
)
{
xmlXPathObjectPtr
res
;
const
char
*
content
;
res
=
xmlXPathNodeEval
(
node
,
(
const
xmlChar
*
)
xpathExpr
,
xpathCtx
);
...
...
@@ -80,6 +86,9 @@ static const char *xpath_value_as_string(xmlNodePtr node, const char *xpathExpr,
return
content
;
}
// Evaluate an XPath expression and store the result as a float. The
// value pointed by out won't be modified if the XPath expression has
// no result.
static
void
xpath_get_float
(
float
*
out
,
xmlNodePtr
node
,
const
char
*
xpathExpr
,
xmlXPathContextPtr
xpathCtx
)
{
const
char
*
s
;
...
...
@@ -91,6 +100,9 @@ static void xpath_get_float(float *out, xmlNodePtr node, const char *xpathExpr,
*
out
=
strtof
(
s
,
NULL
);
}
// Evaluate an XPath expression and store the result as an
// integer. The value pointed by out won't be modified if the XPath
// expression has no result.
static
void
xpath_get_int
(
int
*
out
,
xmlNodePtr
node
,
const
char
*
xpathExpr
,
xmlXPathContextPtr
xpathCtx
)
{
const
char
*
s
;
...
...
@@ -102,12 +114,16 @@ static void xpath_get_int(int *out, xmlNodePtr node, const char *xpathExpr,
*
out
=
atoi
(
s
);
}
// Evaluate an XPath expression and store the result as a string. The
// value pointed by out won't be modified if the XPath expression has
// no result. The string will always use newly allocated memory.
static
void
xpath_get_string
(
char
**
out
,
xmlNodePtr
node
,
const
char
*
xpathExpr
,
xmlXPathContextPtr
xpathCtx
)
{
*
out
=
strdup
(
xpath_value_as_string
(
node
,
xpathExpr
,
xpathCtx
));
}
// Count the number of nodes returned by an XPath expression.
static
int
xpath_count
(
xmlNodePtr
node
,
const
char
*
xpathExpr
,
xmlXPathContextPtr
xpathCtx
)
{
xmlXPathObjectPtr
res
;
int
n
;
...
...
@@ -134,12 +150,15 @@ static char *path_dirname(const char *filename) {
return
buf
;
}
// Join two path components. Return a newly allocated string.
static
char
*
path_join
(
const
char
*
base
,
const
char
*
filename
)
{
char
*
buf
=
(
char
*
)
malloc
(
strlen
(
base
)
+
strlen
(
filename
)
+
2
);
sprintf
(
buf
,
"%s/%s"
,
base
,
filename
);
return
buf
;
}
// Load audio file data into a sample. Will convert the sample rate to
// the desired target using libsamplerate.
static
int
load_sample_data
(
struct
sample
*
sample
,
SNDFILE
*
sndfile
,
int
target_samplerate
)
{
SF_INFO
*
info
=
&
sample
->
info
;
float
*
tmp
,
*
p
,
*
wl
,
*
wr
;
...
...
@@ -192,24 +211,25 @@ static int load_sample_data(struct sample *sample, SNDFILE *sndfile, int target_
return
1
;
}
// Load an audio file into a sample. Will convert the sample rate to
// the desired target using libsamplerate.
static
int
load_sample
(
struct
sample
*
sample
,
const
char
*
path
,
int
target_samplerate
)
{
SF_INFO
*
info
=
&
sample
->
info
;
SNDFILE
*
sndfile
;
int
r
=
1
;
int
r
;
sndfile
=
sf_open
(
path
,
SFM_READ
,
info
);
if
(
!
sndfile
)
{
printf
(
"failed to open sample %s: %s
\n
"
,
path
,
sf_strerror
(
NULL
));
f
printf
(
stderr
,
"failed to open sample %s: %s
\n
"
,
path
,
sf_strerror
(
NULL
));
return
0
;
}
// Read all the sample data.
if
(
!
load_sample_data
(
sample
,
sndfile
,
target_samplerate
))
{
printf
(
"failed to load sample data from %s
\n
"
,
path
);
r
=
0
;
}
// Read the sample data and convert it to the desired format/rate.
r
=
load_sample_data
(
sample
,
sndfile
,
target_samplerate
);
sf_close
(
sndfile
);
if
(
!
r
)
{
fprintf
(
stderr
,
"failed to load sample data from %s
\n
"
,
path
);
}
return
r
;
}
...
...
@@ -222,6 +242,7 @@ static void free_sample(struct sample *sample) {
}
}
// Parse an instrument layer from an XML document.
static
int
parse_layer
(
struct
layer
*
layer
,
xmlNodePtr
node
,
xmlXPathContextPtr
xpathCtx
,
const
char
*
basedir
,
int
target_samplerate
)
{
...
...
@@ -246,6 +267,7 @@ static void free_layer(struct layer *layer) {
free_sample
(
&
layer
->
sample
);
}
// Parse an instrument from an XML document.
static
int
parse_instrument
(
struct
instrument
*
ins
,
xmlNodePtr
node
,
xmlXPathContextPtr
xpathCtx
,
const
char
*
basedir
,
int
target_samplerate
)
{
...
...
@@ -309,17 +331,19 @@ static void free_instrument(struct instrument *ins) {
free
(
ins
->
name
);
}
// Find the instrument layer corresponding to a specific velocity.
struct
layer
*
instrument_find_layer_by_velocity
(
struct
instrument
*
ins
,
float
velocity
)
{
int
i
;
for
(
i
=
0
;
i
<
ins
->
num_layers
;
i
++
)
{
if
(
ins
->
layers
[
i
].
m
ax
>
velocity
)
{
if
(
velocity
>=
ins
->
layers
[
i
].
m
in
&&
velocity
<=
ins
->
layers
[
i
].
max
)
{
return
&
ins
->
layers
[
i
];
}
}
return
&
ins
->
layers
[
ins
->
num_layers
-
1
];
}
// Parse a list of instruments from an XML document.
static
int
parse_instruments
(
struct
instrument
**
instruments
,
xmlNodeSetPtr
nodes
,
xmlXPathContextPtr
xpathCtx
,
const
char
*
basedir
,
int
target_samplerate
)
{
...
...
@@ -345,7 +369,11 @@ static void free_instruments(struct instrument *instruments, int n) {
}
}
void
fix_midi_notes
(
struct
drumkit
*
kit
)
{
// Some drumkits lack an explicit MIDI note assignment: these are
// recognizable because they set all instruments to the same MIDI
// note. We can detect this situation and fix it with a default note
// assignment.
static
void
fix_midi_notes
(
struct
drumkit
*
kit
)
{
int
note_count
[
127
]
=
{
0
};
int
note_cardinality
=
0
;
int
i
;
...
...
@@ -377,6 +405,7 @@ struct drumkit *drumkit_new(const char *filename, int target_samplerate) {
return
kit
;
}
// Assign the Hydrogen drumkit namespace to all XML nodes in a document.
static
void
fix_bad_xml
(
xmlNodePtr
cur
,
xmlNsPtr
ns
)
{
for
(;
cur
;
cur
=
cur
->
next
)
{
if
(
cur
->
type
==
XML_ELEMENT_NODE
)
{
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment