1 |
/* |
/* |
2 |
* Copyright (C) 2006-2013 Andreas Persson |
* Copyright (C) 2006-2014 Andreas Persson |
3 |
* |
* |
4 |
* This program is free software; you can redistribute it and/or |
* This program is free software; you can redistribute it and/or |
5 |
* modify it under the terms of the GNU General Public License as |
* modify it under the terms of the GNU General Public License as |
55 |
if (pass == 0) { |
if (pass == 0) { |
56 |
cr->line_to(w, h); |
cr->line_to(w, h); |
57 |
cr->line_to(0, h); |
cr->line_to(0, h); |
58 |
cr->set_source_rgba(0.5, 0.44, 1.0, 0.2); |
cr->set_source_rgba(0.5, 0.44, 1.0, is_sensitive() ? 0.2 : 0.1); |
59 |
cr->fill(); |
cr->fill(); |
60 |
} else { |
} else { |
61 |
cr->set_line_width(3); |
cr->set_line_width(3); |
62 |
cr->set_source_rgb(0.5, 0.44, 1.0); |
cr->set_source_rgba(0.5, 0.44, 1.0, is_sensitive() ? 1.0 : 0.3); |
63 |
cr->stroke(); |
cr->stroke(); |
64 |
} |
} |
65 |
} |
} |
82 |
#else |
#else |
83 |
bool CrossfadeCurve::on_draw(const Cairo::RefPtr<Cairo::Context>& cr) { |
bool CrossfadeCurve::on_draw(const Cairo::RefPtr<Cairo::Context>& cr) { |
84 |
#endif |
#endif |
85 |
if (dimreg && dimreg->Crossfade.out_end) { |
if (dimreg) { |
|
int w = get_width(); |
|
|
int h = get_height(); |
|
|
|
|
86 |
cr->translate(1.5, 0); |
cr->translate(1.5, 0); |
87 |
|
|
88 |
|
// first, draw curves for the other layers |
89 |
|
gig::Region* region = dimreg->GetParent(); |
90 |
|
int dimregno; |
91 |
|
for (dimregno = 0 ; dimregno < region->DimensionRegions ; dimregno++) { |
92 |
|
if (region->pDimensionRegions[dimregno] == dimreg) { |
93 |
|
break; |
94 |
|
} |
95 |
|
} |
96 |
|
int bitcount = 0; |
97 |
|
for (int dim = 0 ; dim < region->Dimensions ; dim++) { |
98 |
|
if (region->pDimensionDefinitions[dim].dimension == |
99 |
|
gig::dimension_layer) { |
100 |
|
int mask = |
101 |
|
~(((1 << region->pDimensionDefinitions[dim].bits) - 1) << |
102 |
|
bitcount); |
103 |
|
int c = dimregno & mask; // mask away the layer dimension |
104 |
|
|
105 |
|
for (int i = 0 ; i < region->pDimensionDefinitions[dim].zones ; |
106 |
|
i++) { |
107 |
|
gig::DimensionRegion* d = |
108 |
|
region->pDimensionRegions[c + (i << bitcount)]; |
109 |
|
if (d != dimreg) { |
110 |
|
draw_one_curve(cr, d, false); |
111 |
|
} |
112 |
|
} |
113 |
|
break; |
114 |
|
} |
115 |
|
bitcount += region->pDimensionDefinitions[dim].bits; |
116 |
|
} |
117 |
|
|
118 |
|
// then, draw the currently selected layer |
119 |
|
draw_one_curve(cr, dimreg, is_sensitive()); |
120 |
|
} |
121 |
|
return true; |
122 |
|
} |
123 |
|
|
124 |
|
void CrossfadeCurve::draw_one_curve(const Cairo::RefPtr<Cairo::Context>& cr, |
125 |
|
const gig::DimensionRegion* d, |
126 |
|
bool sensitive) { |
127 |
|
int w = get_width(); |
128 |
|
int h = get_height(); |
129 |
|
|
130 |
|
if (d->Crossfade.out_end) { |
131 |
for (int pass = 0 ; pass < 2 ; pass++) { |
for (int pass = 0 ; pass < 2 ; pass++) { |
132 |
cr->move_to(dimreg->Crossfade.in_start / 127.0 * (w - 3), h); |
cr->move_to(d->Crossfade.in_start / 127.0 * (w - 3), h); |
133 |
cr->line_to(dimreg->Crossfade.in_end / 127.0 * (w - 3), 1.5); |
cr->line_to(d->Crossfade.in_end / 127.0 * (w - 3), 1.5); |
134 |
cr->line_to(dimreg->Crossfade.out_start / 127.0 * (w - 3), 1.5); |
cr->line_to(d->Crossfade.out_start / 127.0 * (w - 3), 1.5); |
135 |
cr->line_to(dimreg->Crossfade.out_end / 127.0 * (w - 3), h); |
cr->line_to(d->Crossfade.out_end / 127.0 * (w - 3), h); |
136 |
|
|
137 |
if (pass == 0) { |
if (pass == 0) { |
138 |
cr->set_source_rgba(0.5, 0.44, 1.0, 0.2); |
cr->set_source_rgba(0.5, 0.44, 1.0, sensitive ? 0.2 : 0.1); |
139 |
cr->fill(); |
cr->fill(); |
140 |
} else { |
} else { |
141 |
cr->set_line_width(3); |
cr->set_line_width(3); |
142 |
cr->set_source_rgb(0.5, 0.44, 1.0); |
cr->set_source_rgba(0.5, 0.44, 1.0, sensitive ? 1.0 : 0.3); |
143 |
cr->stroke(); |
cr->stroke(); |
144 |
} |
} |
145 |
} |
} |
146 |
} |
} |
|
return true; |
|
147 |
} |
} |
148 |
|
|
149 |
|
|
221 |
ePitchTrack(_("Pitch track")), |
ePitchTrack(_("Pitch track")), |
222 |
eDimensionBypass(_("Dimension bypass")), |
eDimensionBypass(_("Dimension bypass")), |
223 |
ePan(_("Pan"), -64, 63), |
ePan(_("Pan"), -64, 63), |
224 |
eSelfMask(_("Self mask")), |
eSelfMask(_("One note/voice per key (a.k.a \"Self mask\")")), |
225 |
eAttenuationController(_("Attenuation controller")), |
eAttenuationController(_("Attenuation controller")), |
226 |
eInvertAttenuationController(_("Invert attenuation controller")), |
eInvertAttenuationController(_("Invert attenuation controller")), |
227 |
eAttenuationControllerThreshold(_("Attenuation controller threshold")), |
eAttenuationControllerThreshold(_("Attenuation controller threshold")), |
228 |
eChannelOffset(_("Channel offset"), 0, 9), |
eChannelOffset(_("Channel offset"), 0, 9), |
229 |
eSustainDefeat(_("Sustain defeat")), |
eSustainDefeat(_("Ignore Hold Pedal (a.k.a. \"Sustain defeat\")")), |
230 |
eMSDecode(_("MS decode")), |
eMSDecode(_("MS decode")), |
231 |
eSampleStartOffset(_("Sample start offset"), 0, 2000), |
eSampleStartOffset(_("Sample start offset"), 0, 2000), |
232 |
eUnityNote(_("Unity note")), |
eUnityNote(_("Unity note")), |
397 |
addString(_("Sample"), lSample, wSample); |
addString(_("Sample"), lSample, wSample); |
398 |
//TODO: the following would break drag&drop: wSample->property_editable().set_value(false); or this: wSample->set_editable(false); |
//TODO: the following would break drag&drop: wSample->property_editable().set_value(false); or this: wSample->set_editable(false); |
399 |
#ifdef OLD_TOOLTIPS |
#ifdef OLD_TOOLTIPS |
400 |
tooltips.set_tip(*wSample, _("Drop a sample here")); |
tooltips.set_tip(*wSample, _("Drag & drop a sample here")); |
401 |
#else |
#else |
402 |
wSample->set_tooltip_text(_("Drop a sample here")); |
wSample->set_tooltip_text(_("Drag & drop a sample here")); |
403 |
#endif |
#endif |
404 |
addProp(eUnityNote); |
addProp(eUnityNote); |
405 |
addHeader(_("Optional Settings")); |
addHeader(_("Optional Settings")); |
682 |
eDimensionBypass.set_choices(choices, values); |
eDimensionBypass.set_choices(choices, values); |
683 |
} |
} |
684 |
addProp(eDimensionBypass); |
addProp(eDimensionBypass); |
685 |
|
eSelfMask.widget.set_tooltip_text(_("If enabled: high velocity notes will stop low velocity notes at the same note, that way you can save voices that wouldn't be audible anyway.")); |
686 |
addProp(eSelfMask); |
addProp(eSelfMask); |
687 |
|
eSustainDefeat.widget.set_tooltip_text(_("If enabled: sustain pedal will not hold a note.")); |
688 |
addProp(eSustainDefeat); |
addProp(eSustainDefeat); |
689 |
|
eMSDecode.widget.set_tooltip_text(_("Gigastudio specific flag: defines if Mid Side Recordings should be decoded.")); |
690 |
addProp(eMSDecode); |
addProp(eMSDecode); |
691 |
|
|
692 |
nextPage(); |
nextPage(); |
928 |
d->pSample ? d->pSample->LoopPlayCount : 0); |
d->pSample ? d->pSample->LoopPlayCount : 0); |
929 |
update_model--; |
update_model--; |
930 |
|
|
931 |
wSample->set_text(d->pSample ? d->pSample->pInfo->Name.c_str() : _("NULL")); |
wSample->set_text(d->pSample ? gig_to_utf8(d->pSample->pInfo->Name) : |
932 |
|
_("NULL")); |
933 |
|
|
934 |
update_loop_elements(); |
update_loop_elements(); |
935 |
VCFEnabled_toggled(); |
VCFEnabled_toggled(); |
944 |
eVCFVelocityCurve.set_sensitive(sensitive); |
eVCFVelocityCurve.set_sensitive(sensitive); |
945 |
eVCFVelocityScale.set_sensitive(sensitive); |
eVCFVelocityScale.set_sensitive(sensitive); |
946 |
eVCFVelocityDynamicRange.set_sensitive(sensitive); |
eVCFVelocityDynamicRange.set_sensitive(sensitive); |
947 |
|
cutoff_curve.set_sensitive(sensitive); |
948 |
eVCFResonance.set_sensitive(sensitive); |
eVCFResonance.set_sensitive(sensitive); |
949 |
eVCFResonanceController.set_sensitive(sensitive); |
eVCFResonanceController.set_sensitive(sensitive); |
950 |
eVCFKeyboardTracking.set_sensitive(sensitive); |
eVCFKeyboardTracking.set_sensitive(sensitive); |
1037 |
eCrossfade_in_end.set_sensitive(hasController); |
eCrossfade_in_end.set_sensitive(hasController); |
1038 |
eCrossfade_out_start.set_sensitive(hasController); |
eCrossfade_out_start.set_sensitive(hasController); |
1039 |
eCrossfade_out_end.set_sensitive(hasController); |
eCrossfade_out_end.set_sensitive(hasController); |
1040 |
|
crossfade_curve.set_sensitive(hasController); |
1041 |
} |
} |
1042 |
|
|
1043 |
void DimRegionEdit::LFO1Controller_changed() |
void DimRegionEdit::LFO1Controller_changed() |
1151 |
update_model--; |
update_model--; |
1152 |
} |
} |
1153 |
|
|
1154 |
bool DimRegionEdit::set_sample(gig::Sample* sample) |
bool DimRegionEdit::set_sample(gig::Sample* sample, bool copy_sample_unity, bool copy_sample_tune, bool copy_sample_loop) |
1155 |
{ |
{ |
1156 |
if (dimregion) { |
if (dimregion) { |
1157 |
//TODO: we should better move the code from MainWindow::on_sample_label_drop_drag_data_received() here |
//TODO: we should better move the code from MainWindow::on_sample_label_drop_drag_data_received() here |
1195 |
d[i]->pSample = sample; |
d[i]->pSample = sample; |
1196 |
|
|
1197 |
// copy sample information from Sample to DimensionRegion |
// copy sample information from Sample to DimensionRegion |
1198 |
|
if (copy_sample_unity) |
1199 |
d[i]->UnityNote = sample->MIDIUnityNote; |
d[i]->UnityNote = sample->MIDIUnityNote; |
1200 |
d[i]->FineTune = sample->FineTune; |
if (copy_sample_tune) |
1201 |
|
d[i]->FineTune = sample->FineTune; |
1202 |
int loops = sample->Loops ? 1 : 0; |
if (copy_sample_loop) { |
1203 |
while (d[i]->SampleLoops > loops) { |
int loops = sample->Loops ? 1 : 0; |
1204 |
d[i]->DeleteSampleLoop(&d[i]->pSampleLoops[0]); |
while (d[i]->SampleLoops > loops) { |
1205 |
} |
d[i]->DeleteSampleLoop(&d[i]->pSampleLoops[0]); |
1206 |
while (d[i]->SampleLoops < sample->Loops) { |
} |
1207 |
DLS::sample_loop_t loop; |
while (d[i]->SampleLoops < sample->Loops) { |
1208 |
d[i]->AddSampleLoop(&loop); |
DLS::sample_loop_t loop; |
1209 |
} |
d[i]->AddSampleLoop(&loop); |
1210 |
if (loops) { |
} |
1211 |
d[i]->pSampleLoops[0].Size = sizeof(DLS::sample_loop_t); |
if (loops) { |
1212 |
d[i]->pSampleLoops[0].LoopType = sample->LoopType; |
d[i]->pSampleLoops[0].Size = sizeof(DLS::sample_loop_t); |
1213 |
d[i]->pSampleLoops[0].LoopStart = sample->LoopStart; |
d[i]->pSampleLoops[0].LoopType = sample->LoopType; |
1214 |
d[i]->pSampleLoops[0].LoopLength = sample->LoopEnd - sample->LoopStart + 1; |
d[i]->pSampleLoops[0].LoopStart = sample->LoopStart; |
1215 |
|
d[i]->pSampleLoops[0].LoopLength = sample->LoopEnd - sample->LoopStart + 1; |
1216 |
|
} |
1217 |
} |
} |
1218 |
} |
} |
1219 |
|
|
1220 |
// update ui |
// update ui |
1221 |
update_model++; |
update_model++; |
1222 |
wSample->set_text(dimregion->pSample->pInfo->Name); |
wSample->set_text(gig_to_utf8(dimregion->pSample->pInfo->Name)); |
1223 |
eUnityNote.set_value(dimregion->UnityNote); |
eUnityNote.set_value(dimregion->UnityNote); |
1224 |
eFineTune.set_value(dimregion->FineTune); |
eFineTune.set_value(dimregion->FineTune); |
1225 |
eSampleLoopEnabled.set_value(dimregion->SampleLoops); |
eSampleLoopEnabled.set_value(dimregion->SampleLoops); |