66 |
} |
} |
67 |
|
|
68 |
Voice::RegionInfo Voice::GetRegionInfo() { |
Voice::RegionInfo Voice::GetRegionInfo() { |
69 |
|
::sf2::Region* reg = NULL; |
70 |
|
::sf2::Preset* preset = GetSf2EngineChannel()->pInstrument; |
71 |
|
for (int i = 0; i < preset->GetRegionCount(); i++) { // TODO: some optimization? |
72 |
|
if (preset->GetRegion(i)->pInstrument == pRegion->GetParentInstrument()) { |
73 |
|
reg = preset->GetRegion(i); // TODO: Can the instrument belongs to more than one preset regions? |
74 |
|
break; |
75 |
|
} |
76 |
|
} |
77 |
|
|
78 |
RegionInfo ri; |
RegionInfo ri; |
79 |
ri.UnityNote = pRegion->GetUnityNote(); |
ri.UnityNote = pRegion->GetUnityNote(); |
80 |
ri.FineTune = pRegion->fineTune; |
ri.FineTune = pRegion->GetFineTune(reg) + (pRegion->GetCoarseTune(reg) * 100); |
81 |
ri.Pan = pRegion->pan; |
ri.Pan = pRegion->GetPan(reg); |
82 |
ri.SampleStartOffset = pRegion->startAddrsOffset + pRegion->startAddrsCoarseOffset; |
ri.SampleStartOffset = pRegion->startAddrsOffset + pRegion->startAddrsCoarseOffset; |
83 |
|
|
84 |
|
// sample amplitude |
85 |
ri.EG1PreAttack = 1000; |
ri.EG1PreAttack = 1000; |
86 |
ri.EG1Attack = pRegion->EG1Attack; |
ri.EG1Attack = pRegion->GetEG1Attack(reg); |
87 |
ri.EG1Hold = pRegion->EG1Hold; |
ri.EG1Hold = pRegion->GetEG1Hold(reg); |
88 |
ri.EG1Decay1 = pRegion->EG1Decay; |
ri.EG1Decay1 = pRegion->GetEG1Decay(reg); |
89 |
ri.EG1Decay2 = pRegion->EG1Decay; |
ri.EG1Decay2 = pRegion->GetEG1Decay(reg); |
90 |
ri.EG1Sustain = pRegion->EG1Sustain; |
ri.EG1Sustain = pRegion->GetEG1Sustain(reg); |
91 |
ri.EG1InfiniteSustain = true; |
ri.EG1InfiniteSustain = true; |
92 |
ri.EG1Release = pRegion->EG1Release; |
ri.EG1Release = pRegion->GetEG1Release(reg); |
93 |
|
|
94 |
|
// filter cutoff frequency |
95 |
ri.EG2PreAttack = 1000; |
ri.EG2PreAttack = 1000; |
96 |
ri.EG2Attack = pRegion->EG2Attack; |
ri.EG2Attack = pRegion->GetEG2Attack(reg); |
97 |
//ri.EG2Hold = pRegion->EG2Hold; // TODO: |
//ri.EG2Hold = pRegion->EG2Hold; // TODO: |
98 |
ri.EG2Decay1 = pRegion->EG2Decay; |
ri.EG2Decay1 = pRegion->GetEG2Decay(reg); |
99 |
ri.EG2Decay2 = pRegion->EG2Decay; |
ri.EG2Decay2 = pRegion->GetEG2Decay(reg); |
100 |
ri.EG2Sustain = pRegion->EG2Sustain; |
ri.EG2Sustain = pRegion->GetEG2Sustain(reg); |
101 |
ri.EG2InfiniteSustain = true; |
ri.EG2InfiniteSustain = true; |
102 |
ri.EG2Release = pRegion->EG2Release; |
ri.EG2Release = pRegion->GetEG2Release(reg); |
103 |
|
|
104 |
|
// sample pitch |
105 |
ri.EG3Attack = 0; // TODO: |
ri.EG3Attack = 0; // TODO: |
106 |
ri.EG3Depth = 0; // TODO: |
ri.EG3Depth = 0; // TODO: |
107 |
ri.VCFEnabled = false; // TODO: |
ri.VCFEnabled = false; // TODO: |