DESENVOLVIMENTO DE APLICATIVO ANDROID PARA...

94
DESENVOLVIMENTO DE APLICATIVO ANDROID PARA ESCREVER TABLATURAS DE INSTRUMENTOS MUSICAIS TRASTEADOS Bruno Calou Alves Projeto de Graduação apresentado ao Curso de Engenharia de Computação e Informação da Escola Politécnica, Universidade Federal do Rio de Janeiro, como parte dos requisitos necessários à obtenção do título de Engenheiro. Orientador: Flávio Luis de Mello Rio de Janeiro Março de 2018

Transcript of DESENVOLVIMENTO DE APLICATIVO ANDROID PARA...

DESENVOLVIMENTO DE APLICATIVO ANDROID

PARA ESCREVER TABLATURAS DE INSTRUMENTOS

MUSICAIS TRASTEADOS

Bruno Calou Alves

Projeto de Graduação apresentado ao Curso de

Engenharia de Computação e Informação da

Escola Politécnica, Universidade Federal do Rio

de Janeiro, como parte dos requisitos necessários à

obtenção do título de Engenheiro.

Orientador: Flávio Luis de Mello

Rio de Janeiro

Março de 2018

ii

iii

iv

UNIVERSIDADE FEDERAL DO RIO DE JANEIRO

Escola Politécnica – Curso de Engenharia de Computação e Informação

Centro de Tecnologia, bloco H, sala H-217, Cidade Universitária

Rio de Janeiro – RJ CEP 21949-900

Este exemplar é de propriedade da Universidade Federal do Rio de Janeiro, que

poderá incluí-lo em base de dados, armazenar em computador, microfilmar ou adotar

qualquer forma de arquivamento.

É permitida a menção, reprodução parcial ou integral e a transmissão entre

bibliotecas deste trabalho, sem modificação de seu texto, em qualquer meio que esteja

ou venha a ser fixado, para pesquisa acadêmica, comentários e citações, desde que sem

finalidade comercial e que seja feita a referência bibliográfica completa.

Os conceitos expressos neste trabalho são de responsabilidade do(s) autor(es).

v

AGRADECIMENTO

Agradeço à minha família por investir em minha educação. Agradeço também

aos professores por todo seu conhecimento compartilhado e pelo apoio durante a minha

jornada. Aos meus colegas de colégio, curso e faculdade, obrigado por terem marcado a

minha trajetória. Agradeço também à minha namorada pelo apoio dado durante todos

esses anos. Por todos os momentos que passamos, sou extremamente grato.

vi

RESUMO

Este trabalho consiste no desenvolvimento de um aplicativo Android para

escrever tablaturas de instrumentos trasteados como guitarra, baixo e violão. Uma

comparação é feita com os aplicativos para Android capazes de escrever tablatura, com

o intuito de ressaltar suas deficiências. A partir desta análise, foi desenvolvido um

aplicativo que busca eliminar estes problemas e propor uma solução para a dificuldade

de documentar ideias musicais. Assim, o app provê uma solução capaz de gravar áudio,

escrever tablaturas e manter as ideias organizadas, mantendo uma boa experiência de

usuário e utilizando uma interface moderna de acordo com os padrões atuais de design

de aplicativos.

O aplicativo foi nomeado como Song Note e foi disponibilizado através do

endereço https://play.google.com/store/apps/details?id=com.brunocalou.songnote. A

recepção do aplicativo foi bastante positiva, alguns usuários relataram que estavam

buscando um aplicativo do tipo a bastante tempo.

Apesar da boa recepção, o aplicativo possui suas próprias deficiências, como

não ser capaz de reproduzir uma tablatura, não documentar o tempo de cada nota e não

ser capaz de escrever uma tablatura a partir do áudio gravado. Ainda que ele não tenha

todas essas funcionalidades, todas elas podem ser desenvolvidas em versões futuras do

aplicativo.

Palavras-Chave: Android, aplicativo, guitarra, violão, baixo, tablatura, áudio, Kotlin,

Java, celular, programa, experiência de usuário, interface de usuário

vii

ABSTRACT

This work is the development of an Android app capable of writing tablatures of

fretted musical instruments, like electric guitar, bass, and acoustic guitar. A comparison

is made with Android apps capable of writing tablatures in order to highlight their

deficiencies. From this analysis, an app was developed to eliminate these problems and

to propose a solution for the trouble of documenting musical ideas. Thus, the app

provides a solution that accomplishes audio recording, tablature writing, and idea

organization through good user experience and modern interface, according to the

current app design standards.

The app was named Song Note and it was made available on

https://play.google.com/store/apps/details?id=com.brunocalou.songnote. The

acceptance was fairly positive, some users have reported they were looking for an app

of the kind for months.

Despite good acceptance, the app has its own flaws, like not being able to play

tablatures, neither to document the tempo of the notes nor writing tablature from audio.

Even if it does not contain all these features, they can be developed in future app

versions.

Key-words: Android, app, acoustic guitar, electric guitar, bass, tablature, audio, Kotlin,

Java, mobile, software, material design, user experience, user interface

viii

SIGLAS

API - Application Programming Interface

APP – Aplicativo

CRUD – Create, Read, Update, Delete

FAB – Floating Action Button

IDE – Integrated Development Environment

MVVM – Model, View, ViewModel

UFRJ – Universidade Federal do Rio de Janeiro

UI – User Interface

UX – User Experience

ix

Sumário

1 Introdução .......................................................................................................... 1

1.1 – Tema ................................................................................................ 1

1.2 – Delimitação ...................................................................................... 1

1.3 – Justificativa ...................................................................................... 2

1.4 – Objetivos .......................................................................................... 3

1.5 – Metodologia ..................................................................................... 4

1.6 – Descrição ......................................................................................... 4

2 Fundamentação Teórica.................................................................................... 5

2.1 – Instrumentos de Corda Trasteados .................................................. 5

2.2 – Sistema de Tablatura ....................................................................... 6

2.3 – Análise de Aplicações Existentes .................................................... 7

2.3.1 – Guitar Pro ......................................................................... 8

2.3.2 – Guitar Tabs X ................................................................... 9

2.3.3 – Tab Maker....................................................................... 11

2.3.4 – TuxGuitar........................................................................ 12

2.3.5 – IgaraFu (Tablature Editor) .............................................. 13

2.3.6 – Guitar Partner Lite .......................................................... 14

2.3.7 – Guitar Notepad – Tab Editor .......................................... 15

2.3.8 – Tabify guitar composition .............................................. 16

2.4 – Android Studio .............................................................................. 17

3 Solução .............................................................................................................. 21

x

3.1 – Requisitos Desejados do Sistema .................................................. 21

3.2 – Arquitetura da Solução .................................................................. 23

3.2.1 – MVVM ........................................................................... 23

3.2.2 – Tablatura ......................................................................... 28

3.2.3 – Interação Com a Tablatura ............................................. 32

3.2.4 – Áudio .............................................................................. 40

3.2.5 – Metrônomo ..................................................................... 49

3.2.6 – Informações e Etiquetas.................................................. 51

3.2.7 – Armazenamento .............................................................. 58

3.2.8 – Interface e Experiência de Usuário ................................. 61

3.2.9 – Análises de Resultado ..................................................... 72

4 Conclusão e Trabalhos Futuros...................................................................... 74

Bibliografia .................................................................................................................... 76

A Implementação de Média Móvel ................................................................... 79

xi

Lista de Figuras

2.1 – Partes de um violão. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

2.2 – Comparação entre partitura (superior) e tablatura (inferior) . . . . . . . . . . . . . 6

2.3 – Exemplo de tablatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

2.4 – Comparação entre uma mesma tablatura utilizando duas convenções

diferentes. Em cima, utiliza-se uma notação em ASCII, em baixo, uma notação

provida pelo programa Guitar Pro 7. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

2.5 – Programa Guitar Pro 7 para desktop. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

2.6 – Programa Guitar Pro para Android. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

2.7 – Programa Guitar Tabs X. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

2.8 – Programa Guitar Tabs X. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

2.9 – Programa Tab Maker. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

2.10 – Programa Tux Guitar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

2.11 – Programa IgaraFu(Tablature Editor). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

2.12 – Programa Guitar Partner Lite. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

2.13 – Programa Guitar Notepad – Tab Editor. . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

2.14 – Programa Tabify guitar composition – Tab Editor. . . . . . . . . . . . . . . . . . . . 17

2.15 – Estrutura do projeto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

2.16 – Parte do arquivo AndroidManifest.xml. . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

3.1 – Diagrama das relações entre Model, View, ViewModel. . . . . . . . . . . . . . . . 23

3.2 – ViewModel para o Fragment de Ideias utilizado na primeira página . . . . . . 25

xii

3.3 – Interface do DataModel de Ideias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

3.4 – Método utilizado no Fragment de Ideias para buscar o ViewModel

correspondente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

3.5 – Injeção de dependências a partir do Singleton SongNoteApplication . . . . . . 26

3.6 – Parte da implementação do Model da Ideia . . . . . . . . . . . . . . . . . . . . . . . . . . 27

3.7 – View de edição de etiquetas se inscrevendo no barramento de eventos do

ViewModel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

3.8 – Parte da implementação da classe TablatureElement . . . . . . . . . . . . . . . . . . 29

3.9 – Parte da implementação da classe TablatureNotation . . . . . . . . . . . . . . . . . . 29

3.10 – Parte da implementação da classe Tablature . . . . . . . . . . . . . . . . . . . . . . . . 30

3.11 – Classe TablatureFactory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

3.12 – Renderização da tablatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

3.13 – Parte da implementação da classe Cursor . . . . . . . . . . . . . . . . . . . . . . . . . . 33

3.14 – Interface de clique válido da classe JoystickButtons . . . . . . . . . . . . . . . . . . 33

3.15 – Parte da implementação da Fretboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

3.16 – Um possível fluxo de inserção. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

3.17 – Um possível fluxo de inserção com o botão INS selecionado. . . . . . . . . . . 36

3.18 – Um possível fluxo de apagar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

3.19 – Fluxo de inserção de um bend com intensidade de 1 tom. . . . . . . . . . . . . . 39

3.20 – Parte da implementação da BottomBar . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

3.21 – Parte da implementação da BendIntensityBar . . . . . . . . . . . . . . . . . . . . . . . 40

3.22 – Fluxo de gravação. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

xiii

3.23 – Processo de descartar o último áudio.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

3.24 – Janela mostrada ao usuário quando ele tenta descartar uma gravação

grande. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

3.25 – Interface que expõe o estado do Player. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

3.26 – Notificação de amostras de áudio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

3.27 – Comparação entre um áudio já gravado e uma gravação. . . . . . . . . . . . . . . 45

