Skip to content

Commit

Permalink
Add Volume parameter in instrument editor (close #29)
Browse files Browse the repository at this point in the history
  • Loading branch information
munshkr committed Apr 11, 2013
1 parent 0387275 commit 07d7def
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 18 deletions.
12 changes: 12 additions & 0 deletions src/fm.c
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,9 @@ unsigned int fm_get_carrier_release_rate(const fm_instr_t* instr) {
fm_waveform_type_t fm_get_carrier_waveform_type(const fm_instr_t* instr) {
return instr->c__waveform & 0x7;
}
unsigned int fm_get_carrier_level(const fm_instr_t* instr) {
return instr->c__ksl_volume & 0x3f;
}
unsigned int fm_get_modulator_attack_rate(const fm_instr_t* instr) {
return (instr->m__attack_decay >> 4) & 0xf;
}
Expand All @@ -140,6 +143,9 @@ unsigned int fm_get_modulator_release_rate(const fm_instr_t* instr) {
fm_waveform_type_t fm_get_modulator_waveform_type(const fm_instr_t* instr) {
return instr->m__waveform & 0x7;
}
unsigned int fm_get_modulator_level(const fm_instr_t* instr) {
return instr->m__ksl_volume & 0x3f;
}

// fm_instr_t setters
void fm_set_carrier_attack_rate(fm_instr_t* instr, unsigned int value) {
Expand All @@ -157,6 +163,9 @@ void fm_set_carrier_release_rate(fm_instr_t* instr, unsigned int value) {
void fm_set_carrier_waveform_type(fm_instr_t* instr, fm_waveform_type_t value) {
instr->c__waveform = value & 0x7;
}
void fm_set_carrier_level(fm_instr_t* instr, unsigned int value) {
instr->c__ksl_volume = (instr->c__ksl_volume & 0xc0) | (value & 0x3f);
}
void fm_set_modulator_attack_rate(fm_instr_t* instr, unsigned int value) {
instr->m__attack_decay = ((value & 0xf) << 4) | (instr->m__attack_decay & 0xf);
}
Expand All @@ -172,6 +181,9 @@ void fm_set_modulator_release_rate(fm_instr_t* instr, unsigned int value) {
void fm_set_modulator_waveform_type(fm_instr_t* instr, fm_waveform_type_t value) {
instr->m__waveform = value & 0x7;
}
void fm_set_modulator_level(fm_instr_t* instr, unsigned int value) {
instr->m__ksl_volume = (instr->m__ksl_volume & 0xc0) | (value & 0x3f);
}

static __inline__ void fm_write(const int reg, const int value) {
// set requested register into address port
Expand Down
4 changes: 4 additions & 0 deletions src/fm.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,22 +39,26 @@ unsigned int fm_get_carrier_decay_rate(const fm_instr_t* instr);
unsigned int fm_get_carrier_sustain_level(const fm_instr_t* instr);
unsigned int fm_get_carrier_release_rate(const fm_instr_t* instr);
fm_waveform_type_t fm_get_carrier_waveform_type(const fm_instr_t* instr);
unsigned int fm_get_carrier_level(const fm_instr_t* instr);
unsigned int fm_get_modulator_attack_rate(const fm_instr_t* instr);
unsigned int fm_get_modulator_decay_rate(const fm_instr_t* instr);
unsigned int fm_get_modulator_sustain_level(const fm_instr_t* instr);
unsigned int fm_get_modulator_release_rate(const fm_instr_t* instr);
fm_waveform_type_t fm_get_modulator_waveform_type(const fm_instr_t* instr);
unsigned int fm_get_modulator_level(const fm_instr_t* instr);

// fm_instr_t setters
void fm_set_carrier_attack_rate(fm_instr_t* instr, unsigned int value);
void fm_set_carrier_decay_rate(fm_instr_t* instr, unsigned int value);
void fm_set_carrier_sustain_level(fm_instr_t* instr, unsigned int value);
void fm_set_carrier_release_rate(fm_instr_t* instr, unsigned int value);
void fm_set_carrier_waveform_type(fm_instr_t* instr, fm_waveform_type_t value);
void fm_set_carrier_level(fm_instr_t* instr, unsigned int value);
void fm_set_modulator_attack_rate(fm_instr_t* instr, unsigned int value);
void fm_set_modulator_decay_rate(fm_instr_t* instr, unsigned int value);
void fm_set_modulator_sustain_level(fm_instr_t* instr, unsigned int value);
void fm_set_modulator_release_rate(fm_instr_t* instr, unsigned int value);
void fm_set_modulator_waveform_type(fm_instr_t* instr, fm_waveform_type_t value);
void fm_set_modulator_level(fm_instr_t* instr, unsigned int value);

#endif // __FM_H__
54 changes: 36 additions & 18 deletions src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -381,7 +381,7 @@ void instrument_editor_move(const direction_t dir) {
if (dir == Up && current_instr_field > 0) {
current_instr_field--;
dirty = true;
} else if (dir == Down && current_instr_field < 9) {
} else if (dir == Down && current_instr_field < 11) {
current_instr_field++;
dirty = true;
}
Expand All @@ -401,15 +401,19 @@ unsigned int get_value_for_instrument(const instr_t* ins, const unsigned int fie
case 4:
return fm_get_carrier_waveform_type(fm);
case 5:
return fm_get_modulator_attack_rate(fm);
return fm_get_carrier_level(fm);
case 6:
return fm_get_modulator_decay_rate(fm);
return fm_get_modulator_attack_rate(fm);
case 7:
return fm_get_modulator_sustain_level(fm);
return fm_get_modulator_decay_rate(fm);
case 8:
return fm_get_modulator_release_rate(fm);
return fm_get_modulator_sustain_level(fm);
case 9:
return fm_get_modulator_release_rate(fm);
case 10:
return fm_get_modulator_waveform_type(fm);
case 11:
return fm_get_modulator_level(fm);
}
return 0;
}
Expand All @@ -433,20 +437,26 @@ void set_value_for_instrument(instr_t* ins, const unsigned int field, const unsi
fm_set_carrier_waveform_type(fm, value);
break;
case 5:
fm_set_modulator_attack_rate(fm, value);
fm_set_carrier_level(fm, value);
break;
case 6:
fm_set_modulator_decay_rate(fm, value);
fm_set_modulator_attack_rate(fm, value);
break;
case 7:
fm_set_modulator_sustain_level(fm, value);
fm_set_modulator_decay_rate(fm, value);
break;
case 8:
fm_set_modulator_release_rate(fm, value);
fm_set_modulator_sustain_level(fm, value);
break;
case 9:
fm_set_modulator_release_rate(fm, value);
break;
case 10:
fm_set_modulator_waveform_type(fm, value);
break;
case 11:
fm_set_modulator_level(fm, value);
break;
}
}

Expand All @@ -457,8 +467,10 @@ void instrument_editor_change(const action_t action) {
unsigned int value = get_value_for_instrument(ins, current_instr_field);

if (action == Increase &&
(((current_instr_field == 4 || current_instr_field == 9) && value < 7) ||
((current_instr_field != 4 && current_instr_field != 9) && value < 15)))
( ((current_instr_field == 4 || current_instr_field == 10) && value < 7) ||
((current_instr_field == 5 || current_instr_field == 11) && value < 31) ||
((current_instr_field != 4 && current_instr_field != 5 &&
current_instr_field != 10 && current_instr_field != 11) && value < 15)) )
{
value++;
set_value_for_instrument(ins, current_instr_field, value);
Expand Down Expand Up @@ -633,17 +645,19 @@ void render_hits()
#define C_COL_TOP 10
#define M_COL_TOP C_COL_TOP

const unsigned int instr_fields_pos[10][2] = {
const unsigned int instr_fields_pos[12][2] = {
{ C_COL_LEFT + 120, C_COL_TOP + 20 },
{ C_COL_LEFT + 120, C_COL_TOP + 35 },
{ C_COL_LEFT + 120, C_COL_TOP + 50 },
{ C_COL_LEFT + 120, C_COL_TOP + 65 },
{ C_COL_LEFT + 120, C_COL_TOP + 80 },
{ C_COL_LEFT + 120, C_COL_TOP + 95 },
{ M_COL_LEFT + 120, M_COL_TOP + 20 },
{ M_COL_LEFT + 120, M_COL_TOP + 35 },
{ M_COL_LEFT + 120, M_COL_TOP + 50 },
{ M_COL_LEFT + 120, M_COL_TOP + 65 },
{ M_COL_LEFT + 120, M_COL_TOP + 80 },
{ M_COL_LEFT + 120, M_COL_TOP + 95 },
};

void render_instrument_editor()
Expand All @@ -658,25 +672,29 @@ void render_instrument_editor()
render_str(&font, C_COL_LEFT, C_COL_TOP + 50, 7, "Sustain Level");
render_str(&font, C_COL_LEFT, C_COL_TOP + 65, 7, "Release Rate:");
render_str(&font, C_COL_LEFT, C_COL_TOP + 80, 7, "Waveform:");
render_str(&font, C_COL_LEFT, C_COL_TOP + 95, 7, "Volume:");
render_str(&font, M_COL_LEFT, M_COL_TOP, 7, "Modulator");
render_str(&font, M_COL_LEFT, M_COL_TOP + 20, 7, "Attack Rate:");
render_str(&font, M_COL_LEFT, M_COL_TOP + 35, 7, "Decay Rate:");
render_str(&font, M_COL_LEFT, M_COL_TOP + 50, 7, "Sustain Level:");
render_str(&font, M_COL_LEFT, M_COL_TOP + 65, 7, "Release Rate:");
render_str(&font, M_COL_LEFT, M_COL_TOP + 80, 7, "Waveform:");
render_str(&font, M_COL_LEFT, M_COL_TOP + 95, 7, "Volume:");

// Render field values
render_strf(&font, instr_fields_pos[0][0], instr_fields_pos[0][1], 7, "%X", (fm->c__attack_decay >> 4) & 0xf);
render_strf(&font, instr_fields_pos[1][0], instr_fields_pos[1][1], 7, "%X", fm->c__attack_decay & 0xf);
render_strf(&font, instr_fields_pos[2][0], instr_fields_pos[2][1], 7, "%X", (fm->c__sustain_release >> 4) & 0xf);
render_strf(&font, instr_fields_pos[3][0], instr_fields_pos[3][1], 7, "%X", fm->c__sustain_release & 0xf);
render_strf(&font, instr_fields_pos[4][0], instr_fields_pos[4][1], 7, "%X", fm_get_carrier_waveform_type(fm));

render_strf(&font, instr_fields_pos[5][0], instr_fields_pos[5][1], 7, "%X", (fm->m__attack_decay >> 4) & 0xf);
render_strf(&font, instr_fields_pos[6][0], instr_fields_pos[6][1], 7, "%X", fm->m__attack_decay & 0xf);
render_strf(&font, instr_fields_pos[7][0], instr_fields_pos[7][1], 7, "%X", (fm->m__sustain_release >> 4) & 0xf);
render_strf(&font, instr_fields_pos[8][0], instr_fields_pos[8][1], 7, "%X", fm->m__sustain_release & 0xf);
render_strf(&font, instr_fields_pos[9][0], instr_fields_pos[9][1], 7, "%X", fm_get_modulator_waveform_type(fm));
render_strf(&font, instr_fields_pos[5][0], instr_fields_pos[5][1], 7, "%X", fm_get_carrier_level(fm));

render_strf(&font, instr_fields_pos[6][0], instr_fields_pos[6][1], 7, "%X", (fm->m__attack_decay >> 4) & 0xf);
render_strf(&font, instr_fields_pos[7][0], instr_fields_pos[7][1], 7, "%X", fm->m__attack_decay & 0xf);
render_strf(&font, instr_fields_pos[8][0], instr_fields_pos[8][1], 7, "%X", (fm->m__sustain_release >> 4) & 0xf);
render_strf(&font, instr_fields_pos[9][0], instr_fields_pos[9][1], 7, "%X", fm->m__sustain_release & 0xf);
render_strf(&font, instr_fields_pos[10][0], instr_fields_pos[10][1], 7, "%X", fm_get_modulator_waveform_type(fm));
render_strf(&font, instr_fields_pos[11][0], instr_fields_pos[11][1], 7, "%X", fm_get_modulator_level(fm));

// draw "current field" rectangle
rect(instr_fields_pos[current_instr_field][0] - 4,
Expand Down

0 comments on commit 07d7def

Please sign in to comment.