예제 #1
0
 public static bool tryParseFloat(string s, ByRef <float> value)
 {
     try {
         value.value = (float)double.Parse(s);
     } catch (Exception ex) {
         return(false);
     }
     return(true);
 }
예제 #2
0
 public static bool tryParseInt(string s, ByRef <int> value)
 {
     try {
         value.value = int.Parse(s);
     } catch (Exception ex) {
         return(false);
     }
     return(true);
 }
예제 #3
0
 public void getKeyMinMax(ByRef <Double> min, ByRef <Double> max)
 {
     min.value = Default;
     max.value = Default;
     foreach (var bp in points)
     {
         min.value = Math.Min(min.value, bp.getBase().getX());
         max.value = Math.Max(max.value, bp.getBase().getX());
     }
 }
예제 #4
0
 public void getValueMinMax(ByRef <Double> min, ByRef <Double> max)
 {
     //todo: ベジエが有効なときに、曲線の描く最大値、最小値も考慮
     min.value = Default;
     max.value = Default;
     foreach (var bp in points)
     {
         min.value = Math.Min(min.value, bp.getBase().getY());
         max.value = Math.Max(max.value, bp.getBase().getY());
     }
 }
예제 #5
0
        public static string Attach(string roman)
        {
            char[] arr   = roman.ToCharArray();
            string ret   = "";
            int    index = 0;

            while (index < arr.Length)
            {
                // _MAX_MATCH~2文字のマッチ
                bool processed = false;
                for (int i = _MAX_MATCH; i >= 2; i--)
                {
                    if (index + (i - 1) < arr.Length)
                    {
                        string s = "";
                        for (int j = 0; j < i; j++)
                        {
                            s += "" + arr[index + j];
                        }
                        ByRef <Boolean> trailing = new ByRef <Boolean>();
                        string          res      = AttachCor(s, trailing);
                        if (res != s)
                        {
                            if (!trailing.value)
                            {
                                index = index + i;
                            }
                            else
                            {
                                index = index + i - 1;
                            }
                            ret      += res;
                            processed = true;
                            break;
                        }
                    }
                }
                if (processed)
                {
                    continue;
                }

                // 1文字のマッチ
                ByRef <Boolean> trailing1 = new ByRef <Boolean>();
                ret += AttachCor(arr[index] + "", trailing1);
                index++;
            }
            return(ret);
        }