3.28 – Parte do arquivo audio_view.xml. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

3.29 – Visualização do áudio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

3.30 – Parte principal do algoritmo para realizar o desenho do áudio. . . . . . . . . . . 48

3.31 – Comparação entre renderização de áudio. . . . . . . . . . . . . . . . . . . . . . . . . . . 49

3.32 – Metrônomo implementado no projeto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

3.32 – Implementação do algoritmo para medir o BPM. . . . . . . . . . . . . . . . . . . . . 51

3.33 – Seleção de instrumento. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

3.34 – Interface ILabelDataModel. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

3.35 – Fluxo de inserção de etiqueta a partir da edição de ideia. . . . . . . . . . . . . . . 53

3.36 – Fluxo de criação de etiqueta a partir do editor. . . . . . . . . . . . . . . . . . . . . . . 54

3.37 – Fluxo de apagar etiqueta a partir do editor. . . . . . . . . . . . . . . . . . . . . . . . . . 55

3.38 – Fluxo de ver ideias agrupadas por uma etiqueta. . . . . . . . . . . . . . . . . . . . . . 56

3.39 – Fluxo de renomear etiqueta a partir da tela da etiqueta. . . . . . . . . . . . . . . . 57

3.40 – Telas de etiquetas inválidas em lugares distintos do aplicativo. . . . . . . . . . 58

xiv

3.41 – Demonstração de operações usando Realm. . . . . . . . . . . . . . . . . . . . . . . . . 59

3.42 – Método que busca todas as ideias a partir do nome de uma etiqueta. . . . . . 59

3.43 – Métodos que salvam e carregam a tablatura. . . . . . . . . . . . . . . . . . . . . . . . . 61

3.44 – Comparação entre um exemplo de lista definida pelo Material Design (A)

e uma lista do projeto (B). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

3.45 – Comparação entre um exemplo de menu lateral definido pelo Material

Design (A) e o utilizado no projeto (B). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

3.46 – Todos os FABs utilizados no projeto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

3.47 – Palavra “descartar” utilizada no projeto. . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

3.48 – Palavra “apagar” utilizada no projeto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

3.49 – Comparação entre visualização e edição de ideia. . . . . . . . . . . . . . . . . . . . . 67

3.50 – Exemplos de snackbar mostrados para o usuário. . . . . . . . . . . . . . . . . . . . . 68

3.51 – Exemplos de ações perigosas que pedem a confirmação do usuário. . . . . . 69

3.52 – Exemplos de empty state usados no projeto. . . . . . . . . . . . . . . . . . . . . . . . . 70

3.53 – Comparação entre facilidade de interação na tela de um smartphone. . . . . 71

3.54 – Regiões de facilidade de toque na tela de edição de tablatura. . . . . . . . . . . 72

3.55 – Estatísticas de uso do aplicativo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

1

Capítulo 1

Introdução

1.1 – Tema

O trabalho tem como tema o desenvolvimento de um aplicativo para a

plataforma Android a fim de auxiliar músicos em sua jornada de criação e

documentação de novas músicas.

1.2 – Delimitação

O projeto é voltado para músicos que gostariam de salvar suas ideias musicais,

na forma de áudio, tablatura e texto, de forma simples e prática em celulares Android.

A princípio, o aplicativo provê uma notação musical voltada para instrumentos

de cordas trasteados (instrumentos de corda onde as notas são delimitadas por trastes,

como em um violão, onde ao pressionar uma corda, a frequência da nota é fixada pelo

traste ao qual ela está apoiada), conhecida como tablatura. A implementação desta

notação no projeto é focada em guitarra e violão, oferecendo assim os símbolos mais

utilizados para estes instrumentos.

Em versões futuras, uma gama maior de instrumentos poderá ser suportada,

além de tornar possível a escrita de partituras. Há também a possibilidade de analisar o

áudio e escrever a tablatura automaticamente a partir dele, mas esta funcionalidade está,

por hora, fora do escopo.

2

1.3 – Justificativa

O sistema de partitura, apesar de ser bastante complexo, abrange uma gama

enorme de instrumentos e é a notação padrão utilizada no mundo da música. Apesar

disso, existe ambiguidade ao executá-la em instrumentos de cordas pois uma nota pode

ser tocada em várias posições diferentes. Desta forma, o uso da partitura em conjunto

com a tablatura provê um sistema completo e eficiente para registrar músicas compostas

em instrumentos de cordas trasteados.

Contudo, aprender a notação de partitura é uma tarefa desafiadora. Escrever

partituras também se torna um processo mais lento em comparação ao sistema de

tablatura. Desta forma, quando se trata de documentar músicas em instrumentos de

cordas, a tablatura se mostra uma ferramenta poderosa, de fácil aprendizado e

compreendida tanto por músicos iniciantes quanto experientes.

O grande problema em se escrever uma tablatura é que, em sua forma mais

simples, o tempo de cada nota não é documentado. Logo, para que uma tablatura seja

executada corretamente, é necessário ter conhecimento prévio da música, ou seja, tê-la

ouvido ao menos uma vez.

Sabendo deste contratempo, um músico que queira documentar sua ideia precisa

escrever a tablatura, gravar o áudio e, de alguma forma, associar os dois. É de se esperar

que, na era da informação, existam soluções que resolvam este problema. De fato,

existem, porém, para o sistema operacional Android, estas não possuem uma interface

de usuário (UI) e experiência de usuário (do inglês User Experience, UX) agradáveis.

Além disso, muitas destas soluções exigem que o tempo de cada nota também seja

documentado, o que torna o processo mais lento e tedioso. Documentar o tempo não

deveria ser obrigatório, e sim opcional, levando em conta que o usuário só se interesse

por escrever a tablatura.

3

1.4 – Objetivos

O objetivo principal é criar um aplicativo para Android que permita a gravação e

escrita de tablaturas para guitarra e violão de forma fácil e rápida. Logo, o aplicativo

deve também possuir uma boa interface e experiência de usuário. Neste sentido, os

objetivos específicos são:

• Desenvolver um sistema capaz de editar, renderizar e armazenar tablaturas

de guitarra e violão utilizando algoritmos e estruturas de dados apropriados

para garantir baixo uso de memória e tempo computacional

• Permitir gravação e visualização de áudio em tempo real

• Possuir uma boa performance, sem travamentos

• Possuir boa UX e UI

4

1.5 – Metodologia

O projeto pode ser dividido em três partes: a primeira, se refere à pesquisa sobre

UX e UI, e ao design das telas do aplicativo; a segunda, engloba todo o processo de

desenvolvimento; a terceira, remete à validação do aplicativo.

O design das telas é feito com intuito de auxiliar as decisões de projeto, como

que características são mais relevantes em uma tela, quais são os fluxos para realizar

certa funcionalidade, como os elementos são posicionados, etc. Após realizar o projeto

do sistema, foi utilizado um aplicativo de prototipagem para fazer a validação dos

fluxos. Desta forma, era possível testar o fluxo do aplicativo e, caso não correspondesse

com as expectativas, corrigi-lo rapidamente.

A etapa de desenvolvimento foi feita utilizando todo o conjunto de ferramentas

providas pelo ecossistema Android.

A validação do aplicativo foi feita de forma online através do feedback dos

usuários do aplicativo.

1.6 – Descrição

Os fundamentos sobre notação musical para instrumentos trasteados serão

apresentados no capítulo 2, assim como os aplicativos atuais para o sistema Android

que permitem escrever músicas utilizando este sistema. Além disso, serão apresentadas

as tecnologias utilizadas para o desenvolvimento do projeto.

No capítulo 3 será apresentada a solução. Serão expostos os fluxos de interação,

algoritmos e trechos de código. A arquitetura do projeto e os padrões de design de

código também serão abordados de acordo com as diferentes partes da solução.

Também há uma análise da interface e da experiência do usuário aplicados no projeto.

Ao final do capítulo, são apresentados alguns dados estatísticos do uso do aplicativo e

quais são foram os resultados obtidos.

O capítulo 4 apresenta brevemente a conclusão do projeto e os próximos passos

do desenvolvimento de novas funcionalidades. Nele é apresentada uma lista com a

funcionalidades desejadas para as versões futuras do aplicativo.

5

Capítulo 2

Fundamentação Teórica

2.1 – Instrumentos de Corda Trasteados

Instrumentos de corda trasteados como o violão possuem, em sua maioria,

cabeça, corpo e braço, como pode ser visto na Figura 2.1. A cabeça é utilizada para fixar

as cordas do instrumento e permitir sua afinação. O braço liga a cabeça ao corpo. É nele

que são posicionados os trastes. O corpo, além de fixar uma extremidade de cada corda,

funciona como uma caixa de ressonância, permitindo que o som produzido pelas cordas

seja amplificado.

Figura 2.1 – Partes de um violão.

A espessura de cada corda varia de acordo com o tom desejado. Tons mais

graves são executados em cordas mais espessas, enquanto que tons mais agudos, em

6

cordas mais finas. O posicionamento das cordas é feito de forma que, quando o

instrumento é posicionado para ser tocado, as cordas mais graves se encontram acima

das cordas mais agudas.

Ao vibrar uma corda, um som é produzido de acordo com sua afinação. Para

mudar o tom, é necessário reduzir o espaço de vibração da corda; isto é feito

pressionando-a contra o braço do instrumento. Como os trastes possuem posições fixas,

ao pressionar a corda entre dois trastes subsequentes, a corda sempre vibrará em uma

mesma frequência. Desta forma, o traste torna o tom resultante fixo e preciso.

2.2 – Sistema de Tablatura

Tablatura é um sistema de notação musical bastante utilizado em instrumentos

de corda trasteados, como guitarra, baixo e violão. Em sua essência, é documentada a

posição dos dedos no instrumento, diferente de uma partitura, onde as notas musicais

são representadas, como pode ser visto na Figura 2.2.

Figura 2.2 – Comparação entre partitura (superior) e tablatura (inferior)

Fonte: Programa Guitar Pro 7 [1].

Em uma tablatura, cada linha representa uma corda do instrumento, logo, tanto

em violão quanto guitarra, utilizam-se, geralmente, seis linhas. A primeira linha,

localizada na parte superior, representa a corda mais fina, enquanto que a última, a mais

espessa. Pode-se acrescentar no início da tablatura, à esquerda de cada linha, o tom da

corda correspondente quando tocada de forma aberta (sem pressionar o braço do

instrumento). Desta forma, esta coluna de tons define a afinação do instrumento. Caso

esteja ausente, é esperado que se utilize sua afinação padrão do instrumento.

7

Nas linhas, são posicionados números que representam os trastes a serem

