Клиент-серверное iOS-приложение для создания музыки

Обзор и сравнение мобильных приложений для создания музыки. Особенность воспроизведения звука с MIDI-клавиатуры. Исследование сохранения файлов midi. Формирование запросов в сеть. Обработка пользовательских мелодий алгоритмами машинного обучения.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 10.12.2019
Размер файла 936,5 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

ПРАВИТЕЛЬСТВО РОССИЙСКОЙ ФЕДЕРАЦИИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ

ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ

«ВЫСШАЯ ШКОЛА ЭКОНОМИКИ»

Выпускная квалификационная работа

На тему «Клиент-серверное ios-приложение для создания музыки»

Выполнил

Е.Е. Шишко

Москва 2019

Реферат

Существует множество красивых и удобных мобильных приложений и программ для разработки музыки. В данном документе описывается процесс разработанного мобильного приложения, которое позволяет создавать простые музыкальные композиции, а затем преобразовывать их на стороннем сервисе, чтобы придать им звучание, характерное выбранному жанру музыки.

Приложение позволяет играть на различных музыкальных инструментах, записывать мелодии на нескольких дорожках, хранить их в облачном сервисе iCloud, сервере приложения, а также просматривать обработанные на стороннем сервисе мелодии всем пользователям.

В работе описаны выбранные инструменты и подходы к реализации мобильного и серверного приложения, рассмотрены основные конкуренты и преимущества над ними.

В работе 59 страниц, 4 главы, 23 иллюстрации, 28 источников, 4 приложения.

Ключевые слова -- iOS приложение, создание музыки, запись MIDI композиций, клиент-серверное приложение.

There are many beautiful and convenient mobile applications and software for developing music. This document describes the process of a developed mobile application that allows you to create simple musical compositions and then transform them on a third-party service in order to give them a sound characteristic of the chosen music genre.

The application allows you to play various musical instruments, record tunes on several tracks, store them in the iCloud cloud service, the application server, and view the tunes processed on a third-party service to all users.

The paper describes the selected tools and approaches to the implementation of mobile and server applications, considered the main competitors and advantages over them.

The work contains 59 pages, 4 chapters, 23 pictures, 28 sources, 4 appendices.

Keywords - iOS application, music creation, recording MIDI songs, client-server application.

Основные определения и сокращения

iOS - операционная система для мобильных устройств от компании Apple.

Клиент-серверное приложение - сетевая архитектура приложения, при которой логика приложения разбита на две составляющие, где сервер является поставщиком данных, а клиент - заказчик данных.

MIDI - цифровой стандарт звукозаписи для хранения данных с электронных музыкальных инструментов.

Сэмпл - оцифрованный звуковой фрагмент.

MIDI-контролер - устройство, которое преобразует входные данные в набор цифровых команд формата MIDI.

MIDI-клавиатура - выглядит как клавиатура у фортепиано, которая записывает нажатия клавиш в набор MIDI-команд.

Синтезатор - устройство для воспроизведения звука последовательности MIDI-команд.

Секвенсор - устройство для записи и редактирования последовательностей MIDI-команд.

MIDI-команда - элемент данных формата MIDI. Может быть нотой, временем ее проигрывания, информацией о дорожке и тому подобное.

JSON - формат данных, который часто используется при общении между клиентом и сервером, особенно если клиент - мобильное приложение.

VIPER - архитектура мобильного приложения, для которой характерно четкое разделение логики в 5 слоев.

Model-View-Presenter - архитектура мобильного приложения, в которой модули разбиваются на 3 независимых слоя.

SMPTE - формат темпа музыкальной мелодии, измеряющийся во временных единицах, приходящихся на одну секунду.

SOLID - пять принципов для объекто-ориентированного программирования, следование которым обеспечивает легкое поддерживание и расширение программного обеспечения.

REST API - архитектурный стиль для взаимодействия компонентов между собой в сети.

Unit тест - код, который проверяет функциональность соответствующего класса, метода, функции.

Swift - язык разработки от компании Apple.

App Store - магазин приложений для устройств на платформе iOS.

Google Play - магазин приложений для устройств на платформе Android.

AudioKit - библиотека для работы с аудио на iOS.

Python - язык разработки.

Flask - фреймворк для разработки Web приложений.

Содержание

Введение

Глава 1. Обзор и сравнение мобильных приложений для создания музыки

1.1 Обзор популярных решений

1.2 Сравнение с разработанным продуктом

Глава 2. Архитектура мобильного приложения и описание используемых методов

2.1 Swift

2.2 Архитектура модулей мобильного приложения

2.3 AudioKit

2.4 MIDI формат

2.5 Воспроизведение звука с MIDI-клавиатуры

2.6 Запись композиции

2.7 Сохранение мелодий

2.8 Открытие сторонних MIDI-файлов в мобильном приложении

2.9 Взаимодействие мобильного приложения с сетью

2.10 Локализация

Глава 3. Архитектура и технологии серверного приложения

3.1 Python

3.2 Flask

3.3 Структура проекта

3.4 REST API

3.5 База данных

3.6 Регистрация и авторизация пользователей

3.7 Хранение файлов пользовательских мелодий

3.8 Обработка пользовательских мелодий алгоритмами машинного обучения

3.9 Установка и разворачивание серверного окружения

Глава 4. Описание интерфейса и функциональности

4.1 Инструменты для реализации дизайна и программы

4.2 Экран меню

4.3 Экран авторизации

4.4 Экран регистрации

4.5 Экран синтезатора мелодий

4.6 Экран сохранения мелодии

4.7 Экран обработки мелодии

4.8 Экран библиотеки

4.9 Экран списка мелодий

4.10 Экран «Моя библиотека»

4.11 Экран публичного списка мелодий

4.12 Экран воспроизведения мелодии

Заключение

Введение

За последние годы индустрия мобильных разработок резко выросла [1], что также привело к расширению функциональных возможностей мобильных телефонов. Обилие приложений в App Store для iOS и в Google Play для Android покрывает огромное количество пользовательских потребностей как в инструментах для работы, учебы, так и для развлечения.

Компании, которые разрабатывают серьезные мобильные приложения изучают способы взаимодействия пользователей с приложениями и изобретают творческие подходы, чтобы улучшить пользовательский опыт, который с каждым годом позволяет пользоваться приложениями на смартфонах намного лучше.