예제 #6
0
        private static string AttachCor(string roman, ByRef <Boolean> trailing)
        {
            string s = roman.ToLower();

            trailing.value = false;
            if (s.Equals("a"))
            {
                return("あ");
            }
            else if (s.Equals("i") ||
                     s.Equals("yi"))
            {
                return("い");
            }
            else if (s.Equals("u") ||
                     s.Equals("wu"))
            {
                return("う");
            }
            else if (s.Equals("e"))
            {
                return("え");
            }
            else if (s.Equals("o"))
            {
                return("お");
            }
            else if (s.Equals("ka") ||
                     s.Equals("ca"))
            {
                return("か");
            }
            else if (s.Equals("ki"))
            {
                return("き");
            }
            else if (s.Equals("ku") ||
                     s.Equals("cu") ||
                     s.Equals("qu"))
            {
                return("く");
            }
            else if (s.Equals("ke"))
            {
                return("け");
            }
            else if (s.Equals("ko") ||
                     s.Equals("co"))
            {
                return("こ");
            }
            else if (s.Equals("sa"))
            {
                return("さ");
            }
            else if (s.Equals("si") ||
                     s.Equals("shi") ||
                     s.Equals("ci"))
            {
                return("し");
            }
            else if (s.Equals("su"))
            {
                return("す");
            }
            else if (s.Equals("se") ||
                     s.Equals("ce"))
            {
                return("せ");
            }
            else if (s.Equals("so"))
            {
                return("そ");
            }
            else if (s.Equals("ta"))
            {
                return("た");
            }
            else if (s.Equals("chi") ||
                     s.Equals("ti"))
            {
                return("ち");
            }
            else if (s.Equals("tu") ||
                     s.Equals("tsu"))
            {
                return("つ");
            }
            else if (s.Equals("te"))
            {
                return("て");
            }
            else if (s.Equals("to"))
            {
                return("と");
            }
            else if (s.Equals("na"))
            {
                return("な");
            }
            else if (s.Equals("ni"))
            {
                return("に");
            }
            else if (s.Equals("nu"))
            {
                return("ぬ");
            }
            else if (s.Equals("ne"))
            {
                return("ね");
            }
            else if (s.Equals("no"))
            {
                return("の");
            }
            else if (s.Equals("ha"))
            {
                return("は");
            }
            else if (s.Equals("hi"))
            {
                return("ひ");
            }
            else if (s.Equals("hu") ||
                     s.Equals("fu"))
            {
                return("ふ");
            }
            else if (s.Equals("he"))
            {
                return("へ");
            }
            else if (s.Equals("ho"))
            {
                return("ほ");
            }
            else if (s.Equals("ma"))
            {
                return("ま");
            }
            else if (s.Equals("mi"))
            {
                return("み");
            }
            else if (s.Equals("mu"))
            {
                return("む");
            }
            else if (s.Equals("me"))
            {
                return("め");
            }
            else if (s.Equals("mo"))
            {
                return("も");
            }
            else if (s.Equals("ya"))
            {
                return("や");
            }
            else if (s.Equals("yu"))
            {
                return("ゆ");
            }
            else if (s.Equals("ye"))
            {
                return("いぇ");
            }
            else if (s.Equals("yo"))
            {
                return("よ");
            }
            else if (s.Equals("ra"))
            {
                return("ら");
            }
            else if (s.Equals("ri"))
            {
                return("り");
            }
            else if (s.Equals("ru"))
            {
                return("る");
            }
            else if (s.Equals("re"))
            {
                return("れ");
            }
            else if (s.Equals("ro"))
            {
                return("ろ");
            }
            else if (s.Equals("wa"))
            {
                return("わ");
            }
            else if (s.Equals("wi"))
            {
                return("うぃ");
            }
            else if (s.Equals("wyi"))
            {
                return("ゐ");
            }
            else if (s.Equals("we"))
            {
                return("うぇ");
            }
            else if (s.Equals("wye"))
            {
                return("ゑ");
            }
            else if (s.Equals("wo"))
            {
                return("を");
            }
            else if (s.Equals("nn") ||
                     s.Equals("n"))
            {
                return("ん");
            }
            else if (s.Equals("ga"))
            {
                return("が");
            }
            else if (s.Equals("gi"))
            {
                return("ぎ");
            }
            else if (s.Equals("gu"))
            {
                return("ぐ");
            }
            else if (s.Equals("ge"))
            {
                return("げ");
            }
            else if (s.Equals("go"))
            {
                return("ご");
            }
            else if (s.Equals("za"))
            {
                return("ざ");
            }
            else if (s.Equals("zi") ||
                     s.Equals("ji"))
            {
                return("じ");
            }
            else if (s.Equals("zu"))
            {
                return("ず");
            }
            else if (s.Equals("ze"))
            {
                return("ぜ");
            }
            else if (s.Equals("zo"))
            {
                return("ぞ");
            }
            else if (s.Equals("da"))
            {
                return("だ");
            }
            else if (s.Equals("di"))
            {
                return("ぢ");
            }
            else if (s.Equals("du"))
            {
                return("づ");
            }
            else if (s.Equals("de"))
            {
                return("で");
            }
            else if (s.Equals("do"))
            {
                return("ど");
            }
            else if (s.Equals("ba"))
            {
                return("ば");
            }
            else if (s.Equals("bi"))
            {
                return("び");
            }
            else if (s.Equals("bu"))
            {
                return("ぶ");
            }
            else if (s.Equals("be"))
            {
                return("べ");
            }
            else if (s.Equals("bo"))
            {
                return("ぼ");
            }
            else if (s.Equals("pa"))
            {
                return("ぱ");
            }
            else if (s.Equals("pi"))
            {
                return("ぴ");
            }
            else if (s.Equals("pu"))
            {
                return("ぷ");
            }
            else if (s.Equals("pe"))
            {
                return("ぺ");
            }
            else if (s.Equals("po"))
            {
                return("ぽ");
            }
            else if (s.Equals("sha"))
            {
                return("しゃ");
            }
            else if (s.Equals("shu"))
            {
                return("しゅ");
            }
            else if (s.Equals("sho"))
            {
                return("しょ");
            }
            else if (s.Equals("cha") ||
                     s.Equals("tya"))
            {
                return("ちゃ");
            }
            else if (s.Equals("chu") ||
                     s.Equals("tyu"))
            {
                return("ちゅ");
            }
            else if (s.Equals("cho") ||
                     s.Equals("tyo"))
            {
                return("ちょ");
            }
            else if (s.Equals("dya"))
            {
                return("ぢゃ");
            }
            else if (s.Equals("dyu"))
            {
                return("ぢゅ");
            }
            else if (s.Equals("dyo"))
            {
                return("ぢょ");
            }
            else if (s.Equals("kwa"))
            {
                return("くゎ");
            }
            else if (s.Equals("kwi"))
            {
                return("くぃ");
            }
            else if (s.Equals("kwu"))
            {
                return("くぅ");
            }
            else if (s.Equals("kwe"))
            {
                return("くぇ");
            }
            else if (s.Equals("kwo"))
            {
                return("くぉ");
            }
            else if (s.Equals("gwa"))
            {
                return("ぐゎ");
            }
            else if (s.Equals("kya"))
            {
                return("きゃ");
            }
            else if (s.Equals("kyu"))
            {
                return("きゅ");
            }
            else if (s.Equals("kyo"))
            {
                return("きょ");
            }
            else if (s.Equals("sya"))
            {
                return("しゃ");
            }
            else if (s.Equals("syu"))
            {
                return("しゅ");
            }
            else if (s.Equals("syo"))
            {
                return("しょ");
            }
            else if (s.Equals("nya"))
            {
                return("にゃ");
            }
            else if (s.Equals("nyu"))
            {
                return("にゅ");
            }
            else if (s.Equals("nyo"))
            {
                return("にょ");
            }
            else if (s.Equals("mya"))
            {
                return("みゃ");
            }
            else if (s.Equals("myu"))
            {
                return("みゅ");
            }
            else if (s.Equals("myo"))
            {
                return("みょ");
            }
            else if (s.Equals("rya"))
            {
                return("りゃ");
            }
            else if (s.Equals("ryu"))
            {
                return("りゅ");
            }
            else if (s.Equals("ryo"))
            {
                return("りょ");
            }
            else if (s.Equals("gya"))
            {
                return("ぎゃ");
            }
            else if (s.Equals("gyu"))
            {
                return("ぎゅ");
            }
            else if (s.Equals("gyo"))
            {
                return("ぎょ");
            }
            else if (s.Equals("zya") ||
                     s.Equals("ja"))
            {
                return("じゃ");
            }
            else if (s.Equals("zyu") ||
                     s.Equals("ju"))
            {
                return("じゅ");
            }
            else if (s.Equals("zyo") ||
                     s.Equals("jo"))
            {
                return("じょ");
            }
            else if (s.Equals("bya"))
            {
                return("びゃ");
            }
            else if (s.Equals("byu"))
            {
                return("びゅ");
            }
            else if (s.Equals("byo"))
            {
                return("びょ");
            }
            else if (s.Equals("pya"))
            {
                return("ぴゃ");
            }
            else if (s.Equals("pyu"))
            {
                return("ぴゅ");
            }
            else if (s.Equals("pyo"))
            {
                return("ぴょ");
            }
            else if (s.Equals("la") ||
                     s.Equals("xa"))
            {
                return("ぁ");
            }
            else if (s.Equals("li") ||
                     s.Equals("xi") ||
                     s.Equals("lyi") ||
                     s.Equals("xyi"))
            {
                return("ぃ");
            }
            else if (s.Equals("lu") ||
                     s.Equals("xu"))
            {
                return("ぅ");
            }
            else if (s.Equals("le") ||
                     s.Equals("xe") ||
                     s.Equals("lye") ||
                     s.Equals("xye"))
            {
                return("ぇ");
            }
            else if (s.Equals("lo") ||
                     s.Equals("xo"))
            {
                return("ぉ");
            }
            else if (s.Equals("lya") ||
                     s.Equals("xya"))
            {
                return("ゃ");
            }
            else if (s.Equals("lyu") ||
                     s.Equals("xyu"))
            {
                return("ゅ");
            }
            else if (s.Equals("lyo") ||
                     s.Equals("xyo"))
            {
                return("ょ");
            }
            else if (s.Equals("lwa") ||
                     s.Equals("xwa"))
            {
                return("ゎ");
            }
            else if (s.Equals("ltu") ||
                     s.Equals("xtu") ||
                     s.Equals("xtsu") ||
                     s.Equals("ltsu"))
            {
                return("っ");
            }
            else if (s.Equals("va"))
            {
                return("ゔぁ");
            }
            else if (s.Equals("vi"))
            {
                return("ゔぃ");
            }
            else if (s.Equals("vu"))
            {
                return("ゔ");
            }
            else if (s.Equals("ve"))
            {
                return("ゔぇ");
            }
            else if (s.Equals("vo"))
            {
                return("ゔぉ");
            }
            else if (s.Equals("fa"))
            {
                return("ふぁ");
            }
            else if (s.Equals("fi"))
            {
                return("ふぃ");
            }
            else if (s.Equals("fe"))
            {
                return("ふぇ");
            }
            else if (s.Equals("fo"))
            {
                return("ふぉ");
            }
            else if (s.Equals("qa"))
            {
                return("くぁ");
            }
            else if (s.Equals("qi"))
            {
                return("くぃ");
            }
            else if (s.Equals("qe"))
            {
                return("くぇ");
            }
            else if (s.Equals("qo"))
            {
                return("くぉ");
            }
            else if (s.Equals("vyu"))
            {
                return("ゔゅ");
            }
            else if (s.Equals("qq") ||
                     s.Equals("ww") ||
                     s.Equals("rr") ||
                     s.Equals("tt") ||
                     s.Equals("yy") ||
                     s.Equals("pp") ||
                     s.Equals("ss") ||
                     s.Equals("dd") ||
                     s.Equals("ff") ||
                     s.Equals("gg") ||
                     s.Equals("hh") ||
                     s.Equals("jj") ||
                     s.Equals("kk") ||
                     s.Equals("ll") ||
                     s.Equals("zz") ||
                     s.Equals("xx") ||
                     s.Equals("cc") ||
                     s.Equals("vv") ||
                     s.Equals("bb") ||
                     s.Equals("mm"))
            {
                trailing.value = true;
                return("っ");
            }
            else if (s.Equals("-"))
            {
                return("ー");
            }
            else if (s.Equals("tha"))
            {
                return("てゃ");
            }
            else if (s.Equals("thi"))
            {
                return("てぃ");
            }
            else if (s.Equals("thu"))
            {
                return("てゅ");
            }
            else if (s.Equals("the"))
            {
                return("てぇ");
            }
            else if (s.Equals("tho"))
            {
                return("てょ");
            }
            else if (s.Equals("twa"))
            {
                return("とぁ");
            }
            else if (s.Equals("twi"))
            {
                return("とぃ");
            }
            else if (s.Equals("twu"))
            {
                return("とぅ");
            }
            else if (s.Equals("twe"))
            {
                return("とぇ");
            }
            else if (s.Equals("two"))
            {
                return("とぉ");
            }
            else if (s.Equals("dha"))
            {
                return("でゃ");
            }
            else if (s.Equals("dhi"))
            {
                return("でぃ");
            }
            else if (s.Equals("dhu"))
            {
                return("でゅ");
            }
            else if (s.Equals("dhe"))
            {
                return("でぇ");
            }
            else if (s.Equals("dho"))
            {
                return("でょ");
            }
            else if (s.Equals("wha"))
            {
                return("うぁ");
            }
            else if (s.Equals("whi"))
            {
                return("うぃ");
            }
            else if (s.Equals("whu"))
            {
                return("う");
            }
            else if (s.Equals("whe"))
            {
                return("うぇ");
            }
            else if (s.Equals("who"))
            {
                return("うぉ");
            }
            else if (s.Equals("lka") ||
                     s.Equals("xka"))
            {
                return("ヵ");
            }
            else if (s.Equals("lke") ||
                     s.Equals("xke"))
            {
                return("ヶ");
            }
            else if (s.Equals("tsa"))
            {
                return("つぁ");
            }
            else if (s.Equals("tsi"))
            {
                return("つぃ");
            }
            else if (s.Equals("tse"))
            {
                return("つぇ");
            }
            else if (s.Equals("tso"))
            {
                return("つぉ");
            }
            else if (s.Equals("jya"))
            {
                return("じゃ");
            }
            else if (s.Equals("jyu"))
            {
                return("じゅ");
            }
            else if (s.Equals("jyo"))
            {
                return("じょ");
            }
            else if (s.Equals("cya"))
            {
                return("ちゃ");
            }
            else if (s.Equals("cyi"))
            {
                return("ちぃ");
            }
            else if (s.Equals("cyu"))
            {
                return("ちゅ");
            }
            else if (s.Equals("cye"))
            {
                return("ちぇ");
            }
            else if (s.Equals("cyo"))
            {
                return("ちょ");
            }
            else if (s.Equals("dwa"))
            {
                return("どぁ");
            }
            else if (s.Equals("dwi"))
            {
                return("どぃ");
            }
            else if (s.Equals("dwu"))
            {
                return("どぅ");
            }
            else if (s.Equals("dwe"))
            {
                return("どぇ");
            }
            else if (s.Equals("dwo"))
            {
                return("どぉ");
            }
            else if (s.Equals("hwa"))
            {
                return("ふぁ");
            }
            else if (s.Equals("hwi"))
            {
                return("ふぃ");
            }
            else if (s.Equals("hwu"))
            {
                return("ふぇ");
            }
            else if (s.Equals("hwo"))
            {
                return("ふぉ");
            }
            else if (s.Equals("fyu") ||
                     s.Equals("hwyu"))
            {
                return("ふゅ");
            }
            return(roman);
        }
        /// <summary>
        /// 音符に付随するピッチベンドの情報を、PIT・PBS カーブに反映する
        /// </summary>
        /// <param name="item">音符</param>
        /// <param name="pitchBend">PIT カーブ</param>
        /// <param name="pitchBendSensitivity">PBS カーブ</param>
        /// <param name="tempoTable">テンポ情報</param>
        protected void reflectNoteEventPitch(VsqEvent item, VsqBPList pitchBend, VsqBPList pitchBendSensitivity, TempoVector tempoTable)
        {
            if (item.ID.type != VsqIDType.Anote)
            {
                return;
            }

            // AquesTone2 では、note on と同 clock にピッチベンドイベントを送らないと音程が反映されないので、必ずピッチイベントが送られるようにする
            pitchBend.add(item.Clock, pitchBend.getValue(item.Clock));

            if (item.ID.VibratoHandle == null)
            {
                return;
            }

            int startClock    = item.Clock + item.ID.VibratoDelay;
            int vibratoLength = item.ID.Length - item.ID.VibratoDelay;

            var iterator = new VibratoPointIteratorByClock(tempoTable,
                                                           item.ID.VibratoHandle.RateBP, item.ID.VibratoHandle.StartRate,
                                                           item.ID.VibratoHandle.DepthBP, item.ID.VibratoHandle.StartDepth,
                                                           startClock, vibratoLength);
            var pitContext = new ByRef <int>(0);
            var pbsContext = new ByRef <int>(0);

            int pitAtEnd  = pitchBend.getValue(startClock + vibratoLength);
            int pbsAtEnd  = pitchBendSensitivity.getValue(startClock + vibratoLength);
            var pitBackup = (VsqBPList)pitchBend.Clone();
            var pbsBackup = (VsqBPList)pitchBendSensitivity.Clone();

            bool   resetPBS = false;
            double maxNetPitchBendInCent = 0.0;

            for (int clock = startClock; clock < startClock + vibratoLength && iterator.hasNext(); ++clock)
            {
                double       vibratoPitchBendInCent = iterator.next() * 100.0;
                int          pit                = pitchBend.getValue(clock, pitContext);
                int          pbs                = pitchBendSensitivity.getValue(clock, pbsContext);
                const double pow2_13            = 8192;
                double       netPitchBendInCent = (pbs * pit / pow2_13) * 100.0 + vibratoPitchBendInCent;
                maxNetPitchBendInCent = Math.Max(maxNetPitchBendInCent, Math.Abs(netPitchBendInCent));
                int draftPitchBend = (int)Math.Round((netPitchBendInCent / 100.0) * pow2_13 / pbs);

                if (draftPitchBend < pitchBend.Minimum || pitchBend.Maximum < draftPitchBend)
                {
                    // pbs を変更せずにビブラートによるピッチベンドを反映しようとすると、
                    // pit が範囲を超えてしまう。
                    resetPBS = true;
                }
                else
                {
                    if (draftPitchBend != pit)
                    {
                        pitchBend.add(clock, draftPitchBend);
                    }
                }
            }

            if (!resetPBS)
            {
                return;
            }

            pitchBend.Data = pitBackup.Data;

            // ピッチベンドの最大値を実現するのに必要なPBS
            int requiredPitchbendSensitivity  = (int)Math.Ceiling(maxNetPitchBendInCent / 100.0);
            int pseudoMaxPitchbendSensitivity = 12; // AquesTone2 は最大 12 半音までベンドできる。

            if (requiredPitchbendSensitivity < pitchBendSensitivity.Minimum)
            {
                requiredPitchbendSensitivity = pitchBendSensitivity.Minimum;
            }
            if (pseudoMaxPitchbendSensitivity < requiredPitchbendSensitivity)
            {
                requiredPitchbendSensitivity = pseudoMaxPitchbendSensitivity;
            }

            {
                int i = 0;
                while (i < pitchBend.size())
                {
                    var clock = pitchBend.getKeyClock(i);
                    if (startClock <= clock && clock < startClock + vibratoLength)
                    {
                        pitchBend.removeElementAt(i);
                    }
                    else
                    {
                        ++i;
                    }
                }
            }
            {
                int i = 0;
                while (i < pitchBendSensitivity.size())
                {
                    var clock = pitchBendSensitivity.getKeyClock(i);
                    if (startClock <= clock && clock < startClock + vibratoLength)
                    {
                        pitchBendSensitivity.removeElementAt(i);
                    }
                    else
                    {
                        ++i;
                    }
                }
            }
            if (pitchBendSensitivity.getValue(startClock) != requiredPitchbendSensitivity)
            {
                pitchBendSensitivity.add(startClock, requiredPitchbendSensitivity);
            }
            pitchBend.add(startClock + vibratoLength, pitAtEnd);
            pitchBendSensitivity.add(startClock + vibratoLength, pbsAtEnd);

            iterator.rewind();
            pitContext.value = 0;
            pbsContext.value = 0;
            int lastPitchBend = pitchBend.getValue(startClock);

            for (int clock = startClock; clock < startClock + vibratoLength && iterator.hasNext(); ++clock)
            {
                double vibratoPitchBendInCent = iterator.next() * 100.0;
                int    pit = pitBackup.getValue(clock, pitContext);
                int    pbs = pbsBackup.getValue(clock, pbsContext);

                const double pow2_13            = 8192;
                double       netPitchBendInCent = (pbs * pit / pow2_13) * 100.0 + vibratoPitchBendInCent;
                maxNetPitchBendInCent = Math.Max(maxNetPitchBendInCent, Math.Abs(netPitchBendInCent));
                int draftPitchBend = (int)Math.Round((netPitchBendInCent / 100.0) * pow2_13 / requiredPitchbendSensitivity);
                if (draftPitchBend < pitchBend.Minimum)
                {
                    draftPitchBend = pitchBend.Minimum;
                }
                if (pitchBend.Maximum < draftPitchBend)
                {
                    draftPitchBend = pitchBend.Maximum;
                }
                if (draftPitchBend != lastPitchBend)
                {
                    pitchBend.add(clock, draftPitchBend);
                    lastPitchBend = draftPitchBend;
                }
            }
        }