utilizados. Quando trastes são posicionados em uma mesma coluna, as cordas relativas

devem ser tocadas ao mesmo tempo. Símbolos também são utilizados para representar

técnicas aplicadas ao tocar uma nota, como pode ser visto na Figura 2.3.

Figura 2.3 – Exemplo de tablatura

Fonte: Programa Guitar Pro 7 [1].

Não existe uma forma padrão de escrever uma tablatura, porém existem

convenções. Ao utilizar um editor de texto, é comum escrever os símbolos com

caracteres comuns. Já em um editor de tablatura, são usados desenhos e caracteres. A

Figura 2.4 faz uma comparação entre os dois sistemas utilizando um mesmo trecho de

música.

Figura 2.4 – Comparação entre uma mesma tablatura utilizando duas convenções

diferentes. Em cima, utiliza-se uma notação em ASCII, em baixo, uma notação provida

pelo programa Guitar Pro 7. Fonte: Programa Guitar Pro 7 [1].

2.3 – Análise de Aplicações Existentes

A grande parte dos aplicativos disponíveis na Google Play [2] são utilizados

para aprendizado de músicas já existentes. As partituras / tablaturas são exibidas para o

usuário e podem ser reproduzidas com áudio dos instrumentos. Porém, poucos são os

apps que permitem a escrita de tablatura. Nesta seção, estão documentados a maior

parte dos aplicativos que possuem esta funcionalidade.

8

Os critérios utilizados para realizar a comparação de forma objetiva são a

quantidade de passos necessários para inserir notas e efeitos. De forma subjetiva,

existem outros aspectos como a organização da informação, a facilidade de uso e a

consistência da interface.

2.3.1 – Guitar Pro

Guitar Pro [1] é um software profissional para edição de partitura e tablatura

amplamente utilizado no mundo da música. Ele permite a criação de várias trilhas de

partitura com instrumentos diferentes, além de ser capaz de reproduzir os áudios

correspondentes. Assim, uma música pode ser escrita e reproduzida completamente pelo

software. Ele também é capaz de exportar a partitura em diversos formatos, como PDF,

MIDI MusicXML, ASCII, etc, além de seus formatos proprietários como .gp, .gp5,

.gpx, etc, o que o torna excelente para compartilhamento de músicas.

Figura 2.5 – Programa Guitar Pro 7 para desktop.

Fonte: Guitar Pro [1].

No ambiente desktop, o Guitar Pro é a melhor ferramenta de criação e

aprendizado de tablaturas, porém, quando se trata de sua versão mobile, existem muitos

problemas. Além de não possuir muitas das funcionalidades de sua versão desktop, sua

UI é inconsistente e o aplicativo, até a data de finalização deste projeto, não é atualizado

9

desde 2014. O app possui somente uma versão paga, porém suas funcionalidades

principais (busca, leitura e reprodução de partituras), estão disponíveis gratuitamente em

outros aplicativos.

Com relação à escrita de tablatura, pode-se observar na Figura 2.6 um

agrupamento de funcionalidades diferentes em um mesmo espaço. Os números (de 0 a

9) estão dispostos em uma forma não convencional, símbolos diferentes, que

representam efeitos, são agrupados em um mesmo menu de forma que, para acessá-los,

deve-se clicar em um botão com um ícone que tenta resumir todos estes símbolos.

Figura 2.6 – Programa Guitar Pro para Android.

Fonte: Guitar Pro para Android [3].

2.3.2 – Guitar Tabs X

O Guitar Tabs X [4] é um aplicativo capaz de buscar por tablaturas em um

servidor, baixa-las para acesso offline e reproduzi-las. Uma de suas principais

funcionalidades é a de permitir a criação de novas tablaturas e salvá-las localmente.

10

Figura 2.7 – Programa Guitar Tabs X.

Fonte: Guitar Tabs X [4].

Com relação à funcionalidade de edição de tablaturas, a forma como a entrada

numérica é feita não é prática, pois é bastante propícia a erros e leva um tempo

relativamente alto para ser feita. O usuário precisa localizar o número desejado na corda

correta e depois selecioná-lo. Para inserir um número um pouco maior, é necessário

fazer rolagem dos números na tela e repetir o processo. Por exemplo, para digitar o

número 20 na terceira corda de cima para baixo, o usuário deve rolar a tela até encontrar

o número 20, contar qual dos diversos números 20 está na terceira corda, selecioná-lo e

verificar se ele foi inserido corretamente.

Existe um botão que substitui a caixa de seleção de números por outra com

símbolos que podem ser inseridos, além de algumas outras funcionalidades, como pode

ser visto na Figura 2.8. Porém, a quantidade de símbolos é bem limitada, tornando a

escrita da tablatura menos fiel à música real.

11

Figura 2.8 – Programa Guitar Tabs X.

Fonte: Guitar Tabs X [4].

2.3.3 – Tab Maker

O Tab Maker [5] é um aplicativo bem limitado capaz de escrever e reproduzir

tablaturas. Para fazer uma inserção, o usuário deve pressionar a corda no local desejado,

selecionar o número ou símbolo no menu que foi aberto e retirar o dedo da tela. Para

inserir um número maior do que 9, deve repetir o processo duas vezes. Ele é capaz de

enviar a tablatura por e-mail em formato de texto, porém, todo o processo de salvar,

selecionar e enviar é feito de forma não intuitiva.

12

Figura 2.9 – Programa Tab Maker.

Fonte: Tab Maker[5].

2.3.4 – TuxGuitar

O TuxGuitar [6] é um app capaz de escrever e reproduzir tablaturas. Para inserir

uma nota, basta digitá-la usando o teclado numérico. Para mudar o tempo da nota, basta

utilizar as setas para cima e para baixo localizadas no centro do menu inferior. Para

inserir um símbolo, deve-se selecionar a nota, abrir o menu superior, escolher a opção

“Effect” e selecionar o símbolo desejado. Caso o usuário selecione incorretamente, é

preciso repetir o processo clicando no mesmo símbolo para retirá-lo e depois repetir

mais uma vez escolhendo o símbolo desejado. Existem símbolos que se sobrepõem,

tornando desnecessário o processo de retirar um símbolo errado, porém, não tem como

o usuário saber para quais opções isto se aplica. Note que em nenhum momento o

programa indica qual efeito está selecionado.

13

Figura 2.10 – Programa Tux Guitar.

Fonte: Tux Guitar[6].

2.3.5 – IgaraFu (Tablature Editor)

O IgaraFu (Tablature Editor) [7] é capaz de escrever e reproduzir tablaturas.

Para inserir uma nota, deve-se selecionar no braço do instrumento a nota desejada e

fazer um movimento rapidamente para cima, como se estivesse movendo-a para a

tablatura. Vale ressaltar que em nenhum momento este gesto é mostrado para o usuário.

Há também uma barra para selecionar os tempos de cada nota, porém, não existe a

opção de inserir símbolos

14

Figura 2.11 – Programa IgaraFu(Tablature Editor).

Fonte: IgaraFu(Tablature Editor)[7].

2.3.6 – Guitar Partner Lite

O Guitar Partner Lite [8] é um aplicativo capaz de escrever partituras e

reproduzi-las. Para inserir um número, o usuário deve clicar no botão com o ícone de

lápis e deslizar o dedo horizontalmente pela tela. Neste momento, o número aparecerá

na corda selecionada e mudará de acordo com a posição horizontal do toque na tela.

Para selecionar o tempo, deve-se clicar no ícone de nota musical para abrir uma janela

de edição de tempo; logo em seguida, deve-se selecionar ao menos dois campos

relativos ao tempo e clicar no botão de confirmação.

15

Figura 2.12 – Programa Guitar Partner Lite.

Fonte: Guitar Partner Lite[8].

2.3.7 – Guitar Notepad – Tab Editor

O Guitar Notepad – Tab Editor [9] é um aplicativo capaz de escrever tablaturas.

Ele possui o mesmo funcionamento do Guitar Tabs X, porém, as notas de uma coluna

são mostradas tanto na tablatura quanto na tabela semelhante ao braço do violão. A

inserção de uma nota é feita clicando nesta tabela e, apesar de possuir os mesmos

problemas do Guitar Tabs X a visualização é mais simples. Para inserir um símbolo,

basta escolhê-lo na barra flutuante. Vale ressaltar que o app possui somente uma versão

paga.

16

Figura 2.13 – Programa Guitar Notepad – Tab Editor.

Fonte: Guitar Notepad – Tab Editor[9].

2.3.8 – Tabify guitar composition

O Tabify guitar composition [10] é um aplicativo com um conceito interessante:

ele grava o áudio e a partir dele tenta determinar a tablatura. Ao reproduzir, o áudio

original é executado enquanto que a tablatura é deslizada para acompanhá-lo. Inserir ou

editar uma nota é relativamente simples, basta clicar no local desejado que um menu

aparecerá; depois, basta selecionar uma opção. Apesar do app ser de fato interessante, a

tablatura gerada a partir do som possui muitos erros e, ao reproduzi-la, muitas vezes ela

não acompanha a gravação corretamente.

17

Figura 2.14 – Programa Tabify guitar composition – Tab Editor.

Fonte: Tabify guitar composition [10].

2.4 – Android Studio

O Android Studio [11] é o Ambiente de Desenvolvimento Integrado (IDE)

oficial para desenvolvimento de aplicativos Android. Por ser baseado na IDE IntelliJ

IDEA [12], existem muitas funcionalidades e recursos que tornam o desenvolvimento

mais produtivo.

A estrutura do projeto é dividida em 3 pastas principais (ver Figura 2.15):

• Manifests: Contém o arquivo AndroidManifest.xml

• Java: Contém todo o código fonte, incluindo códigos de teste usando JUnit

• Res: Contém arquivos que não são código, como layouts XML, strings e

imagens

18

Figura 2.15 – Estrutura do projeto.

O arquivo AndroidManifest.xml é obrigatório em todo aplicativo Android. Sua

função é prover informações essenciais sobre o aplicativo para o sistema Android,

necessárias para o sistema antes que ele possa executar o código do aplicativo. Suas

funcionalidades são:

• Nomear o pacote Java para o aplicativo. O nome do pacote serve como

identificador exclusivo para o aplicativo.

• Descrever os componentes do aplicativo, que abrangem atividades (activity),

serviços, receptores e provedores de conteúdo.

• Determinar os processos que hospedam os componentes de aplicativo.

• Declarar as permissões necessárias do aplicativo.

• Listar classes de instrumentação que fornecem geração de perfil e outras

informações durante a execução do aplicativo.

• Declarar o nível mínimo da Android API que o aplicativo exige.

• Listar as bibliotecas às quais o aplicativo deve se vincular.