Технологический уровень мобильных устройств также не стоит на месте. Увеличение мощности технического оснащения позволяет разработчикам программного обеспечения разрабатывать более сложные и быстродействующие мобильные приложения, что приводит почти к сравниванию набора функционала приложений на мобильных устройствах с функционалом программного обеспечения для персональных компьютеров. В настоящее время люди могут играть в сложные 3D-игры, делать красивые фотографии, редактировать документы, видео, аудио даже с небольшого мобильного устройства.

Музыкальную индустрию тоже не прошли стороной. На сегодняшний день существует множество программ, которые позволяют создавать музыкальные композиции с помощью приложений на смартфоне. Однако не все из них понятны рядовому пользователю и требуют специальных знаний от пользователей.

Разрабатываемое iOS-приложение представляет собой инструмент для создания простых композиций, выбор музыкальных инструментов для проигрывания, сохранения мелодий в облачном хранилище. Приложение выделяется среди других не только своей простотой использования, но и возможностью обрабатывать мелодии на сервисе, использующем алгоритмы машинного обучения для придания композиции осмысленное звучание в выбранном жанре. На данный момент приложений с похожим функционалом на рынке не существует.

Цель выпускной квалификационной работы была разработать мобильное приложение для создания музыкальных композиций. Цель данного документа описать какие трудности и проблемы были решены в процессе разработки приложения и обосновать выбранные решения для каждой из них.

Для того чтобы достигнуть цели работы, были поставлены следующие задачи:

- Изучить похожие приложения на рынках мобильных приложений.

- Разработать функциональные требования для мобильного приложения.

- Разработать функциональные требования для серверной части приложения.

- Нарисовать примерный интерфейс мобильного приложения.

- Разработать функционал для работы MIDI-клавиатуры.

- Разработать функционал для записи пользовательских мелодий.

- Разработать функционал для воспроизведения MIDI формата.

- Разработать функционал для сохранения пользовательских мелодий в облачном сервисе iCloud.

- Разработать набор методов API для работы мобильного приложения с серверной частью.

- Разработать функционал сервера для интеграции скрипта обработки мелодий.

- Разработать функционал сервера для работы мобильного приложения.

- Разработать техническую документацию.

Данная работа состоит из четырех глав.

В первой главе представлен обзор на популярные приложения по созданию музыки, их преимущества и недостатки, а также почему разработанное приложение может быть полезнее и интереснее для пользователей.

Во второй главе описываются выбранные методы для реализации заявленного функционала мобильного приложения. Описаны выбранные подходы к разработке мобильного приложения, язык программирования, архитектурные паттерны, работа с музыкальным форматом MIDI, технологией iCloud и взаимодействие мобильного приложения с сервером.

В третьей главе рассмотрена реализация серверного приложения. Описаны используемые технологии, схема базы данных, взаимодействие с клиентским мобильным приложением, установка серверного окружения.

В четвертой главе рассматриваются программы и инструменты для написания программного кода и разработки дизайна мобильного приложения. Описан каждый экран приложения, каким функционалом обладает, возможные пользовательские сценарии.

В приложениях представлена необходима документация для разработанного программного обеспечения: техническое задание с описанием требований, руководство оператора описывающее как пользоваться функциями мобильного приложения, программа и методика испытаний для тестирования работоспособности функционала в обычных и ошибочных ситуациях, код программы с содержанием всего кода мобильной и серверной части.

Глава 1. Обзор и сравнение мобильных приложений для создания музыки

1.1 Обзор популярных решений

В магазинах приложений App Store и Google Play представлено много приложений, которые работают с музыкой. Для обзора были выбраны приложения, которые выпадают в начале списка по популярности, имеют высокий средний рейтинг и обладают похожим функционалом и назначением, как у разработанного продукта.

Beat Maker Go [2]

Представляет интерфейс дрампад контроллера с 16 кнопками. Используется для записи электронной музыки и сэмплов.

Преимущества:

1) Простой интерфейс

2) Имеет большую библиотеку сэмплов

3) Есть игровые режимы для развития чувства ритма

Недостатки:

1) Максимальное число записываемых дорожек - 5

2) Приложение распространяется по платной подписке, а базовая версия сильно урезана по функционалу

3) Только дрампад клавиатура, на которой нельзя проигрывать музыкальные композиции

Music Maker JAM [3]

Предоставляет большую базу уже записанных мелодий в разном стиле, позволяет их совмещать и создавать новые композиции и делиться ими с друзьями.

Преимущества:

1) Большая коллекция записанных мелодий в десятках разных музыкальных жанрах

2) Запись голоса

3) Распространяется бесплатно

Недостатки:

1) Не имеет MIDI-контролера для записи своих мелодий. Все создание музыки сводится к миксованию уже существующих мелодий.

FL Studio Mobile [4]

Полноценное приложения для создания музыкальных композиций с помощью MIDI-клавиатуры.

Преимущества:

1) Имеет как MIDI-клавиатуру, так и драм контроллер

2) Позволяет подключать внешние MIDI устройства для воспроизведения и записи

3) Имеет возможность редактировать записанные мелодии

Недостатки:

1) Имеется только платная версия

2) Интерфейс перегружен и рассчитан на людей, которые профессионально занимаются созданием музыки

Garage Band [5]

Приложение позиционирует себя как музыкальную студию с огромным количеством возможностей по настройке и воспроизведению музыки.

Преимущества:

1) Приложение от разработчика платформы iOS - Apple

2) Распространяется бесплатно

3) Может записывать до 32 дорожек

4) Предоставляет доступ к большой бесплатной библиотеке сэмплов

Недостатки:

1) Интерфейс может показаться немного перегруженным для тех, кто не знаком с индустрией создания музыки

1.2 Сравнение с разработанным продуктом

Для сравнения разрабатываемого программного продукта были выбраны следующие характеристики:

1) Цена - часть пользователей не готова платить за развлекательные приложения, тем более, если их нельзя попробовать бесплатно

2) Работа с MIDI форматом - важная функциональность, которая позволяет работать с мелодией в чистом виде и использовать, при необходимости, в профессиональных программах и редактировать мелодию вплоть до ноты.

3) Хранение записанных мелодий на сервере - важная функциональность в эпоху интернета, когда большинство данных храниться в облаке.

4) Публичная база пользовательских мелодий - возможность посмотреть и оценить мелодии других пользователей увеличивает их вовлеченность.

5) Наличие MIDI-клавиатуры - без наличия полноценной MIDI-клавиатуры невозможно создавать полноценные музыкальные мелодии с большим разнообразием нот.

