public void RemoveFromFavorites(WebView webView, NameValueCollection parameters) { var chordParams = new ChordParams(parameters); var tokens = parameters["positions"].Split(','); var positions = tokens.Select(i => int.Parse(i)).ToArray(); var id = $"{chordParams.Root}{chordParams.ChordType}"; Chord chord; if (!Chord.TryParse(id, _currentSettings.conv, out chord)) { return; } if (!Favorites.Chords.ContainsKey(chord)) { return; } try { var layout = new GuitarChordLayout(chord, positions); Favorites.Chords[chord].Remove(layout); Favorites.Save(); var js = string.Format("setFavorite('.chord-layout[data-positions=\"{0}\"]', '{1}');", parameters["positions"], false); webView.LoadUrl("javascript:" + js); } catch (Exception e) { System.Diagnostics.Debug.WriteLine($"Cannot save favorites\n{e.Message}"); } }
public void PlayChord(WebView webView, NameValueCollection parameters) { var chordParams = new ChordParams(parameters); var id = parameters["id"]; float volume; if (!float.TryParse(parameters["volume"], out volume)) { volume = 1f; } if (!string.IsNullOrEmpty(id)) { Chord chord; if (!Chord.TryParse(id, NamingConvention.English, out chord)) { return; } var c = new Note(Core.Models.Tone.C); var minDistance = 3 + c.ChromaticDistance(chord.Notes[0]); foreach (var note in chord.Notes) { var pos = 3 + c.ChromaticDistance(note); if (pos < minDistance) { pos += 12; } var playRate = Note.HalfStepsToPlayRate(pos); _soundPool.Play(_soundIds[1], volume, volume, 0, 0, playRate); Thread.Sleep(50); } return; } var intPositions = parameters["positions"]?.Split(',')?.Select(i => int.Parse(i))?.ToArray(); if (intPositions == null) { return; } for (var n = 0; n < 2; n++) { for (var i = 0; i < intPositions.Length; i++) { var halfSteps = intPositions[i]; if (halfSteps >= 0) { var playRate = Note.HalfStepsToPlayRate(halfSteps); _soundPool.Play(_soundIds[i], volume, volume, 0, 0, playRate); if (n == 0) { Thread.Sleep(200); } else { Thread.Sleep(50); } } } Thread.Sleep(200); } }
public void FindChord(WebView webView, NameValueCollection parameters) { string page; if (string.IsNullOrWhiteSpace(parameters["note"])) { var chordParams = new ChordParams(parameters); var model = new FindChordModel { conv = _currentSettings.conv, Strict = chordParams.Strict }; var template = new FindChordView() { Model = model }; page = template.GenerateString(); } else { Note note; var chordParams = new ChordParams(parameters); var tokens = parameters["note"].Split(','); var notes = tokens.Select(i => Note.TryParse(i, _currentSettings.conv, out note) ? note : null) .Where(i => i != null) .ToArray(); var chords = Chord.Find(notes, chordParams.Strict); _allowPartial = true; if (chords.Length > 0) { var chord = chords.First(); _currentRoot = chord.Root; _currentChordType = chord.ChordType; if (chords.Length > 1) { _allRoots = chords.Select(i => i.Root).ToArray(); _allChordTypes = chords.Select(i => i.ChordType.ToDescription()).ToArray(); } else { _allRoots = null; _allChordTypes = null; } parameters.Add("partial", "true"); ShowChordResults(webView, parameters); return; } var model = new FindChordModel { conv = _currentSettings.conv, Strict = chordParams.Strict, SelectedNotes = notes.Select(i => i.ToString(_currentSettings.conv)) .ToArray(), Error = "No chord found" }; var template = new FindChordView() { Model = model }; page = template.GenerateString(); } webView.LoadDataWithBaseURL("file:///android_asset/?page=FindChord", page, "text/html", "UTF-8", null); }