19

Figura 2.16 – Parte do arquivo AndroidManifest.xml.

A pasta Java contém todo o código Java do aplicativo. Todas as classes e

interfaces utilizadas pelo aplicativo definem seu comportamento, enquanto que os

arquivos da pasta Res definem sua interface. Assim, todo código referente ao aplicativo,

incluindo códigos de teste, devem estar presentes na pasta Java.

A pasta Res, como dito anteriormente, contém todos os arquivos relacionados à

interface, além de conter arquivos de configuração do aplicativo. Sua estrutura é

composta da seguinte forma:

• Animator: Arquivos XML que definem animações de propriedade.

• Anim: Arquivos XML que definem animações intermediárias.

• Color: Arquivos XML que definem uma lista de estado de cores. (por

exemplo, um botão pode ter vários estados, como pressionado, com foco ou

normal, logo cada cor pode ser associada a um estado).

• Drawable: Arquivos desenháveis, como imagens e XMLs

• Mipmap: Arquivos drawable do ícone do aplicativo referentes a diferentes

densidades de tela

• Layout: Arquivos XML que definem os layouts de UI, como telas e

componentes

• Menu: Arquivos XML que definem os menus do app

20

• Raw: Arquivos arbitrários salvos em forma bruta, ou seja, sem que haja

nenhum processamento sobre eles

• Values: Arquivos XML que contém valores simples, como strings, números

inteiros e cores. Usa-se um arquivo para cada tipo de recurso, de forma que

propriedades semelhantes sejam agrupadas. Algumas convenções de nomes

de arquivos presentes nessa pasta incluem:

o colors.xml para valores de cor

o dimens.xml para valores de dimensão

o strings.xml para valores de string

o styles.xml para estilos

• Xml: Arquivos arbitrários XML que podem ser lidos em tempo de execução

21

Capítulo 3

Solução

Após destacar os problemas com as soluções atuais, o entendimento sobre o

problema torna possível a confecção de uma solução mais apropriada. Após definir os

requisitos do sistema, é possível pensar em uma solução de interface que atenda as

expectativas do usuário e ofereça uma boa experiência. Os fluxos de interação são

definidos nesta etapa e, a partir deles, é possível fazer a arquitetura da solução.

3.1 – Requisitos Desejados do Sistema

O projeto deve atender os seguintes requisitos funcionais

• Permitir escrita de tablatura

o Inserir e remover notas e efeitos rapidamente

o Corrigir erros rapidamente, como errar ao digitar uma nota

o Editar informações do cabeçalho (título, subtítulo, artista,

afinação, tempo, comentário e capotraste)

o Armazenar a tablatura em disco

• Permitir gravação de áudio

o Renderizar o áudio

o Descartar último áudio gravado

o Continuar uma gravação

o Se deslocar para qualquer momento da gravação com facilidade

o Reproduzir o áudio

o Armazenar o áudio em disco

• Adicionar informações para organização

o Nome, descrição, instrumento e etiquetas

• Adicionar, remover e editar etiquetas

22

Note que neste momento, está fora do escopo do projeto prover uma solução

para escrita de cifras e de partituras. Além disso, não será desenvolvida nenhuma

forma de reprodução de tablatura nem de escrita automática a partir do áudio, ou

seja, a tablatura será feita inteiramente pelo usuário de forma manual e não será

gerada nenhuma forma de som a partir da mesma.

23

3.2 – Arquitetura da Solução

Esta seção tem como objetivo explicar sucintamente as diferentes partes da

solução.

3.2.1 – MVVM

O padrão de arquitetura MVVM (Model, View, ViewModel) organiza a

implementação em três camadas, provendo clara separação de responsabilidades.

• Model - Camada da aplicação responsável pelo armazenamento de dados e

pela lógica de negócios

• View – Interface da aplicação. Informa ao ViewModel sobre as ações do

usuário

• ViewModel – Acessa os dados vindos do Model, os modifica conforme o

necessário e os dispõe para a View através de um stream de dados

Figura 3.1 – Diagrama das relações entre Model, View, ViewModel.

Fonte: Model–view–viewmodel – Wikipedia [13].

A implementação deste modelo no projeto foi feita utilizando a biblioteca de

programação reativa RxJava [14], pois ela é a biblioteca mais utilizada para este tipo de

programação, possui uma documentação excelente e uma grande comunidade de

desenvolvedores. Desta maneira, é possível criar streams de dados, além de poder

utilizar o padrão de design Observable facilmente. Logo, as camadas do MVVM são

implementadas da seguinte maneira:

24

• Model – Expõe os dados utilizando a classe Flowable do RxJava.

Armazena e acessa os dados em um banco de dados local. No projeto, foi

utilizado o termo Model para as classes que representam os dados (Idea,

Label, Tablature, ...) e DataModel para as classes que lidam com o

armazenamento dos dados.

• ViewModel – Utiliza o Model diretamente para recolher os dados

necessários para a View. Trata os dados e os expõe como um stream para

a View utilizando a classe Flowable do RxJava. O ViewModel não

mantém uma referência direta para a View, porém ele mantém uma

referência para o Model.

• View – Interface da aplicação. Repassa as ações do usuário diretamente

ao ViewModel e o utiliza para recolher os dados necessários. No

Android, a View pode ser qualquer classe responsável pela interface do

usuário, como Activity e Fragment.

Uma implementação do MVVM no projeto pode ser vista nas figuras a seguir.

Na Figura 3.2, é mostrado o ViewModel de ideias utilizado na página inicial. Note

que o DataModel é injetado nele através de seu construtor. Na Figura 3.3, é

apresentado a interface do DataModel utilizada por todos os ViewModel que

precisam interagir com as ideias do aplicativo. O método de obtenção do ViewModel

pela View é mostrado pela Figura 3.4. Note que todo ViewModel no projeto é um

singleton, ou seja, só existe uma instância em todo programa. A Figura 3.5 mostra a

criação de todos os ViewModel e DataModel no projeto através do singleton

SongNoteApplication. Por fim, o Model Idea, responsável por conter as informações

para organização da ideia e agrupar o áudio e a tablatura, é apresentado na Figura

3.6.

25

Figura 3.2 – ViewModel para o Fragment de Ideias utilizado na primeira página

Figura 3.3 – Interface do DataModel de Ideias

Figura 3.4 – Método utilizado no Fragment de Ideias para buscar o ViewModel

correspondente

26

Figura 3.5 – Injeção de dependências a partir do Singleton SongNoteApplication

27

Figura 3.6 – Parte da implementação do Model da Ideia

Para remover o acoplamento entre o DataModel e o ViewModel, foi utilizado o

padrão de injeção de dependência. Uma interface do DataModel é criada

especificando as operações necessárias para o gerenciamento dos dados. No

ViewModel, ao invés dele declarar como dependência a implementação do

DataModel, ele se declara dependente da interface. Em uma outra parte da

aplicação, injeta-se a implementação desejada no ViewModel. Desta forma, se for

utilizada uma implementação que salva em um banco de dados local e haja uma

mudança para outra que envia os dados pela rede, não é preciso fazer nenhuma

alteração no ViewModel, basta injetar a dependência desejada. Note que este modelo

é ótimo para a realização de testes automatizados, pois basta injetar uma

implementação do DataModel que atenda aos casos de teste.

É interessante ressaltar que o ViewModel e o DataModel expõem um barramento

de eventos. Este barramento utiliza o padrão Publish-Subscribe, onde é possível

28

enviar eventos (pusblish) em um canal de comunicação em que os inscritos

(subscribers) são notificados. Ao realizar uma ação CRUD (Create, Read, Update,

Delete), por exemplo, o estado da ação é enviado para todos os inscritos no

barramento de eventos. Isto é obtido utilizando a classe PublishSubject do RxJava.

No projeto, uma View se inscreve no barramento exposto pelo seu ViewModel

correspondente. Quando a View chama um método de CRUD do ViewModel, ele

repassa a ação para o DataModel, que por sua vez realiza a ação e publica no

barramento de eventos. A View é então notificada sobre a ação e se atualiza para

refletir o estado do sistema. Um exemplo pode ser visto na Figura 3.7.

Figura 3.7 – View de edição de etiquetas se inscrevendo no barramento de eventos do

ViewModel

3.2.2 – Tablatura

A tablatura foi implementada utilizando três classes distintas:

• TablatureElement – Representa um elemento na tablatura. Carrega o

valor do traste, corda, modificadores, símbolos e tempo. Apesar do

tempo não ser usado atualmente, ele pode ser incluído no futuro

29

• TablatureNotation – Guarda todas as notas da tablatura e provê formas

de busca, inserção, edição e remoção de notas, além de implementar

funções auxiliares (como remoção de colunas vazias)

• Tablature – Guarda o cabeçalho da tablatura e todas as suas notas

Figura 3.8 – Parte da implementação da classe TablatureElement

Figura 3.9 – Parte da implementação da classe TablatureNotation

30

Figura 3.10 – Parte da implementação da classe Tablature

Além disso, foi implementado uma classe TablatureFactory utilizando o padrão

de design Factory. Desta forma, a criação de um objeto de tablatura é abstraída. Note

que, na classe Tablature, as variáveis do cabeçalho (title, subtitle, artist, ...) não são

inicializadas. Através do TablatureFactory, é possível instanciar um objeto com estes

valores corretos de acordo com a linguagem do usuário (utilizando a solução do próprio

Android). É possível também utilizar valores iniciais configurados pelo próprio usuário

(por exemplo, artist sempre será o nome do músico), porém esta funcionalidade foi

deixada para uma versão futura do aplicativo.

31

Figura 3.11 – Classe TablatureFactory

A renderização da tablatura é feita por outra classe chamada TablatureView. Ela

é um componente customizado que herda da classe LinearLayout do Android. Ela, em

si, desenha o cabeçalho da tablatura e delega a renderização das notas da tablatura para

a classe TablatureNotesView (ver Figura 3.12), que herda da classe View do Android.

Note que a classe View é a classe base para todos os componentes de interface do

Android.

32

Figura 3.12 – Renderização da tablatura

É interessante ressaltar que a partir do Model da tablatura, é possível

desenvolver classes que a desenhem de uma outra maneira qualquer. Por exemplo, é

possível desenhar a tablatura inteiramente em forma de texto utilizando os caracteres da

tabela ASCII, ou até desenhá-la continuamente, sem quebra de linha.

3.2.3 – Interação Com a Tablatura

A interação com a tablatura pode ser dividida em algumas partes:

• Seleção de um elemento na tablatura

• Inserção e remoção de notas

• Inserção e remoção de efeitos

A seleção de um elemento na tablatura é realizada através de um cursor, que

