Moduler>Assemblies>Lyd
Frøken Ur
Bibioteket har en klasse: saynumber med følgende tilgjengelige metoder:
public static void Say(int i) { sndList.Clear(); doInt(i); PlaySoundList(); } public static void Say(double d) { sndList.Clear(); doDouble(d); } public static void Say(float f) { Say((double)f); } public static void SayNumberSequence(String s) { sndList.Clear(); // any number of :-separated numbers // typically a timestring hh:mm:ss String[] pieces = s.Split(':'); for (int ix = 0; ix < pieces.Length; ix++) { try { int t = Convert.ToInt32(pieces[ix]); doInt(t); } catch (Exception ex) { try { double t = Convert.ToDouble(pieces[ix]); doDouble(t); } catch (Exception ex2) { // error, bad format SayError(); } } SaySpace(); } PlaySoundList(); }
Implementasjonen er bygget på to statiske variable:
protected static SoundPlayer snd = new SoundPlayer(); protected static ArrayList sndList = new ArrayList(10);
De interne metodene er disse:
protected static void SayError() { sndList.Add(Properties.Resources.BUSYFONE); } protected static void SayEtt() { sndList.Add(Properties.Resources._1TT); } protected static void SayNull() { sndList.Add(Properties.Resources._0); } protected static void Say1000000() { sndList.Add(Properties.Resources._1000000); } protected static void Say1000() { sndList.Add(Properties.Resources._1000); } protected static void Say100() { sndList.Add(Properties.Resources._100); } protected static void SayAnd() { sndList.Add(Properties.Resources.OG); } protected static void SayComma() { sndList.Add(Properties.Resources.KOMMA); } protected static void SayMinus() { sndList.Add(Properties.Resources.MINUS); } protected static void SayPlus() { sndList.Add(Properties.Resources.PLUSS); } protected static void SaySpace() { sndList.Add(Properties.Resources.SPACE500); } protected static void PlaySoundList() { for (int ix = 0; ix < sndList.Count; ix++) { snd.Stream = (Stream)sndList[ix]; snd.LoadAsync(); snd.PlaySync(); } } protected static void doDouble(double d) { // handle negative number if (d < 0) { SayMinus(); d = -d; } // split in decimal and integer part String s = d.ToString(); s = s.Replace(',', '.'); if (s.StartsWith(".")) s = "0" + s; String[] pieces = s.Split('.'); for (int ix = 0; ix < pieces.Length; ix++) { try { int t = Convert.ToInt32(pieces[ix]); doInt(t); } catch (Exception ex) { // error, bad format SayError(); } if ((ix != pieces.Length - 1) && (pieces.Length > 1)) SayComma(); } } protected static void doInt(int i) { // handle negative number if (i < 0) { SayMinus(); i = -i; } if (i > 1000000) { doInt(i / 1000000); Say1000000(); if (i % 1000000 > 0) doInt(i % 1000000); return; } if (i > 1000) { doInt(i / 1000); Say1000(); if (i % 1000 > 0) doInt(i % 1000); return; } if (i > 100) { doInt(i / 100); Say100(); if (i % 100 > 0) SayAnd(); if (i % 100 > 0) doInt(i % 100); return; } Say2digitInt(i); } protected static void Say2digitInt(int n) { // say an integer if (n == 1) { SayEtt(); return; } if (n == 0) { SayNull(); return; } Stream s = null; if ((n > 9) && (n < 20)) { switch (n) { case 11: s = Properties.Resources._11; break; case 12: s = Properties.Resources._12; break; case 13: s = Properties.Resources._13; break; case 14: s = Properties.Resources._14; break; case 15: s = Properties.Resources._15; break; case 16: s = Properties.Resources._16; break; case 17: s = Properties.Resources._17; break; case 18: s = Properties.Resources._18; break; case 19: s = Properties.Resources._19; break; default: s = Properties.Resources._10; break; } sndList.Add(s); return; } int d1, d2; if (n > 9) { d1 = n / 10; d2 = n % 10; } else { d1 = -999; d2 = n; } switch (d1) { case 0: s = Properties.Resources._0; break; case 1: s = Properties.Resources._10; break; case 2: s = Properties.Resources._20; break; case 3: s = Properties.Resources._30; break; case 4: s = Properties.Resources._40; break; case 5: s = Properties.Resources._50; break; case 6: s = Properties.Resources._60; break; case 7: s = Properties.Resources._70; break; case 8: s = Properties.Resources._80; break; case 9: s = Properties.Resources._90; break; default: s = null; break; } if (s != null) sndList.Add(s); s = null; switch (d2) { case 0: if (d1 != -999) s = Properties.Resources._0; break; case 1: s = Properties.Resources._1; break; case 2: s = Properties.Resources._2; break; case 3: s = Properties.Resources._3; break; case 4: s = Properties.Resources._4; break; case 5: s = Properties.Resources._5; break; case 6: s = Properties.Resources._6; break; case 7: s = Properties.Resources._7; break; case 8: s = Properties.Resources._8; break; case 9: s = Properties.Resources._9; break; default: s = null; break; } if (s != null) sndList.Add(s); }
For å studere implementasjonen nærmere må du åpne Saynumber-prosjektet.
-
DLL-prosjektet:https://svn.hiof.no/svn/psource/Csharpspikes/saynumber
B.Stenseth, revidert desember 2006