Результаты анализа на выбранные характеристики можно увидеть в таблице ниже.

Таблица 1 Анализ основных характеристик разработанного приложения с конкурентами

Наименование приложения

Цена

Работа с MIDI форматом

Хранение записанных мелодий на сервере

Публичная база мелодий

Наличие MIDI-клавиатуры

Garage Band

Бесплатно

Нет

Да

Нет

Да

Beat Maker Go

3790 рублей

Только чтение

Нет

Нет

Нет

Music Maker JAM

Бесплатно

Только чтение

Да

Да

Нет

FL Studio Mobile

1099 рублей

Да

Нет

Нет

Да

Разработанное приложение

Бесплатно

Да

Да

Да

Да

Как можно увидеть из таблицы, ни одно из приложений не содержит полный набор сравниваемых характеристик. Наиболее близким конкурентом является Music Maker JAM, который имеет большой набор функций для записи мелодии, похожее хранение мелодий в iCloud и поставляется абсолютно бесплатно. Однако отсутствие MIDI-клавиатуры не позволяет пользователям играть простые мелодии с помощью клавиш пианино. А только чтение MIDI формата не позволит пользователю обрабатывать файл дальше в других программах при необходимости.

В этой главе были описаны популярные мобильные приложения, которые предназначены для создания музыки, их основная идея, преимущества и недостатки. Для каждого из них был проведен анализ по существенным функциям, которые присутствуют в разрабатываемом мобильном приложении и почему приложение выгодно отличается от других.

В следующей главе будет подробное описание используемых подходов к разработке программной части, архитектура и технологии, используемые в мобильном приложении.

Глава 2. Архитектура мобильного приложения и описание используемых методов

2.1 Swift

Для нативной разработки под iOS используются два языка программирования: Objective-C [6] и Swift [7].

Objective-C появился еще в 1983 году и является надмножеством языка С. Любая программа, написанная на языке С, может считаться программой на Objective-C. Язык является message-oriented: вызов метода у объектов рассматривается не как вызов функции, а как принятие объектом сообщения. Objective-C имеет динамичную природу: многие вещи и решения такие как вызов сообщений или тип объекта не просчитываются на этапе компиляции - все решается во время выполнения программы.

Swift относительно молодой язык и был представлен в 2014 году. Данный язык задумывался как легкий для освоения, чтения и поддержки. Многие вещи здесь проверяются на этапе компиляции, не позволяя программисту совершать ошибку еще до выполнения программы. Язык позволяет использовать кодовую базу, написанную на Objective-C, так как совместим с ним. Swift является мультипарадигменным языком программирования, что позволяет писать код как в объекто-ориентированном, так и в функциональном стиле.

При выборе языка разработки мобильной части приложения, учитывались следующие характеристики языков: производительность, безопасность, поддерживаемость, синтаксис, поддержка сообществом, управление памятью, поддержка динамических библиотек.

Таблица 2 Сравнение языков Objective-C и Swift

Характеристика

Objective-C

Swift

Производительность

- посылка сообщений замедляет исполнения кода;

+ Исключение: прямой вызов функций языка C.

+ Высокая производительность достигается за счет оптимизации во время компиляции.

Безопасность

- Не проверяются нулевые указатели, соответствия типов.

+ Используется подход максимальной проверки во время компиляции, что помогает избежать ошибки.

Поддерживаемость

- Каждый класс разбивается на два файла, усложняя жизнь разработчику.

+ Легко поддерживаемый код.

Синтаксис

- Много лишних символов, конструкций из-за которых количество кода сильно возрастает.

+ Ничего лишнего, чтение кода максимально приближено к чтению текста на английском языке.

Поддержка сообществом

+ За 30 лет сформировалось большое сообщество преданных фанатов

+ Является полностью открытым языком, сообщество активно растет

Управление памятью

- Автоматический подсчет ссылок доступен только для относительно новых API

+ Автоматических подсчет ссылок доступен для всех API

Поддержка динамических библиотек

- Отсутствует

+ Присутствует

Как можно увидеть из таблицы, плюсов у Swift больше и он выигрывает почти по всем пунктам. Решающим же фактором было то, что на сегодняшний день новые проекты лучше начинать на современном языке, который сейчас активно поддерживается, чем на языке, который постепенно уходит на второй план с каждым обновлением Swift.

2.2 Архитектура модулей мобильного приложения

В мобильных приложениях за модуль обычно принимают какой-либо экран, либо часть экрана, которая включает себя много логики. Для разработанного продукта использовалась архитектура модуля MVP - Model-View-Presenter [8].

В основе MVP является разделение логики на 3 слоя, каждый из которых отвечает за свою зону ответственности (рис. 1):

1) Model - представление данных;

2) View - отвечает за отображение, перехват пользовательских событий взаимодействия с приложением;

3) Presenter - обрабатывает события, приходящие с View и решает, какую логику необходимо выполнить. Также запрашивает изменения у Model слоя и сообщает об этом View, либо сам изменяет данные в Model.

Рисунок 2.1. Схема слоев MVP

Главная идея MVP - отделить визуальное отображение от логики. Менее связная логика позволяет легче покрывать слои модуля Unit тестами.

2.3 AudioKit

Для воспроизведения и записи звуков в мобильном приложении и работы с низкоуровневыми фреймворками используется AudioKit.

AudioKit [9] - платформа для работы с воспроизведением и синтезом аудио под плафтормы компании Apple (iOS, macOS, tvOS). Основными абстракциями при работе с аудио, лежащие в основе фреймворка, являются Nodes, Operations и Taps.

Nodes (узлы) - являются взаимосвязанными компонентами обработки сигналов. Каждый узел имеет выход и обычно несколько параметров. Если узлы обрабатывают другой сигнал, узлы также будут иметь входные данные.

Operations (операции) - аналогичны узлам, за исключением того, что они являются компонентами обработки сигналов, которые существуют внутри одного узла. Операции могут использоваться в качестве параметров для других операций для создания сложных результатов.

Taps (отводы) - используют узлы в качестве источника данных, но не перенаправляют аудиосигнал с выходных узлов источника на другие узлы. Это позволяет более легко перемещать отвод к узлу и добавлять его после начала пути аудиосигнала.

2.4 MIDI формат

Все записи мелодий и их обработанные версии представляются в формате MIDI. MIDI позволяет однозначно кодировать в цифровой форме исполняемые ноты, их длительность, темп, тональность и другие акустические параметры с точной привязкой ко времени.