indica o elemento atual a ser editado na tablatura. Para mover o cursor, foi criado um

33

componente chamado JoystickButtons, que chama uma callback sempre que o usuário

realiza um clique válido (por exemplo, um clique na região central do componente não é

considerado um clique válido).

Figura 3.13 – Parte da implementação da classe Cursor

Figura 3.14 – Interface de clique válido da classe JoystickButtons

É possível também interagir diretamente com um elemento ao clicar nele (ou

próximo a ele). Para isso, existe um método que verifica que elemento o usuário deseja

selecionar a partir da posição do evento de clique na tablatura.

A inserção e remoção de notas foi feita criando o componente Fretboard.

Nele, são dispostas todas as notas (0 a 9), além da nota especial x, um botão para apagar

(semelhante ao backspace do teclado) e um botão de inserir (se estiver selecionado, ele

insere uma nova coluna na posição do cursor; se o usuário sair daquela coluna e ela

estiver vazia, a coluna é apagada). Ao clicar em algum desses botões, o componente

dispara uma callback e passa como parâmetro que botão foi clicado. Desta forma, uma

outra classe responsável por interagir com a tablatura pode lidar com o evento e tomar

uma ação.

34

Figura 3.15 – Parte da implementação da Fretboard

Para realizar a inserção de um elemento, uma coluna de inserção é injetada ao

final da tablatura. Após o usuário digitar uma nota e deslocar o cursor para a direita,

uma outra coluna de inserção é injetada. Caso o usuário adicione um efeito mas não

adicione uma nota correspondente, ao deslocar o cursor, os elementos inválidos são

removidos. Logo, não é possível ter um efeito desassociado de uma nota. O fluxo de

inserção pode ser observado na Figura 3.16

35

Figura 3.16 – Um possível fluxo de inserção. 1) A coluna de inserção está na posição 0.

2) O usuário digita o número 1 e depois o 2 na Fretboard. 3) O usuário move o cursor

para a direita, digita os números 1 e 4, move o cursor para cima e insere um efeito. No

momento que o cursor move para a direita, uma coluna de inserção é adicionada na

posição 1. 4) O usuário move o cursor para a direita. Neste momento, uma coluna de

inserção é adicionada na posição 3 e o efeito inválido é removido da coluna anterior

No caso da funcionalidade de inserção INS, a coluna de inserção é adicionada

sempre na posição do cursor. Quando o usuário se desloca, uma nova coluna é

adicionada e, se a coluna antiga estiver vazia, ela é removida, como mostra a Figura

3.17

36

Figura 3.17 – Um possível fluxo de inserção com o botão INS selecionado. 1) O usuário

seleciona o botão INS. 2) O usuário move o cursor para a esquerda. Neste momento, a

coluna de inserção anterior é apagada e uma nova é adicionada na posição 3. 3) O

usuário move o cursor para a esquerda. Novamente, a coluna de inserção anterior é

apagada e uma nova é adicionada na posição 2. 4) O usuário digita o número 3.

O processo de remoção de notas é similar ao processo de apagar um caractere

utilizando um teclado convencional. Se o usuário estiver digitando um elemento e

pressionar o botão de apagar, ele apagará a última nota do elemento. Caso o usuário

37

apague uma nota e a coluna esteja vazia, no momento em que o cursor for movido

horizontalmente, a coluna vazia será apagada. Este comportamento foi implementado

para que não existam colunas vazias na tablatura. Um fluxo do processo pode ser visto

na Figura 3.18

Figura 3.18 – Um possível fluxo de apagar. 1) O usuário digita os números 1 e 2 na

coluna 1. 2) O usuário pressiona o botão de apagar. O número 2 é apagado. 3) O usuário

pressiona o botão de apagar. O número 1é apagado. 4) O usuário move o cursor para

38

baixo. 5) O usuário pressiona o botão de apagar. Toda a nota é apagada. 6) O usuário

move o cursor para a esquerda. Neste momento, a coluna vazia é apagada

A inserção e remoção de efeitos foi implementada criando os componentes

BottomBar e BendIntensityBar. O BottomBar é uma barra de efeitos localizada de forma

fixa na parte inferior da tela de edição de tablatura. Ela insere o efeito desejado no

elemento de tablatura selecionado pelo cursor. Como nem todos os efeitos cabem nesse

espaço, foi utilizado uma técnica de agrupar os elementos semelhantes (como todos os

efeitos de slider por exemplo) e mostrá-los no clique. Desta forma, o usuário realiza um

clique para ver os efeitos do grupo e mais um clique para selecionar. No caso do bend,

além desta técnica, foi necessária a inserção de uma barra vertical para a escolha da

intensidade do bend. Esta barra só é mostrada no momento em que o usuário clica na

variante do bend desejada. Ao clicar na intensidade, o efeito é aplicado à nota atual,

como mostra a Figura 3.19.

39

Figura 3.19 – Fluxo de inserção de um bend com intensidade de 1 tom. 1) Tela inicial.

O usuário já digitou o número 12. 2) O usuário seleciona a opção de bend na barra

inferior. 3) O usuário seleciona o tipo de bend. Neste momento, uma barra vertical com

a intensidade do bend é mostrada. 4) O usuário seleciona a intensidade. A barra vertical

é escondida e o efeito é aplicado. Note que bend aplicado à nota é marcado para facilitar

sua localização

40

Figura 3.20 – Parte da implementação da BottomBar

Figura 3.21 – Parte da implementação da BendIntensityBar

3.2.4 – Áudio

O áudio pode ser dividido nas seguintes partes:

• Gravação

• Reprodução

• Renderização

A gravação é feita em uma thread própria, pois se fosse feita na mesma thread

da UI, a mesma seria bloqueada e pararia de processar os eventos de entrada do usuário.

41

Para este projeto, é necessário que o áudio gravado possa ser parado e retornado a

qualquer momento. Logo, deve ser possível fazer uma nova gravação e concatená-la

com uma gravação já existente. A classe AudioRecord [15] do Android não possui esta

funcionalidade, logo, foi desenvolvida uma solução própria.

Para realizar a gravação, foi criada a classe RecordingThread, responsável por

configurar uma instância da classe AudioRecord, capturar o áudio para um buffer e

chamar uma callback informando que o áudio foi capturado. Uma outra classe chamada

AudioRecorder instancia a RecordingThread e realiza a escrita do buffer de áudio para

um arquivo utilizando a classe FileOutputStream. Desta maneira, só é mantido em

memória o buffer da gravação, enquanto que o áudio completo é mantido em disco. A

classe AudioRecorder implementa a funcionalidade de “parar” uma gravação e retornar

de onde parou da seguinte forma: Ao realizar uma gravação, o áudio é armazenado em

disco como em sua forma pura (raw), sem nenhuma codificação nem cabeçalho. A

gravação seguinte é feita da mesma forma, porém, ao invés de criar um arquivo novo, o

mesmo é utilizado como parâmetro para o FileOutputStream.

No app, também é possível descartar a última gravação. Ou seja, se o usuário

realizou n gravações, e durante a gravação n + 1 ele decide que ela deve ser descartada,

a gravação final será composta de n gravações. Isto é implementado guardando a

posição da gravação n + 1 no arquivo de áudio e. Ao ser descartada, o arquivo de áudio

é copiado da posição 0 até o início da gravação n + 1 e o arquivo anterior é apagado. O

processo de gravar é representado pela Figura 3.22 e o de descartar, pela Figura 3.23.

Caso o usuário realize uma gravação grande e deseje descartar, uma janela de

confirmação é apresentada para confirmar a ação (ver Figura 3.24)

42

Figura 3.22 – Fluxo de gravação. 1) Tela inicial. 2) O usuário pressiona o botão de

gravação. A gravação começa a ser feita 3) O usuário pressiona o botão de parar. A

gravação é parada.

Figura 3.23 – Processo de descartar o último áudio. 1) O usuário está gravando um

áudio. 2) O usuário pressiona o botão de descartar. A última gravação é descartada.

43

Figura 3.24 – Janela mostrada ao usuário quando ele tenta descartar uma gravação

grande.

Todas as músicas do usuário ficam armazenadas em uma pasta criada pelo

aplicativo; ao editar uma música já existente, o arquivo de áudio original é copiado para

uma pasta temporária, onde o usuário possa fazer as modificações que desejar. Desta

forma, não há risco de comprometer o arquivo de áudio original. Quando o usuário

salva a música, o arquivo da pasta temporária é copiado para o local correto. Vale

ressaltar que só é possível utilizar um arquivo de áudio temporário por vez, logo quando

o usuário edita ou cria uma outra música, o arquivo de áudio na pasta temporária é

apagado e um novo arquivo é copiado ou criado.

A reprodução, assim como a gravação, deve ser feita em uma thread separada

para não comprometer a UI. A classe PlaybackThread foi criada para reproduzir um

arquivo gerado pela RecordingThread. Ela faz a leitura do arquivo de áudio utilizando a

classe FileInputStream e, sempre que o buffer de leitura está pronto, ela o escreve em

uma instância da classe AudioTrack [16].

Para lidar com a interação do usuário com respeito à reprodução de áudio, foi

criado um componente chamado Player. Ele cria uma instância da PlaybackThread,

provê funções de play, pause, stop, ir para o início e final da música, habilitar e

44

desabilitar a reprodução, além de callbacks que informam o estado da reprodução e

outras funcionalidades.

Figura 3.25 – Interface que expõe o estado do Player

O processo de renderização é responsável por mostrar para o usuário um

“gráfico” de barras correspondente ao áudio gravado. Para isso, deve-se utilizar uma

amostra bem menor do arquivo de áudio, pois não é possível, nem desejado, plotar todas

as amostras de áudio gravado. Como a visualização é renderizada em tempo real, deve-

se coletar amostras conforme o áudio é gravado. A classe AudioRecorder implementa

esta funcionalidade a partir de uma callback. Em um determinado intervalo de tempo,

ela chama a callback passando como parâmetro uma amostra aleatória do áudio gravado

naquele intervalo de tempo. Assim, temos uma amostra pequena, porém significativa do

áudio gravado. Vale ressaltar que esta amostra é armazenada para que a renderização

seja sempre a mesma.

45

Figura 3.26 – Notificação de amostras de áudio

A renderização em si é feita de duas maneiras. Como o usuário é capaz de mover

a renderização horizontalmente para ajustar a posição do áudio, ele deve estar

completamente renderizado; quando o áudio está sendo gravado, qualquer interação

com o Player e com o gráfico é desabilitada e somente as últimas amostras gravadas são

mostradas na tela (ver Figura 3.27).

Figura 3.27 – Comparação entre um áudio já gravado e uma gravação. A) Um áudio

