コード例 #1
0
ファイル: Recline.cs プロジェクト: HeidenBZR/WavConfigTool
 public void AddOto(string alias, Oto oto)
 {
     Otos[alias] = oto;
 }
コード例 #2
0
        private Oto GenerateSingleOto(ProjectLine projectLine, int position, Phoneme[] phonemes, Dictionary <PhonemeType, List <Phoneme> > phonemesOfType, Phoneme next)
        {
            var recline = projectLine.Recline;

            Phoneme   p1 = phonemes.First();
            Phoneme   p2 = phonemes.Last();
            double    offset = 0, consonant = 0, cutoff = 0, preutterance = 0, overlap = 0;
            bool      hasZones  = p1.HasZone && p2.HasZone;
            AliasType aliasType = AliasTypeResolver.Current.GetAliasType(GetAliasType(phonemes));
            bool      masked    = aliasType != AliasType.undefined && Project.Reclist.WavMask.CanGenerateOnPosition(projectLine.Recline.Name, aliasType, position);
            var       p1Attack  = Project.AttackOfType(p1.Type);
            var       p2Attack  = Project.AttackOfType(p2.Type);

            if (!masked)
            {
                return(null);
            }

            string alias = Project.Replacer.MakeAlias(phonemes, aliasType);

            if (alias == null)
            {
                return(null);
            }

            bool hasAliasType = true;

            switch (aliasType)
            {
            // Absolute values, relative ones are made in Oto on write (!)
            case AliasType.V:
                offset       = p1.Zone.In + Project.DecayV;
                overlap      = p1.Zone.In + Project.DecayV + Project.DecayV;
                preutterance = overlap - 5;
                consonant    = overlap;
                cutoff       = p1.Zone.Out - p1Attack;
                break;

            // Ends with vowel
            case AliasType.VV:
            case AliasType.CV:
            case AliasType.CmV:
            case AliasType.VCV:
            case AliasType.VCmV:
                offset       = p1.Zone.Out - p1Attack < p1.Zone.In ? p1.Zone.In : p1.Zone.Out - p1Attack;
                overlap      = p1.Zone.Out;
                preutterance = p2.Zone.In;
                consonant    = p2.Zone.In + Project.DecayV;
                cutoff       = p2.Zone.Out - p2Attack;
                break;

            case AliasType.RV:
                offset       = p1.Zone.Out;
                overlap      = p1.Zone.Out + p1Attack;
                preutterance = p2.Zone.In;
                consonant    = p2.Zone.In + Project.DecayV;
                cutoff       = p2.Zone.Out - p2Attack;
                break;

            case AliasType.RCV:
            case AliasType.RCmV:
                offset       = p1.Zone.Out;
                overlap      = p1.Zone.Out + p1Attack;
                preutterance = p2.Zone.In;
                consonant    = p2.Zone.In + Project.DecayV;
                cutoff       = p2.Zone.Out - p2Attack;
                break;

            case AliasType.RC:
            case AliasType.RCm:
                var nextP  = next != null ? next.Zone.In : p2.Zone.Out;
                var firstC = phonemes[1];
                offset       = firstC.Zone.In - p1Attack;
                overlap      = firstC.Zone.In;
                preutterance = p2.Zone.In;
                consonant    = nextP + Project.DecayC;
                cutoff       = nextP + Project.DecayC + Project.AttackC;
                break;

            // Ends with Rest

            case AliasType.VR:
            case AliasType.VCR:
            case AliasType.VCmR:
                offset       = p1.Zone.Out - p1Attack;
                overlap      = p1.Zone.Out;
                preutterance = p2.Zone.In;
                consonant    = p2.Zone.Out + Project.DecayR;
                cutoff       = next == null || IsNextLast(next) ? 0 : next.Zone.In - Project.AttackR;
                break;

            case AliasType.CR:
            case AliasType.CmR:
                offset       = p1.Zone.In;
                overlap      = p1.Zone.Out;
                preutterance = p2.Zone.In;
                consonant    = p2.Zone.Out + Project.DecayR;
                cutoff       = next == null || IsNextLast(next) ? 0 : next.Zone.In - Project.AttackR;
                break;

            // Ends with Consonant
            case AliasType.VC:
            case AliasType.VCm:
            case AliasType.Cm:
                offset       = p1.Zone.Out - p1Attack;
                overlap      = p1.Zone.Out;
                preutterance = p2.Zone.In;
                consonant    = p2.Zone.Out - p2Attack;
                cutoff       = p2.Zone.Out;
                break;

            default:
                hasAliasType = false;
                break;
            }
            if (hasAliasType)
            {
                if (hasZones)
                {
                    var oto = new Oto(recline.Name, alias, offset, consonant, cutoff, preutterance, overlap);
                    oto.Smarty();
                    return(oto);
                }
                else if (MustGeneratePreoto)
                {
                    return(new Oto(recline.Name, alias, 10, 100, 150, 60, 40));
                }
            }
            return(null);
        }