MIDI-файл

MIDI-файл отличается от других форматов это не оцифрованный звук, а лишь информация о звуках - сами звуки могут воспроизводится по-разному: смотря какое устройство воспроизведение выбрано. Также файлы формата MIDI имеют гораздо меньший размер, чем то же музыкальное произведение такого же оцифрованного качества.

Весь MIDI-файл состоит из набора так называемых MIDI записей. Информация о каждой записи всегда занимает 8 байт. Первые 4 байта сообщают о типе записи и следует их читать как 4 ASCII символа. Следующие 32 бита содержат информацию о длине записи, не включая данные о самой записи (8 байт о типе и длине записи).

MIDI записи бывают двух типов - заголовок (MThd) или трек (MTrk).

MThd запись

MThd запись содержит информацию о содержимом файла. MThd запись всегда занимает 14 байт.

Первые 4 байта содержат коды ASCII символов для идентификации этого типа записи: 4D 54 68 64 (MThd). Следующие 4 байта, 00 00 00 06, содержат информацию о том, что эта запись занимает 6 байт, для типа MThd это всегда так.

Первые два байта самих данных записи говорят о типе MIDI-файла. Тип MIDI-файлов представлен в трех типах:

1. 00 00 - файл содержит только один MIDI трек, который может содержать в себе 16 MIDI-каналов (максимальное число для MIDI);

2. 00 01 - файл содержит один или несколько треков. Подразумевается, что все треки будут исполнятся единовременно и будут представлять из себя один паттерн;

3. 00 02 - файл содержит один или несколько треков. Подразумевается, что каждый трек представляет собой паттерн и все треки независимы друг от друга.

Следующие 2 байта говорят о том, сколько записей типа MTrk содержится в MIDI-файле. Для файлов типа 00 00 значение всегда будет 00 01.

Последние 4 байта сообщают, темп воспроизведения музыкальных данных. Бывает в двух форматах:

1. 0 - количество временных тиков в четверть ноты.

2. 1 - количество кадров в секунду в формате SMPTE.

MTrk запись

MTrk записи содержат информацию по каждому треку MIDI-файла. Запись состоит из потока MIDI-событий, начинающиеся со значения времени события.

<MTrk событие> = <Значение времени> <MIDI-событие>

<Значение времени> - говорит о том, сколько времени прошло с первого события. <MIDI-событие> может содержать информацию о проигрываемой ноте и на каком канале ее проигрывать, какой инструмент использовать на данной дорожке, звуковые эффекты и так далее.

Канал MIDI

MIDI-канал представляет собой независимый канал, по которому доставляются MIDI-сообщения для проигрывания нот. Каждый трек может доставлять сообщения одному MIDI-инструменту по одному выбранному для него MIDI-каналу. Таким образом, воспроизводимые ноты не зависят от какого-то инструмента - они относятся к выбранному для них каналу.

MIDI-устройство может воспроизводить до 16 каналов. Каналы воспроизводят поступающие MIDI-события независимо друг от друга.

Порт MIDI

Каждый MIDI-инструмент содержит два MIDI-порта для передачи MIDI-сообщений: входной (IN) и выходной (OUT). Они используются для связи нескольких MIDI-устройств или контроллеров. Входной порт принимает MIDI-сообщения, а выходной - отправляет их.

Например, с помощью входного порта может осуществляться запись нот с MIDI-контроллера. Выходной порт может использоваться для отправки на устройство для воспроизведения нот.

2.5 Воспроизведение звука с MIDI-клавиатуры

В мобильном приложение пользователь воспроизводит звуки и мелодии с помощью интерфейса MIDI-клавиатуры и выбранного инструмента.

Для воспроизведения ноты, нажатой пользователем с помощью визуальной MIDI-клавиатуры, необходимо воспроизводить звук ноты, соответствующий выбранному инструменту. Для этого в приложении храниться файл формата SoundFont [10], который содержит звуки для каждой ноты каждого инструмента из спецификации General MIDI [11].

SoundFont относится к формату файлов, которые содержат банк сэмплов. У каждой ноты на MIDI-клавиатуре есть соответствующий сэмпл одного из иснтрументов этого банка. В приложении используется SoundFont, который соответствует спецификации General MIDI, в которой каждому инструменту из этой спецификации присвоен номер от 0 до 127. Таким образом, при загрузке данного банка, соответствующего протоколу General MIDI, в MIDI-синтезаторе, при выборе соответствующего номера, можно проигрывать нужный инструмент из списка General MIDI.

Работа с аудио в приложении представлена в классе AudioConductor. В свойстве instrumentSamplers хранятся все доступные для воспроизведения звуков инструменты (объекты AKNode).

Загрузка банка сэмплов из файла GMFairyTaleBank.sf2 [12] в соответствующие мелодии происходит в методе loadInstrumentSamples, где name - текстовое наименование инструмента, параметр preset - число из спецификации General MIDI:

for instrument in Instrument.allCases {

do {

let name = instrument.midiName()

let sampler = AKMIDISampler(midiOutputName: name)

try sampler.loadMelodicSoundFont("GMFairyTaleBank", preset: instrument.rawValue)

instrumentSamplers[instrument] = sampler

} catch {

AKLog("Загрузка \(instrument.toString()) закончилась ошибкой")

}

}

Перед тем, как использовать загруженные семплеры, их вывод необходимо подключить к мобильному устройству. Так как мобильное устройство имеет только один виртуальный MIDI-порт для подключение, используется объект AKMixer, к которому можно подключить несколько MIDI-синтезаторов, сигналы с которых этот объект будет транслировать на воспроизведение мобильному устройству:

let mixer = AKMixer(Array(instrumentSamplers))

AudioKit.output = mixer

При зажатии и отжатии пользователем клавиш на MIDI-клавиатуре, вызываются соответствующие методы, в которые передается информация о соответствующей нажатой/отжатой ноте:

func noteOn(note: MIDINoteNumber, velocity: MIDIVelocity) {

try! currentSampler.play(noteNumber: note, velocity: velocity, channel: 0)

}

func noteOff(note: MIDINoteNumber) {

try! currentSampler.stop(noteNumber: note, channel: 0)

}

currentSampler - объект AKMIDISampler, в который загружен инструмент из SoundFont банка. Тип MIDINoteNumber - без знаковый целочисленный тип из одного байта (от 0 до 255).

2.6 Запись композиции