gravado. O usuário pode interagir com ele e movimentá-lo horizontalmente. B) Áudio

durante uma gravação. Toda a interação do usuário com o mesmo é desabilitada

Assim, temos que, quando uma gravação não está sendo feita, todo o áudio é

renderizado de uma só vez. Para prover o deslizamento fluido e manter o início ou final

46

do áudio no centro da tela, o componente AudioView adiciona dois espaçamentos, um à

esquerda do AudioViewContent e outro à direita. Além disso, ele encapsula estes três

componentes em uma View de scroll (ver Figura 3.28 e Figura 3.29)

Figura 3.28 – Parte do arquivo audio_view.xml

47

Figura 3.29 – Visualização do áudio. A) Início do áudio. O usuário só pode deslocá-lo

para a esquerda. B) Posição intermediária. O usuário pode deslocá-lo para a direita e

para a esquerda. C) Final do áudio. O usuário só pode deslocá-lo para a direita

Quando uma gravação está sendo feita, seria altamente custoso redesenhar todas

as amostras de áudio a cada vez que uma amostra fosse recolhida. Se isso fosse feito, a

UI se tornaria extremamente lenta após alguns segundos de gravação. Para resolver este

problema, o componente AudioViewContent possui dois modos de operação. Um, já

visto, é capaz de renderizar todas as amostras de áudio. Neste processo, ele se

redimensiona para que todas as amostras possam ser desenhadas; o segundo modo

renderiza somente um conjunto de amostras; neste caso, o componente possui um

tamanho fixo (determinado pelo AudioView) e desenha somente as últimas amostras. O

algoritmo desenvolvido para desenhar o áudio pode ser visto na Figura 3.30

48

Figura 3.30 – Parte principal do algoritmo para realizar o desenho do áudio

Note que no algoritmo é utilizado um componente para fazer a média móvel do

módulo das amostras antes de renderizar. Isto é feito para garantir que o desenho feito

não contenha muitas mudanças bruscas entre uma barra de áudio e outra. Como as

amostras são aleatoriamente escolhidas, comumente são escolhidos valores muito altos

e muito baixos, o que tornam o desenho desproporcional. Uma comparação entre um

áudio renderizado com e sem média móvel pode ser visto na Figura 3.31

49

Figura 3.31 – Comparação entre renderização de áudio. A) Áudio renderizado sem

média móvel. B) O mesmo áudio renderizado com média móvel

A média móvel utilizada neste projeto foi feita utilizando um buffer circular e

um vetor de pesos. Os pesos foram atribuídos utilizando a fórmula

onde N é o tamanho da janela alocada (tamanho do buffer). O denominador da

fórmula é o somatório de i a N, logo, na implementação, foi utilizada a fórmula da soma

da progressão aritmética para este caso específico

A implementação completa pode ser vista no Apêndice 1

3.2.5 – Metrônomo

O metrônomo é um instrumento de suporte ao músico, cuja funcionalidade é

indicar o andamento musical através de pulsos sonoros. Um metrônomo simples foi

incorporado nesta versão do projeto para auxiliar o usuário durante uma gravação ou até

durante o treinamento de uma música.

50

Figura 3.32 – Metrônomo implementado no projeto

Sua implementação foi feita a partir de duas classes, uma chamada

MetronomeSound, capaz de reproduzir o som do metrônomo em uma thread separada, e

outra chamada Metronome, responsável por interagir com o usuário e controlar os

parâmetros do metrônomo.

Existem dois áudios para o metrônomo, nomeados como tick e tock. Ao

instanciar a classe MetronomeSound, esses sons são carregados em uma SoundPool [17]

que os mantém em memória. Quando o usuário inicia o metrônomo, uma thread é

iniciada e executa os áudios de acordo com as configurações.

A classe Metronome recebe a quantidade de batidas por minuto (BPM) através

de um slider horizontal e de dois botões para ajuste fino. Porém, nem sempre é fácil o

usuário saber exatamente quantos BPM ele deseja, logo foi adicionado um botão

chamado TAP configura o BPM a partir de toques consecutivos do usuário. Ou seja, se o

usuário clicar várias vezes no botão, o intervalo entre os cliques irá determinar o BPM.

Isto é feito dividindo-se um minuto pelo tempo entre duas batidas consecutivas, como

pode ser visto na Figura 3.32. Note que pressionar um botão em intervalos de tempo

regulares não é tão fácil, duas medidas consecutivas podem ser muito discrepantes. Para

resolver este problema, foi utilizada uma média com pesos fixos, onde as medidas mais

recentes têm peso maior do que as mais antigas. Assim, a medição do BPM consegue se

estabilizar depois de poucos cliques.

51

Figura 3.32 – Implementação do algoritmo para medir o BPM

3.2.6 – Informações e Etiquetas

Cada ideia musical é acompanhada de dados que servem para sua identificação e

organização. Toda ideia pode possuir título, descrição, instrumento e etiquetas. Os

campos título, descrição e instrumento são armazenados diretamente na classe Idea e

são editados diretamente pelo usuário (ver Figura 3.33).

52

Figura 3.33 – Seleção de instrumento. 1) Usuário aperta o botão para mudar o

instrumento. 2) Usuário seleciona o instrumento desejado. 3) Instrumento é alterado

As etiquetas são representadas pela classe Label e se relacionam de forma n:n

com a classe Idea. Existem dois DataModels no projeto atualmente, um que lida com a

classe Idea e outro, com a classe Label. A interface ILabelDataModel expõe métodos

para lidar com as etiquetas e pode ser observado na Figura 3.34

Figura 3.34 – Interface ILabelDataModel

Existem duas formas do usuário adicionar uma etiqueta. Ao editar uma ideia,

existe um campo na aba INFO que representa as etiquetas associadas à ideia. Ao clicar

neste campo, o usuário é levado para uma página de seleção contendo todas as etiquetas

do projeto. Se ele desejar, pode adicionar uma etiqueta nova, conforme é mostrado na

Figura 3.35. Nesta tela, não é possível editar nem apagar etiquetas. A segunda maneira é

53

feita a partir de uma tela própria para edição de etiquetas. Na tela inicial, no menu

lateral, existe uma opção para editar etiquetas. Ao clicar, o usuário é direcionado para

uma tela de edição de etiquetas, onde as operações de adicionar, renomear e apagar são

fornecidas. Um fluxo de criação de etiqueta pode ser visto na Figura 3.36 e um

apagando uma etiqueta está presente na Figura 3.37.

Figura 3.35 – Fluxo de inserção de etiqueta a partir da edição de ideia. 1) Tela inicial. 2)

Ao clicar em Etiquetas, uma janela de seleção é mostrada para o usuário. 3) O usuário

clica no botão de adicionar etiqueta. Uma janela é mostrada perguntando no nome da

nova etiqueta. 4) O usuário cria a etiqueta e ela é selecionada automaticamente. 5) O

usuário volta para a tela anterior. A etiqueta está aplicada na ideia

54

Figura 3.36 – Fluxo de criação de etiqueta a partir do editor. 1) A partir da tela inicial, o

usuário abre o menu lateral. 2) Uma janela de edição de etiquetas é mostrada para o

usuário. 3) O usuário pressiona o botão de adicionar etiqueta. Um campo para inserir o

nome da etiqueta é mostrado na parte superior da lista. 4) O usuário escreve o nome

desejado. 5) O usuário confirma o nome. A nova etiqueta é adicionada à lista

55

Figura 3.37 – Fluxo de apagar etiqueta a partir do editor. 1) Usuário seleciona a etiqueta

que deseja apagar. 2) Usuário pressiona o botão de apagar. Um aviso é mostrado para o

usuário para confirmar a ação. 3) A etiqueta é apagada

Uma etiqueta agrupa várias músicas com características semelhantes. Para ver

músicas com uma mesma etiqueta, basta o usuário acessar a página da etiqueta pelo

menu lateral na página inicial (ver Figura 3.38). Caso ele queira editar rapidamente o

nome da etiqueta, basta ele acessar o menu superior. Uma janela será aberta para

realizar a edição (ver Figura 3.39).

56

Figura 3.38 – Fluxo de ver ideias agrupadas por uma etiqueta. 1) Tela inicial. 2) Usuário

abre o menu lateral. 3) Ao clicar na etiqueta desejada, a lista de ideias é atualizada

57

Figura 3.39 – Fluxo de renomear etiqueta a partir da tela da etiqueta. 1) Tela inicial. 2)

Usuário clica no botão superior à direita e um menu é mostrado. 3) Usuário seleciona a

opção de renomear etiqueta. 4) Usuário digita o novo nome da etiqueta. 5) Usuário

confirma a ação. A etiqueta é renomeada

Vale ressaltar que existem restrições para criação de etiquetas. Caso o usuário

adicione uma etiqueta inválida, uma mensagem é mostrada e a ação não é feita. (ver

Figura 3.40)

58

Figura 3.40 – Telas de etiquetas inválidas em lugares distintos do aplicativo

3.2.7 – Armazenamento

Na solução apresentada, existem três formas de armazenamento. Um banco de

dados local armazena as ideias e as etiquetas. O áudio gravado é armazenado

diretamente na memória interna do dispositivo. A tablatura é armazenada com o

formato JSON na memória interna do aparelho. A tablatura é carregada inteiramente em

memória somente quando é necessário (quando necessita ser visualizada ou editada); o

áudio é carregado aos poucos em forma de stream durante uma reprodução, logo ele

nunca é carregado inteiramente na memória.

Para armazenar os dados, foi utilizado o Realm Database [18]. Diferente de

outros bancos de dado, o Realm abstrai toda a manipulação de dados através de uma

API. Todo dado que pode ser armazenado deve ser uma instância de classe que herde da

classe RealmObject. Desta forma, o Realm é capaz de gerenciar e realizar as operações

esperadas de um banco de dados de uma maneira fácil e rápida. Não é necessário

escrever nenhuma query, pois o Realm provê uma API que abstrai toda e qualquer query

(ver Figura 3.41).

59

Figura 3.41 – Demonstração de operações usando Realm

Fonte: Realm: Create reactive mobile apps in a fraction of the time [18].

Utilizando o modelo MVVM, o uso do Realm fica muito bem definido. As

classes principais que representam o Model da aplicação são classes que herdam de

RealmObject (salvo algumas exceções). A camada DataModel é a única que gerencia os

dados, logo ela é a única que realiza operações utilizando a API do Realm. Na Figura

3.42, é possível observar um método da classe IdeaDataModel que implementa a

interface IIdeaDataModel. Neste método, é feito uma busca utilizando os métodos

providos pelo Realm e é retornado um stream de dados de forma assíncrona a partir da

