Skip to content

ViolinTuner – Część 2 – Interfejs

Strojenie skrzypiec to niezbędna operacja, którą trzeba wykonać zarówno przed każdą lekcją jak i koncertem. Osoby początkujące wspomagają się często odsłuchem właściwego dźwięku do którego stroją daną strunę. Inną metodą jest stosowanie autotunera, który daje nam feedback, czy struna stroi za nisko czy za wysoko.

W najprostszej wersji stroik będzie odtwarzał bazową częstotliwość wszystkich czterech strun skrzypcowych (G,D,A,E):

StrunaOznaczenie oktawyCzęstotliwość
GG3196.00 Hz
DD4293.66 Hz
AA4440.00 Hz
EE5659.26 Hz

Aby zrealizować tą funkcjonalność i zachować prosty interface, rozwiązaniem może być przełączanie się za pomocą gestu “swipe” na kolejne podstrony aplikacji (tzw “Page-Based Navigation”). Każde załadowanie podstrony uruchamia kolejny dźwięk bazowy do strojenia. Dzięki temu nie będzie trzeba poświęcać zbyt dużej uwagi na wybieranie poszczególnych dźwięków – wystarczy tylko gest wykonany w lewo lub w prawo na zegarku.

Pierwszym pomysłem było stworzenie jednej klasy InterfaceController oraz listy parametrów. Przy każdym załadowaniu ekranu ładowany były zestaw danych typu częstotliwość i daje obsłużone w metodzie tej klasy. Pomysł niestety nie wypalił. InterfaceController nie przechowuje kontekstu swojego wywołania, a więc klasa nie ma dostępu do danych, które umożliwiłyby w jakikolwiek sposób pobranie informacji o aktualnym ekranie. Trzeba było poszukać innego rozwiązania. Zgodnie ze wskazówkami na StackOverflow stworzyłam dla każdego ekranu osobną klasę, która będzie przechowywała potrzebne parametry dla danej struny:

new-file

new-watchkit-class

new-file-interfacecontroller-for-d-string

Po stworzeniu klasy trzeba przypisać ją do interfejsu:

interfacecontroler-assign-to-class-and-module

Przy tworzeniu kolejnych kontrolerów można skopiować ich kod, ale elementy interfejsu trzeba podłączyć osobno dla każdego z nich. Aby to zrobić, musi być włączony Assistant Editor, który wyświetla kod klasy, z której dziedziczy interfejs:

assistant-editor-menushow-assistant-editor

UX tego procesu jest na tyle dziwny, że musiałam znów wrócić do instrukcji ze swojego wcześniejszego postu. Znów przydał się klawisz Ctrl:

drop-label-outlet

W sumie potrzeba 4-ch kontrolerów, który każdy obsłuży jedną strunę. Po ich stworzeniu i podpięciu elementów interfejsu storyboard wygląda następująco:

storyboard-controllers

Aplikacja po odpaleniu na razie nic nie robi nic ciekawego. Na aktualnym etapie prac zegarek wyświetla informacje o poszczególnych częstotliwościach strojenia:

widok-aplikacji

Update Maj 10, 2017, 

W tej edycji Daj Się Poznać niestety nie udało mi się ukończyć aplikacji. Na pewno następnym razem będę musiała przeznaczyć więcej czasu na blogowanie i przygotowanie materiałów. Dodatkowo ogarnięcie zupełnie nowego języka programowania, który w najnowszej wersji ma jeszcze słabą dokumentację nie przyczyniło się do sukcesu 😉

Update Czerwiec 11, 2017, 

Problem dot. obsługi dźwięku, z którym walczyłam na początku lutego, został naprawiony w najnowszej wersji watchOS

Published inkonkurs Daj Się Poznać 2017programowanie

5 komentarzy

  1. Krzysztof Hasiński Krzysztof Hasiński

    Minimalistyczny design lepszy niz wiekszosc appek na watcha 😉

    • Justyna Wojtczak Justyna Wojtczak

      Dzięki 🙂 takie było założenie aby prostota obsługi była na pierwszy miejscu – osoba która stroi skrzypce i tak ma już co robić 🙂

  2. Radoslaw Janeczko Radoslaw Janeczko

    Cześć.

    W jaki sposób będziesz dokonywać pomiaru i analizy częstotliwości dźwięku?

    • Justyna Wojtczak Justyna Wojtczak

      Cześć, mam nadzieję że dotrwam do tego etapu 🙂 na razie chcę dokończyć temat generowania samych dźwieków, z czym watchos ma juz pewne problemy. Ale ogarniam temat 🙂 Gdy mi się to uda, zamierzam zająć się wspomnianą przez Ciebie analizą pobieranych dźwięków. Prawdopodobnie użyję którejś z bibliotek do analizy Fouriera.

  3. Miss Gamera Miss Gamera

    Podziękowania. Muszę to przygotować dla córki.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

LIVE NOW! CLICK TO VIEW.
CURRENTLY OFFLINE
Fork me on GitHub