В мобильном приложении, все мелодии записываются по треку. Для работы с дорожками, записи мелодий, воспроизведение дорожек и управление ими, используется объект AKSequencer, который называется секвенсером. При записи все ноты записываются в один канал выбранного для записи трека. При включении режима записи, при нажатии на клавишу MIDI-клавиатуры, запоминается текущий момент времени. Когда происходит отжатие клавиши и приходит соответствующее событие, то берется время отжатие клавиши и из него вычитается время, записанное при нажатии, таким образом, получается длительность ноты. В трек для записи передается информация о нажатой ноте, времени нажатия относительно начала, длительности, MIDI канале, velocity:

func noteOn(note: MIDINoteNumber, velocity: MIDIVelocity) {

recordingNotePositions[note] = (sequencer.currentPosition, velocity)

try! currentSampler.play(noteNumber: note, velocity: velocity, channel: 0)

}

func noteOff(note: MIDINoteNumber) {

try! currentSampler.stop(noteNumber: note, channel: 0)

if let recordingTrack = recordingTrack,

let startPosition = recordingNotePositions[note] {

recordingTrack.add(noteNumber: note,

velocity: startPosition.velocity,

position: startPosition.duration,

duration: sequencer.currentPosition - startPosition.duration,

channel: recordingChannel!)

recordingNotePositions[note] = nil

}

}

2.7 Сохранение мелодий

Сохранение файлов MIDI

После того как пользователь записал свои дорожки, он может их сохранить в файл формата MIDI. Из секвенсора AKSequencer можно получить байты для текущего состояние всех дорожек и записать их средствами для работы с файлами в iOS:

let midiData = sequencer.genData()

let duration = sequencer.length.seconds

do {

if let documentUrl = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false) {

let recordUrl = documentUrl.appendingPathComponent("\(name).mid")

try midiData?.write(to: recordUrl) completion(recordUrl, duration)

}

} catch {

print("Ошибка сохранения записи: \(error.localizedDescription)")

}

Работа с файлами в iCloud

iCloud [13] - облачное хранилище данных для пользователей экосистемы Apple, которое позволяет синхронизировать пользовательские данные среди всех устройств, а также предоставлять доступ к выбранным файлам другим пользователям экосистемы.

Разработчики Apple позволяют сторонним приложениям хранить свои файлы в iCloud, но только в рамках директории, выделенный специально под используемое приложение.

Записанные пользователем мелодии можно сохранить в iCloud, а также использовать папку приложения для загрузки MIDI файлов из других источников, которые потом при открытие приложения появятся прямо в нем.

Работа с файлами из iCloud аналогична работой с другими файлами самого приложения, однако для создания директории под приложение в iCloud, нужно вызвать соответствующий метод, чтобы получить нужный для создания URL:

let iCloudDocumentsURL = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents")

2.8 Открытие сторонних MIDI-файлов в мобильном приложении

В iOS, так же, как и в других операционных системах, можно выбирать с помощью какого файла открывать приложение. Однако по умолчанию эта функция сторонним приложениям недоступна, необходимо добавлять поддержку самостоятельно.

Для этого необходимо в файл Info.plist, который содержит информацию для сборки и установки приложения, записать информацию о поддерживаемых для открытия расширений для файлов. Информация хранится в виде структуры ключ-значение и XML разметки. Следующий код описывает открытие MIDI файлов в мобильном приложении:

<key>CFBundleDocumentTypes</key>

<array>

<dict>

<key>CFBundleTypeIconFiles</key>

<array>

<string>MIDI.png</string>

</array>

<key>CFBundleTypeName</key>

<string>$(PRODUCT_NAME)</string>

<key>CFBundleTypeRole</key>

<string>Viewer</string>

<key>LSHandlerRank</key>

<string>Owner</string>

<key>LSItemContentTypes</key>

<array>

<string>public.midi-audio</string>

</array>

</dict>

</array>

CFBundleDocumentTypes - используется для описании информации о поддерживаемых типах документов, которые может открывать данное приложение.

CFBundleTypeIconFiles - содержит массив файлов картинок, которые будут использоваться для отображения данного типа файлов при открытии данным приложением.

CFBundleTypeName - имя для данного типа файлов.

CFBundleTypeRole - роль приложения к данному типу файлов.

LSHandlerRank - определяет приоритет приложения при открытии данного типа файлов.

LSItemContentTypes - содержит массив UTI идентификаторов [14], которые будут открываться в приложении.

После добавления данных о поддерживаемых типов файлов, при открытии MIDI файлов на устройстве iOS с установленным мобильным приложением для создания музыки, будет вызываться запуск приложения и передаваться соответствующий URL передаваемого файла:

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool

2.9 Взаимодействие мобильного приложения с сетью

Обмен данными между мобильным приложением и сервером происходит по протоколу HTTPS. Формат правил определен архитектурным стилем REST API [15], про который будет подробнее рассказано в следующей главе. В заголовке каждого запроса прикрепляется Content-Type: Application-json, чтобы сервер отдавал данные именно в формате JSON, который распространен в мобильной разработке и для которого есть нативные средства, чтобы кодировать/декодировать информацию такого формата.

Формирование запросов в сеть

Для создания и организации запросов используется фреймворк Alamofire [16]. Для создания запроса необходимо указать:

1) URL - адрес ресурса;

2) Тип запроса по спецификации REST API: GET, POST, DELETE или другие;

3) Тело запроса;

4) Заголовок запроса

Обработка ответа формата JSON

Данные ответа с сервера необходимо правильно обработать. Отправляя запрос на определенный URL, мы ожидаем уже определенный формат JSON. Однако для работы в приложении удобнее использовать нативные объекты языка Swift, что позволяет избегать ошибок типизирования, а также добавлять дополнительные методы в классы.

Например, при отправке запроса на получении информации о песни, приходит следующий JSON:

{

"create_date": "2019-05-19T19:53:24.041413+00:00",

"genre": "Classic",

"id": 2,

"is_processed": false,

"is_public": false,

"name": "proccessed_МояПесня.mid",

"rating": 2,

"url": null,

"user": {

"email": "admin@admin.com",

"id": 1,

"username": "badmin"

},

"user_rating": 2

}

Для приведения его к внутреннему классу Song, используется реализация у класса протокола Decodable. Требуется определить набор ключей, которые будут обрабатываться у JSON, а также переопределить инициализатор с декодером, чтобы указать в какие типы необходимо преобразовывать значения у объекта JSON:

required init(from decoder: Decoder) throws {

let containter = try decoder.container(keyedBy: CodingKeys.self)

self.id = try containter.decode(Int64.self, forKey: .id)

self.name = try containter.decode(String.self, forKey: .name)

self.genre = try containter.decode(String.self, forKey: .genre)

self.isPublic = try containter.decode(Bool.self, forKey: .isPublic)

self.rating = try containter.decode(Float?.self, forKey: .rating)

self.createDateString = try containter.decode(String.self, forKey: .createDateString)

self.myRating = try containter.decode(Float?.self, forKey: .myRating)

self.author = try containter.decode(User.self, forKey: .author)

}

private enum CodingKeys: String, CodingKey {

case id

case name

case myRating = "user_rating"

case author = "user"

case isPublic = "is_public"

case createDateString = "create_date"

case genre

case rating

}

Для обработки данных запроса, необходимо вызвать JSONDecoder, передать туда тип класса Song и сами данные - на выходе получается инициализированный объект Song:

let song = try JSONDecoder().decode(ProcessedSong.self, from: response.data!)

2.10 Локализация

В приложении используется локализация языка интерфейса, которая опирается на язык системы. Локализованы два языка - русский и английский.

Для локализации, в настройки проект добавлена соответствующая настройка по включению английского и русского языка.

Рисунок 2.2. Интерфейс для настроки локализации

Для перевода всех текстов, необходимо создать файл Localizable.strings и описать все используемые варианты текста в коде и их алтернативы на переводимый язык:

"1ZX-9x-MH6.segmentTitles[0]" = "Белый";

"1ZX-9x-MH6.segmentTitles[1]" = "Черный";

"4s3-je-aeB.normalTitle" = "Назад";

"6Im-Zt-Ad6.segmentTitles[0]" = "Нет";

"6Im-Zt-Ad6.segmentTitles[1]" = "Октавы";

"6Im-Zt-Ad6.segmentTitles[2]" = "Все";

"74q-Ha-Zu5.text" = "Цвет клавиш:";

При присваивании текста в коде, нужно вызывать метод NSlocalizedString(), который находит при наличии локализованный вариант текста. В параметре comment можно указывать комментарий для переводчика, который вводит в контекст используемого слова:

title = NSLocalizedString("Сохранение", comment: "Сохранение мелодии на устройстве")

В данной главе были рассмотрены примененные архитектурные подходы к разработке мобильного приложения, используемые технологии. В следующий главе будут затронуты те же вопросы про архитектуру, реализацию и технологии, но уже у серверной части приложения.

Глава 3. Архитектура и технологии серверного приложения

3.1 Python

На сегодняшний день существует масса языков, с помощью которых можно грамотно и в короткие сроки реализовывать серверные приложения. Однако необходимо понимать их плюсы и минусы, какие из них хорошо ложатся на требования к разрабатываемому приложению.

Для разработки серверной части использовался язык Python. Python - высокоуровневый, мульти-парадигменный язык разработки. Поддерживает как объектно-ориентированный, так и функциональный стиль программирования. Является интерпретированным языком, исходный код которого сразу выполняется и позволяет динамически делать изменения во время выполнения.

Python был выбран потому, как его синтаксис выглядит лаконично, занимает сильно меньшее количество строк, например, по сравнению с языком Java [17]. За счёт того, что код получается компактным, его проще читать и понимать.

Из минусов Python можно отметить, что его сложно использовать для разработки крупных серверных приложений. Однако в случае разработанного приложения, объем функционала на серверной части подходил под использования языка Python.

3.2 Flask

Flask [18] - фреймворк для языка Python, который позволяет разрабатывать серверные приложения. Этот фреймворк является достаточно легковесным и позволяет строить расширяемые веб-приложения.

На Python в данное время популярны два веб-фреймворка Flask и Django[19]. Однако код с использованием Django получается менее лакончиным. Также Flask появился на несколько лет позже, и имеет решение многих проблем, которые появлялись до создания Flask на Django.

3.3 Структура проекта

Состав директории проекта серверного приложения представлена на рис. 2

Рисунок 3.1. Структура проекта

app - является главным Python модулем, который содержит основную логику приложения.

__init__.py - главный файл модуля app. Инициализирует необходимые сервисы, объекты, базу данных для работы приложения.

models.py - содержит классы моделей, которые используются в базе данных, а также вспомогательные методы для работы с ними.

routes.py - содержит описание и логику REST API методов, по которым клиентская часть обращается к серверу.

migrations - скрипты и информация при миграции базы данных, когда в нее вносятся изменения.

ml_models - модуль для обработки мелодий алгоритмами машинного обучения.

temp - папка для хранения временных файлов при работе сервера.

.gitignore - описывает, какие файлы и папки не нужно включать в историю системы контроля версии git.

config.py - файл, содержащий код с информацией по конфигурации серверного окружения.

music-synth.py - скрипт, запускающий модуль app.

Procfile - файл, содержащий информацию для запускающей сервер физической машины.

requirements.txt - содержит информацию об используемых серверной программой пакетах Python.

3.4 REST API

Взаимодействие сервера с клиентом происходит с использованием REST API. Серверное приложение имеет список определенных URL, описание возможных типов методов для запроса, используемых параметров. На каждый вызов запроса из списка определенных в API между сервером и мобильным приложением, выполняется соответствующая логика: загрузка файла из облачного сервиса или запрос к базе данных, чтобы отдать клиенту правильный ответ.

Список методов API, которые поддерживает разработанное приложение, приведен в таблице 3. Все методы, кроме методов по загрузке файлов, возвращают в теле ответа данные в формате JSON.

При возникновении ошибки логики на сервере, возвращается ответ на запрос с кодом 500 и описанием ошибки в следующем виде:

{

"message": "Мелодия с таким названием уже имеется у вас библиотеке"

}

Это позволяет однозначно читать ошибку мобильным приложением и отображать в понятном виде пользователю.

Таблица 3

endPoint у URL

Тип метода

Назначение

/api/users

POST

Регистрирует пользователя по передаваемым в запросе параметрам. Возвращает данные необходимые для идентификации пользователя при последующих запросах.

/api/login

POST

Авторизует пользователя по логину и паролю, по которому он регистрировался. Возвращает данные необходимые для идентификации пользователя при последующих запросах.

/api/songs

GET

Возвращает массив списка песен авторизованного пользователя.

/api/songs/process

POST