classe Flowable do RxJava. Note que o Realm possui uma boa integração com o

RxJava.

Figura 3.42 – Método que busca todas as ideias a partir do nome de uma etiqueta

Existem duas exceções no projeto que não utilizam o Realm diretamente. Uma

delas, já mencionado, é o áudio gravado. Ele é gravado diretamente em disco e somente

seu caminho é gravado no Realm. A segunda exceção é a tablatura. Todos os dados do

60

cabeçalho da tablatura poderiam ser salvos tranquilamente com o Realm, porém, não é

possível salvar as notas da tablatura de maneira prática.

O jeito mais simples e eficaz de lidar com as notas da tablatura foi utilizando a

biblioteca GSon [19], capaz de converter uma classe Java em uma representação JSON

[20] e vice-versa. Além de ser capaz de converter classes que carregam tipos primitivos,

ela dá suporte a diversas estruturas de dados padrões do Java. Logo, as notas presentes

na tablatura são convertidas perfeitamente pela biblioteca.

O GSon foi utilizado no projeto para converter a classe Tablature inteira para

JSON. Assim, na classe Idea, existe uma instância da classe Tablature que é anotada

com a anotação @Ignore para que o Realm não tente gravá-la. Ao invés disso, o JSON é

salvo em disco e o caminho do arquivo é salvo pelo Realm em forma de string. O

próprio JSON poderia ser convertido em string e armazenado no Realm, porém sempre

que uma ideia fosse obtida, uma string enorme representando a tablatura também seria

obtida, convertida para JSON e depois convertida para uma instância da classe

Tablature. E isso ocorreria para todas as ideias sempre que o usuário entrasse no app,

por exemplo. Na solução implementada, apenas o caminho do arquivo é carregado.

Somente quando o usuário necessita ver a tablatura (na página de visualização de ideia e

na de edição) é que ela é carregada e convertida. Na Figura 3.43, é possível ver as

funções que gravam e carregam a tablatura.

61

Figura 3.43 – Métodos que salvam e carregam a tablatura

3.2.8 – Interface e Experiência de Usuário

Em qualquer sistema, existem regras e padrões que definem sua identidade

visual e no Android não seria diferente. O Material Design [21] é “Um sistema

unificado que combina teoria, recursos e ferramentas para construir experiências

digitais” [21] e ele é a base para toda a interface do sistema Android a partir da versão

5.0. Ao desenvolver um app para Android, é recomendado seguir suas guidelines. No

projeto, o Material Design foi utilizado extensivamente, desde a paleta de cores até as

animações. Uma comparação entre os exemplos do Material Design e a implementação

no projeto pode ser observado pela Figura 3.44 e Figura 3.45

62

Figura 3.44 – Comparação entre um exemplo de lista definida pelo Material Design (A)

e uma lista do projeto (B) Fonte: Adaptado de [22]

63

Figura 3.45 – Comparação entre um exemplo de menu lateral definido pelo Material

Design (A) e o utilizado no projeto (B) Fonte: Adaptado de [23]

Quando se trata de design, é muito importante manter a consistência da

interface. No projeto, o botão de ação flutuante (FAB – Floating Action Button) [24] é

bastante utilizado, principalmente para suas ações principais (ver Figura 3.46).

64

Figura 3.46 – Todos os FABs utilizados no projeto

Também é importante manter a consistência entre os textos do aplicativo. Neste

caso, a mesma nomenclatura foi utilizada para ações semelhantes. Por exemplo, a

palavra “descartar” foi utilizada quando um usuário está editando uma ideia e resolve

apagar a tablatura ou áudio atual, ou quando ele sai do editor sem salvar; neste caso, o

aplicativo pergunta se o usuário pretende descartar a ideia (ver Figura 3.47). A palavra

“apagar” foi utilizada para realizar ações de apagar em dados já salvos; por exemplo, o

usuário pode apagar uma ideia ou uma etiqueta (ver Figura 3.48).

65

Figura 3.47 – Palavra “descartar” utilizada no projeto

66

Figura 3.48 – Palavra “apagar” utilizada no projeto

As telas que utilizam os mesmos componentes também são consistentes.

Observe na Figura 3.49 uma comparação entre a visualização e edição de ideia. Os

componentes utilizados são os mesmos, com leves modificações para aprimorar a

experiência do usuário de acordo com o contexto. O mesmo ocorre na edição e na

seleção de etiquetas, onde os elementos são em forma de lista e os elementos visuais de

cada item da lista depende do contexto.

67

Figura 3.49 – Comparação entre visualização e edição de ideia. A) Página inicial da

visualização de ideia. B) Usuário clica no botão de reproduzir áudio. O botão de desloca

e se expande para revelar o player. C) Usuário desliza um pouco a tela para baixo. D)

Usuário desliza um pouco mais a tela para baixo. Visualização do áudio é escondida

com uma animação na opacidade. E) Usuário começa a visualizar a tablatura. F) Página

inicial da tela de edição. Áudio está sempre visível. G) Página de edição de tablatura. H)

Usuário desliza a tela para baixo. A barra de navegação é deslizada e a tablatura possui

um cursor para edição.

68

Um detalhe muito importante no processo de design é dar um feedback para o

usuário de acordo com suas ações, pois isto mostra que suas ações realmente ocorreram.

Quando o usuário faz uma ação e não nota nenhuma mudança, na sua concepção, a ação

não foi feita ou o aplicativo não funcionou da maneira esperada. No projeto, sempre que

uma ação importante é realizada, um snackbar [25] com o resultado da ação é mostrado

para o usuário. É importante ressaltar que erros também podem ocorrer, como por

exemplo, não conseguir gravar um áudio por que o usuário não deu permissão para o

aplicativo. Nesses casos, é importante também relatar que a ação não foi realizada. Para

isso, um snackbar informa o erro ocorrido para o usuário.

Figura 3.50 – Exemplos de snackbar mostrados para o usuário. A) Snackbar de quando

o usuário descarta a tablatura. B) Snackbar de erro de permissão

Para realizar ações que possam apagar algum conteúdo de forma permanente,

como apagar uma ideia, o usuário sempre é notificado para confirmar a ação (ver Figura

3.51). Desta forma, a chance cometer um erro e fazer uma ação indesejada é menor. É

sempre importante ter em mente que o usuário pode apertar um botão sem querer, ou até

clicar sem saber o seu significado (como um botão que só possui ícone, por exemplo).

69

Logo, alertar o usuário do que sua ação está prestes a fazer remedia esse

comportamento.

Figura 3.51 – Exemplos de ações perigosas que pedem a confirmação do usuário

É importante também deixar claro para o usuário que uma página está vazia.

Uma página vazia pode dar a sensação de que o aplicativo não carregou direito, ou que

existe alguma demora e ele precisa esperar o conteúdo carregar. Para evitar essa

confusão, foi utilizado o padrão empty state [26]. Ele geralmente contém uma imagem

ilustrativa de acordo com o context e um texto curto que explica que a página está vazia.

70

No projeto, este padrão foi utilizado também para ensinar o usuário a utilizar o

aplicativo. Quando não há nenhuma ideia salva, imagens e textos mostram para o

usuário o que ele deve fazer para criar uma nova ideia. O mesmo ocorre para as

etiquetas (ver Figura 3.52).

Figura 3.52 – Exemplos de empty state usados no projeto

Um estudo realizado por Josh Clark [27] e estendido em uma publicação da

Smashing Magazine [28] revela que a maioria utiliza os dedos polegares para interagir

com o smatphone. A partir disso, foram feitos experimentos para entender a dificuldade

de alcançar determinadas partes da tela. Em resumo, existe uma região em que a

interação com o usuário é natural, ou seja, ela é facilmente alcançada; existe uma

segunda região onde o usuário alcança, mas precisa esticar os dedos de forma nada

confortável; e existe uma terceira região, onde a interação é muito difícil. Esta

comparação pode ser vista na Figura 3.53.

71

Figura 3.53 – Comparação entre facilidade de interação na tela de um smartphone. A

representação mais à esquerda mostra o uso do aparelho utilizando a mão direita. Mais à

direita, mostra o uso com a mão esquerda. No meio, mostra o uso com duas mãos Fonte: Artigo da Smashing Magazine [28]

Um dos pontos do artigo é que a localização do conteúdo é muito importante.

Quanto mais inferior for a localização, mais fácil será a interação com o usuário. Não há

problema existir interação na parte superior, porém é recomendado que sejam

posicionadas funcionalidades de uso menos frequente. Estas informações foram muito

úteis para o desenvolvimento do aplicativo. Note que em todas as telas, as

funcionalidades principais são facilmente alcançadas pelo usuário. Este conceito é bem

explorado na edição de tablatura, onde toda a interação é localizada na parte inferior da

tela. Na Figura 3.54, são mostradas as regiões de facilidade de toque na tela de edição

de tablatura.

72

Figura 3.54 – Regiões de facilidade de toque na tela de edição de tablatura

Fonte: Adaptado da Smashing Magazine [28]

3.2.9 – Análises de Resultado

O aplicativo Song Note foi publicado na Google Play em 25 de janeiro de 2018

para usuários que possuam no mínimo Android 5.0 e pode ser baixado através do

endereço https://play.google.com/store/apps/details?id=com.brunocalou.songnote de

forma gratuita. Como sua publicação foi feita de forma recente, não houve tempo hábil

para receber muitos feedbacks. Porém, o sentimento do público alvo com relação ao app

foi bem positivo. Algumas pessoas disseram estar procurando por um aplicativo assim

há meses. As maiores críticas não foram sobre as funcionalidades do aplicativo

atualmente, e sim as que ele ainda não possui. A crítica mais marcante foi a de não

reproduzir o som a partir da tablatura. Uma outra crítica foi não poder adicionar o tempo

das notas. Apesar de ser uma funcionalidade importante, é dispensável para muitos

usuários.

Com cerca de 30 dias de lançamento, o app foi baixado por 274 usuários, e

desinstalado por 85. A maior parte dos downloads foi feita no Brasil, onde o app teve

mais divulgação. Porém, outros países também se encontram na lista de downloads,

como Estados Unidos, Índia e Rússia.

73

Figura 3.55 – Estatísticas de uso do aplicativo

Fonte: Aplicativo no Google Play Console [29]

Apesar de ter um número relativamente alto de instalações, o número de

desinstalações também é alto. Diversos experimentos [30] [31] [32] [33] [34] mostram

que a taxa de retenção de aplicativos é bastante baixa e varia de acordo com a categoria

do aplicativo, público alvo, memória disponível no aparelho e engajamento do usuário.

Como o aplicativo possui um nicho muito limitado (músicos que queiram salvar suas

ideias musicais), possui uma forte concorrência e ainda não possui todas as