Отдает загруженную в запросе пользовательскую песню на обработку алгоритмами машинного обучения. В запросе передается желаемый жанр для обработки мелодии. Возвращается объект песни.

/api/genres

GET

Возвращает массив списка доступных жанров для обработки мелодий.

/api/songs/<id>/makePublic

POST

Делает песню пользователя с идентификатором. <id> доступной в списке публичных мелодий.

/api/songs/<id>/rate

POST

Проставить оценку пользовательской мелодии с идентификатором <id>

/api/songs/upload

POST

Загружает пользовательскую песню на сервер. Возвращается объект песни.

/api/public/songs

GET

Возвращает мелодии, которые пользователи отметили как общедоступные.

/api/songs/<id>

GET

Возвращает файл пользовательской мелодии под идентификатором <id>.

/api/songs/<id>

DELETE

Удаляет пользовательскую мелодию под идентификатором <id> из базы данных, а также с сервиса хранений мелодий.

3.5 База данных

Для организации работы базы данных, используется фреймворк SQLAlchemy [20]. Он позволяет использовать большое количество разнообразных видов SQL, при этом не меняя реализацию логики приложения. мобильный приложение сеть машинный

Для определения, какую СУБД (систему управления базой данных) использовать, используется переменная SQLALCHEMY_DATABASE_URI, которая задается в конфигурации модуля серверного приложения app. Для тестирования используется СУБД SQLite [21], для которой не нужно поднимать отдельный сервер и достаточно легковесная для локального тестирования. При внедрении и использовании уже реальным клиентом, используется PostgreSQL [22]:

SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or 'sqlite:///' + os.path.join(basedir, 'app.db')

Для выполнения всех описанных функций сервера, используется следующая схема базы данных:

Рисунок 3.2. Схема базы данных

В таблице 4 перечислены поля всех таблиц из базы данных с описанием, какого они типа и для чего используются.

Таблица 4

Название

Тип

Внешний ключ

Может отсутствовать

Назначение

User

id

Integer

Первичный ключ

username

String

Имя пользователя

created_at

DateTime

Дата регистрации пользователя

password_hash

String

Хэш пароля для идентификации входа

email

String

Электронная почта

Song

id

Integer

Первичный ключ

name

String

Название файла мелодии

create_date

DateTime

Дата создания

user_id

Integer

User.id

Идентификатор автора мелодии

is_public

Boolean

Является ли мелодия публичной. По умолчанию - False

synth_info_id

Integer

SynthInfo.id

Да

Идентификатор на запись об информации об обработке мелодии

SynthInfo

id

Integer

Первичный ключ

song_id

Integer

Song.id

Идентификатор записи о мелодии, которому принадлежит эта запись

raw_song_id

Integer

Song.id

Да

Идентификатор записи о мелодии, которому принадлежит эта запись

processing_complete

Boolean

Обработана ли уже песни и можно ли ее уже скачать

genre

String

Жанр музыки, в котором идет обработка мелодии

SongRating

id

Integer

Первичный ключ

song_id

Integer

Song.id

Идентификатор мелодии, которой проставлен рейтинг

user_id

Integer

User.id

Идентификатор пользователя, который проставил рейтинг

rating

Integer

Значение рейтинга от 1 до 5

3.6 Регистрация и авторизация пользователей

Для пользования веб-приложением, пользователям необходимо регистрироваться в системе.

При регистрации пользователь указывает логин и пароль, по которому он в дальнейшем сможет зайти в систему с любого устройства. Однако в базе данных, как было уже указано выше, хранится не пароль, а его хэш.

Хэш - результат применения хэш функции к какому-либо объекту. С помощью хэша всегда можно верифицировать, правильный ли пароль вводит пользователь при вводе системы, при этом не храня в исходном виде в базе данных пароль, что получается более безопасно.

Для обеспечения большей безопасности применяется также подход авторизации, который называется token-based authorization.

Token-based authorization подход основан на генерации токена. После того как пользователь проходит авторизацию, ему выдается временный токен, который можно использовать как идентификацию пользователя и предоставлять доступ к ресурсам. Для этого больше не потребуется повторно отправлять имя пользователя и пароль при каждом запросе. Помимо этого, у токена есть ограниченный срок действия, что также не позволяет использовать его через какое-то время и потребуется снова получить его, для чего ввести имя пользователя и пароль снова.

3.7 Хранение файлов пользовательских мелодий

При отправке с клиентского мобильно приложения мелодий, их необходимо где-то хранить. Так как в базе данных нельзя хранить содержимое файлов, их можно хранить только как файлы. Однако при хранении файлов пользователей где-нибудь локально на той же машине, где и находится сервер, может быстро привести к нехватке памяти на физическом носителе. Для избегания этой проблемы, все файлы пользователей хранятся на отдельном сервисе Amazon S3 [23].

Amazon S3 - облачный сервис для хранения файлов, который отличается повышенной производительностью и надежностью, гарантируемой компанией Amazon.

Для работы серверного приложения была создана отдельная корзина (директория), где можно скачивать/загружать/редактировать/удалять файлы и директории.

Для доступа к ресурсам Amazon S3, при конфигурации серверного приложения необходимо указать публичный и секретный ключ.

Для работы с сервисом S3 в Python есть специальная библиотека boto3, которая позволяет подключаться к облачному хранилищу и работать с файлами в нем.

3.8 Обработка пользовательских мелодий алгоритмами машинного обучения

Одна из функций серверного приложения - обрабатывать мелодии пользователей в выбранном жанре, запуская их на специальном скрипте, который использует алгоритмы машинного обучения, чтобы получить на выходе мелодичную мелодию.

Выполнение скрипта занимает какое-то время, может быть как минуту, так и две. С точки зрения ожидания возврата ответа на запрос с клиентского приложения - это долго. Поэтому необходимо обрабатывать мелодии в асинхронном режиме и возвращать ответ на запрос пользователя моментально. Для этой цели используется в серверном приложении используется Celery [24].

Celery - технология, предоставляющая асинхронную очередь задач, разработанной на языке Python, что как раз подходит для веб-приложения.

Для работы Celery необходимо иметь так называемого брокера, который отвечает за передачу задач нужным процессам исполнителям. В качестве брокера используется Redis [25].

Для того, чтобы выполнять код асинхронно, необходимо пометить соответствующий метод аннотацией @celery.task. Далее при использовании этого метода, можно вызывать метод .delay(), который сразу вернет управление вызывающему коду, а само выполнение будет выполнено исполнителем, который определяет Celery.

3.9 Установка и разворачивание серверного окружения

Во-первых, для запуска Python проекта, необходимо установить все пакеты, используемые при исполнении веб-приложения. Все необходимые пакеты с номерами версий перечислены в файле requirements.txt.

Во-вторых, для работы используемых сторонних сервисов, необходимо предоставить следующее:

1) В переменные окружения записать публичный и секретный ключ от аккаунта Amazon S3;

2) URL брокера, по которому будет осуществляться доступ к серверу Redis, либо иметь запущенным сервер Redis локально, доступным по порту 6379;

Для работы веб-приложения, необходимо его связать с веб-сервером, к которому будет обращаться клиент. Для связи Python приложения и веб-сервера используют WSGI-сервер. WSGI-сервер должен будет запускать объект music-synth:app из скрипта music-synth.py.

В главе были рассмотрены технологии, подходы и решения, используемые на стороне серверного приложения: устройство проекта, фреймворки, база данных, облачное хранилище. В следующей главе будет детально рассмотрена функциональность экранов, пользовательские истории, которые реализует приложение.

Глава 4. Описание интерфейса и функциональности

4.1 Инструменты для реализации дизайна и программы

Дизайн для мобильного приложения прорабатывался в специальной программе Sketch [26], которая предназначена для разработки дизайна веб-сайтов и мобильных приложений.

Рисунок 4.1. Интерфейс в Sketch

Для серверной разработки использовалась IDE PyCharm [27], которая предназначена для разработки под язык Python. Для мобильной разработки, вся разработка велась в XCode [28]. При разработке использовался git, репозитории для приложений публично доступны по следующим ссылкам:

4.2 Экран меню

При запуске приложения, у пользователя загружается главный экран приложения - экран меню.

Рисунок 4.2. Экран меню

Запуск приложения

Аннотация

Сценарий описывает, что происходит, когда пользователь запускает приложение

Основной

Основной поток

1. Пользователь запускает приложение с экрана всех приложений.

2. Загружаются все основные ресурсы приложения, спустя время появляется экран меню.

3. На экране меню должны находится следующие элементы:

a. Кнопка «Играть»

i. По ее нажатию, пользователь переходит на экран синтезатора

b. Кнопка «Библиотека»

i. По ее нажатию, пользователю открывается список хранилищ для мелодий

c. Кнопка «Публичные мелодии»

i. По ее нажатию, пользователю открывается экран со списком публичных мелодий

d. Кнопка «Войти»

i. По ее нажатию, пользователь переходит на экран авторизации

Альтернативный поток

1. Если пользователь заходит в приложение не первый раз и уже был авторизован в системе, то вместо кнопки «Войти», отображается его имя пользователя и кнопка «Выйти»

4.3 Экран авторизации

Экран авторизации используется для авторизации в системе, переход на экран регистрации, возврат в меню без авторизации.

Рисунок 4.3. Экран авторизации

Авторизация пользователя

Аннотация

Сценарий описывает порядок авторизации пользователя в систему.

Основной поток

1. Пользователь вводит в текстовые поля «Логин» и «Пароль» имя пользователя и пароль соответственно, по которым он регистрировался.

2. Пользователь нажимает кнопку «Войти»

3. Приложение проверяет правильность введенных данных.

4. Приложение отправляет на веб-сервер введенные данные.


Подобные документы

  • Исследование проблемы сравнения звуковых файлов и определение степени их схожести. Сравнение файлов с использованием метода нечеткого поиска, основанного на метрике (расстоянии) Левенштейна. Сравнение MIDI-файлов и реализация алгоритмов считывания.

    курсовая работа [2,0 M], добавлен 14.07.2012

  • Создание клиент-серверного приложения "Чат" с помощью среды визуальной разработки приложений Borland C++ Builder версии 6. Описание функциональности приложения: наличие клиент-серверной архитектуры, обмен короткими сообщениями, а также передача файлов.

    курсовая работа [302,0 K], добавлен 30.01.2012

  • Суть MIDI-технологии и типы музыкальных программ. Основные возможности программ: редакторов цифрового аудио, секвенсоров (программ для написания музыки), анализаторов и реставраторов аудио, трекеров. Копирование и сжатие цифрового звука с компакт-дисков.

    реферат [21,1 K], добавлен 27.02.2009

  • Устройство веб-приложений, преимущества их построения. Характеристика технологий веб-программирования, используемых на стороне сервера и на стороне клиента. Формирование и обработка запросов, создание интерактивного и независимого от браузера интерфейса.

    контрольная работа [76,4 K], добавлен 08.07.2014

  • Архитектура Windows NT 5. Приоритеты выполнения программного кода. Описание формата MIDI-данных. Установка драйвера в системе. Выбор средств разработки программного обеспечения. Обработка запросов драйверной модели WDM. Использование библиотеки DirectKS.

    курсовая работа [498,8 K], добавлен 24.06.2009

  • Исследование особенностей систем управления сайтами. Обоснование выбора Joomla, функционала для создания многофункциональных сайтов. Цифровая обработка музыки на компьютере. Использование программного секвенсора. Создание и заполнение сайта информацией.

    курсовая работа [2,9 M], добавлен 15.01.2015

  • Обзор стандарта IEEE 802.15.4. Упрощенная модель OSI. Беспроводные сенсорные сети. Взаимодействие сетевых протоколов. Серверное приложение, отправка теста, получение результатов, клиентское приложение. MAC слой, механизм адресации, точки доступа.

    курсовая работа [334,6 K], добавлен 31.05.2016

  • Технические характеристики микропроцессора Aduc 812. Основные блоки электрической структурной схемы: микроконтроллер, клавиатура, индикатор, интерфейс последовательного midi-порта. Выбор элементной базы, описание алгоритма работы устройства и программы.

    курсовая работа [68,0 K], добавлен 23.12.2012

  • Анализ архитектуры информационной системы, в структуру которой входят системы файл-сервер и клиент-сервер. Сравнение языков запросов SQL и QBE. Принципы разработки приложений архитектуры клиент-сервер при помощи структурированного языка запросов SQL.

    курсовая работа [88,9 K], добавлен 11.04.2010

  • История компьютеризации музыкального обучения. Функциональные возможности компьютера по организации обмена музыкальной информацией. Рассмотрение технологий и средств обработки звуковой информации. Применение технологии создания позиционируемого 3D звука.

    реферат [44,2 K], добавлен 18.12.2017

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.