funcionalidades de outros aplicativos, é esperado que a taxa de retenção não seja muito

alta, levando a um grande número de desinstalações.

74

Capítulo 4

Conclusão e Trabalhos Futuros

Dentro do escopo definido, o aplicativo atende bem os requisitos, sendo capaz

de guardar e organizar ideias musicais, associando um áudio a uma tablatura. A edição

de tablatura é feita de forma rápida pelo usuário, pois todas as suas funcionalidades são

posicionadas de forma coerente no canto inferior da tela. Além de poder gravar o áudio

em sequência, ou seja, sendo capaz de parar e continuar uma gravação, o aplicativo

permite descartar a última gravação, se o usuário desejar. O sistema de etiquetas permite

categorizar as ideias e filtrá-las rapidamente, o que contribui para a organização das

ideias. O usuário recebe um feedback de todas as suas ações, o que dá a certeza de que

aquela ação foi feita. Além disso, o aplicativo possui uma boa interface baseada no

Material Design.

Por estar na Google Play a pouco tempo, o aplicativo ainda não possui muitos

downloads, porém seu potencial para o sucesso é considerável. O feedback dos usuários

foi bastante positivo e, apesar de não possuir todas as funcionalidades de outros

aplicativos, o app realmente resolve o problema de escrever tablaturas de instrumentos

de cordas trasteados e fazer a associação com uma gravação, além de manter a

organização de ideias musicais.

Como trabalhos futuros, serão desenvolvidas as funcionalidades mais pedidas

pelos usuários, além de outras que não foram implementadas, mas que são importantes,

como poder ordenar as músicas por data de criação, por exemplo. Algumas das

funcionalidades previstas para o futuro do aplicativo estão listadas abaixo:

• Traduzir o aplicativo para outros idiomas

• Compartilhar o áudio

• Compartilhar a tablatura em forma de texto e imagem

• Compartilhar tablatura em forma de PDF para impressão

• Permitir a documentação do tempo e da intensidade de cada nota

• Otimizar design do aplicativo para tablets

• Adicionar mais efeitos na tablatura

75

• Dicionário de acordes

• Editor de cifras

• Permitir configuração do aplicativo (valores padrão na tablatura, no

metrônomo, etc.)

• Poder ordenar ideias por nome, data de criação, de modificação, etc.

• Incluir uma barra de pesquisa na tela inicial para buscar ideias a

partir de um texto

• Melhorar a implementação do metrônomo, dando mais opções de

configuração

• Adicionar contagem regressiva antes de começar uma gravação

• Selecionar, copiar, colar e remover partes da tablatura e do áudio

• Desfazer e refazer ações no editor de ideia

• Segmentar a tablatura em partes diferentes

• Reprodução de tablatura

• Filtros de áudio (distorção, delay, noise gate, reverb, etc.)

• Permitir a importação de áudio em diversos formatos (e.g.

compartilhar um áudio com o aplicativo)

• Escrever tablatura a partir do som gravado

• Fazer backup das ideias na nuvem

76

Bibliografia

[1] “Guitar Pro - Sheet music editor software for guitar, bass, keyboards, drums and

more...”, https://www.guitar-pro.com, 2017, (Acesso em 11 Outubro 2017)

[2] “Google Play”, https://play.google.com/store, 2017, (Acesso em 11 Outubro 2017)

[3] “Guitar Pro – Apps para Android no Google Play”,

https://play.google.com/store/apps/details?id=com.arobasmusic.guitarpro, 2017,

(Acesso em 11 Outubro 2017)

[4] “Guitar Tabs X – Apps para Android no Google Play”,

https://play.google.com/store/apps/details?id=com.finestandroid.guitartabs, 2017,

(Acesso em 11 Outubro 2017)

[5] “Tab Maker (tablature editor) – Apps para Android no Google Play”,

https://play.google.com/store/apps/details?id=wolf.games.mobile.tabmaker, 2017,

(Acesso em 11 Outubro 2017)

[6] “TuxGuitar – Apps para Android no Google Play”,

https://play.google.com/store/apps/details?id=org.herac.tuxguitar.android.activity.a

dmob, 2017, (Acesso em 11 Outubro 2017)

[7] “IgaraFu(Tablature Editor) free – Apps para Android no Google Play”,

https://play.google.com/store/apps/details?id=org.artica.muu.igarafufree, 2017,

(Acesso em 11 Outubro 2017)

[8] “Guitar Partner Lite – Apps para Android no Google Play”,

https://play.google.com/store/apps/details?id=com.datoh.app.android.tabdroid.lite,

2017, (Acesso em 11 Outubro 2017)

[9] “Guitar Notepad - Tab Editor – Apps para Android no Google Play”,

https://play.google.com/store/apps/details?id=com.codefad.guitarnotepad, 2017,

(Acesso em 11 Outubro 2017)

[10] “Tabify guitar composition – Apps para Android no Google Play”,

https://play.google.com/store/apps/details?id=com.tabify.writer, 2017, (Acesso em

11 Outubro 2017)

[11] “Conheça o Android Studio | Android Studio”,

https://developer.android.com/studio/intro/, 2017, (Acesso em 11 Outubro 2017)

[12] “IntelliJ IDEA: The Java IDE for Professional Developers by JetBrains”,

https://www.jetbrains.com/idea/, 2017, (Acesso em 11 Outubro 2017)

[13] “Model–view–viewmodel – Wikipedia”,

77

https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel,

2018, (Acesso em 12 Fevereiro 2018)

[14] “ReactiveX/RxJava: RxJava – Reactive Extensions for the JVM – a library for

composing asynchronous and event-based programs using observable sequences for

the Java VM.”,

https://github.com/ReactiveX/RxJava, 2018, (Acesso em 12 Fevereiro 2018)

[15] “AudioRecord | Android Developers”,

https://developer.android.com/reference/android/media/AudioRecord.html, 2018,

(Acesso em 14 Fevereiro 2018)

[16] “AudioTrack | Android Developers”,

https://developer.android.com/reference/android/media/AudioTrack.html, 2018,

(Acesso em 14 Fevereiro 2018)

[17] “SoundPool | Android Developers”,

https://developer.android.com/reference/android/media/SoundPool.html, 2018,

(Acesso em 15 Fevereiro 2018)

[18] “Realm: Create reactive mobile apps in a fraction of the time”,

https://realm.io/, 2018, (Acesso em 15 Fevereiro 2018)

[19] “google/gson: A Java serialization/deserialization library to convert Java Objects

into JSON and back”,

https://github.com/google/gson, 2018, (Acesso em 15 Fevereiro 2018)

[20] “JSON”,

https://www.json.org/json-pt.html, 2018, (Acesso em 15 Fevereiro 2018)

[21] “Material Design”,

https://material.io/, 2018, (Acesso em 16 Fevereiro 2018)

[22] “Lists - Components - Material Design”,

https://material.io/guidelines/components/lists.html, 2018, (Acesso em 16 Fevereiro

2018)

[23] “Navigation drawer - Patterns - Material Design”,

https://material.io/guidelines/patterns/navigation-drawer.html, 2018, (Acesso em 16

Fevereiro 2018)

[24] “Buttons: Floating Action Button - Components - Material Design”,

https://material.io/guidelines/components/buttons-floating-action-button.html,

2018, (Acesso em 16 Fevereiro 2018)

[25] “Snackbars & toasts - Components - Material Design”,

https://material.io/guidelines/components/snackbars-toasts.html, 2018, (Acesso em

16 Fevereiro 2018)

[26] “Empty states - Patterns - Material Design”,

78

https://material.io/guidelines/patterns/empty-states.html, 2018, (Acesso em 16

Fevereiro 2018)

[27] “How We Hold Our Gadgets · An A List Apart Article”,

http://alistapart.com/article/how-we-hold-our-gadgets, 2015, (Acesso em 16

Fevereiro 2018)

[28] “The Thumb Zone: Designing For Mobile Users — Smashing Magazine”,

https://www.smashingmagazine.com/2016/09/the-thumb-zone-designing-for-

mobile-users/, 2016, (Acesso em 16 Fevereiro 2018)

[29] “Google Play Console”,

https://play.google.com/apps/publish/, 2018, (Acesso em 18 Fevereiro 2018)

[30] “New data shows losing 80% of mobile users is normal, and why the best apps do

better at andrewchen”,

http://andrewchen.co/new-data-shows-why-losing-80-of-your-mobile-users-is-

normal-and-that-the-best-apps-do-much-better/, 2016, (Acesso em 13 Março 2018)

[31] “Enter the Matrix: App Retention and Engagement | Flurry Blog”,

http://flurrymobile.tumblr.com/post/144245637325/appmatrix, 2016, (Acesso em

13 Março 2018)

[32] “Now Available – Android Uninstall Benchmarks | Apsalar”,

https://apsalar.com/2016/06/now-available-android-uninstall-benchmarks/, 2016,

(Acesso em 13 Março 2018)

[33] “23% of Users Abandon an App After One Use | Localytics”,

http://info.localytics.com/blog/23-of-users-abandon-an-app-after-one-use, 2016,

(Acesso em 13 Março 2018)

[34] “Mobile App Retention: 75% Users Uninstall An App Within 90 Days [REPORT]

- Dazeinfo”,

https://dazeinfo.com/2016/05/19/mobile-app-retention-churn-rate-smartphone-

users/, 2016, (Acesso em 13 Março 2018)

79

Apêndice A

Implementação de Média Móvel

package com.brunocalou.songnote.utils;

import java.util.ArrayList;

public class MovingAverage {

private ArrayList<Double> numbers;

private ArrayList<Double> weights;

private int currentIndex = 0;

private int size = 0;

public MovingAverage(int size) {

this.size = size;

numbers = new ArrayList<>();

numbers.ensureCapacity(size);

weights = new ArrayList<>();

weights.ensureCapacity(size);

// Sum of the arithmetic progression from 1 to size

double sum = size * (1 + size) / 2;

for (int i = 0; i < size; i += 1) {

numbers.add(0d);

weights.add((size - i) / sum);

}

}

public void add(double number) {

80

numbers.set(currentIndex, number);

currentIndex += 1;

if (currentIndex == numbers.size()) {

currentIndex = 0;

}

}

public double getAverage() {

double sum = 0;

for (int i = 0; i < numbers.size(); i += 1) {

int weightIndex = i - currentIndex;

if (weightIndex < 0) weightIndex += numbers.size();

sum += numbers.get(i) * weights.get(weightIndex);

}

return sum / numbers.size();

}

public void clear() {

for (int i = 0; i < numbers.size(); i += 1) {

numbers.set(i, 0d);

}

}

public int getSize() {

return size;

}

}