Главная » Разработка для Windows Phone 7 » Сортировка коллекции музыкальных произведений по композитору

0

Элемент управления Pivot идеально подходит для реализации приложения, которое я давно задумал. Это приложение должно компенсировать основной, по моему мнению, недостаток таких портативных музыкальных проигрывателей, как Zune и Windows Phone 7. Здесь требуется небольшое разъяснение.

Вероятно, вам известно, что все многообразие музыкальных произведений США и Европы можно разделить на две большие категории: ориентированные на исполнителя и ориентированные на композитора. Традиция ориентации на исполнителя тесно связана с появлением и эволюцией звукозаписывающих технологий и охватывает исполнителей, скажем, начиная от Роберта Джонсона (1911-1938), заканчивая Леди Гага (г.р. 1986). К этой категории относятся произведения, представленные музыкальной формой песня, которая обычно исполняется вокалистом под аккомпанемент и длится всего несколько минут.

Традиция ориентированности на композитора имеет намного более протяженную историю, начиная, скажем, от Клаудио Монтеверди (1567-1643), и до Дженифер Хигтон (г.р. 1962), и охватывает намного большее число музыкальных форм (например, струнный квартет, фортепьянный концерт, симфония, опера и песни в том числе), очень отличающихся по длительности, стилям и инструментальному составу.

Люди, слушающие музыку второго типа, предпочитают организовывать ее по композитору, затем по произведению и уже потом по исполнителю. (В ориентированной на исполнителя традиции для обозначения человека или группы людей, исполняющих музыку, достаточно свойства artist (исполнитель).) Настольное ПО Zune позволяет вводить данные о композиторе при загрузке произведения и копировании с CD, но эти сведения не передаются с файлами на портативные устройства, такие как телефон. Даже если данные о композиторе включены в музыкальные файлы, передаваемые на телефон, открытые свойства классов, используемых для доступа к музыке, не обеспечивают доступа к ним.

Чтобы компенсировать этот недостаток, люди, слушающие ориентированную на композитора музыку, часто включают имя композитора в название альбома, используя двоеточие в качестве разделителя, например так:

Малер: симфония No. 2

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

Адес, Шуберт: фортепьянные квинтеты

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

Но мне хотелось большего. Я хотел создать иерархическую структуру по именам композиторов и иметь возможность видеть и выбирать любого композитора, от Шуберта до Дебюсси или Мессиана.

Реализовать эту идею я решил в приложении для Windows Phone 7 под названием MusicByComposer (Музыка по композитору). Это приложение будет выполнять доступ к музыкальной библиотеке телефона и – исходя из предположения, что названия альбомов начинаются с имени или имен композиторов, за которыми следует двоеточие – извлекает имена композиторов из названий альбомов. После этого выполняется сортировка музыки по композитору, и каждый композитор становится PivotItem. Содержимым этого PivotItem является ListBox со списком всех альбомов музыки соответствующего композитора.

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

Как видим, это стандартный элемент управления Pivot, каждый PivotItem которого соответствует определенному композитору. В данном случае первый PivotItem представляет альбомы американского композитора Джона Адамса (г.р. 1947). Заголовки второго PivotItem, которые можно видеть на иллюстрации выше, говорят о том, что он включает произведения британского композитора Томаса Адеса (г.р. 1971) и немецкого композитора Иоганна Себастьяна Баха (1685-1750).

Все музыкальные файлы, не содержащие двоеточия в названии альбома, будут перечислены в одном PivotItem под заголовком «Other» (Прочие).

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

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

Это стандартный PhoneApplicationPage с двумя стандартными элементами TextBlock для названия приложения и заголовка страницы, но, как видите, размер и местоположение этих заголовков аналогичны заголовкам элемента управления Pivot на главной странице. Немного крупнее отображается обложка альбома, полное название альбома и исполнитель. Ниже располагается ScrollViewer и ItemsControl, в котором перечислены все треки альбома. Эта страница не имеет интерфейса для обработки сенсорного ввода, кроме прокрутки, все управление осуществляется кнопками ApplicationBar: возвращение к предыдущему треку, воспроизведение и приостановка воспроизведения, переход к следующему треку. Трек, который воспроизводится в настоящее время, выделяется контрастным цветом, и для него выводятся данные о длительности и продолжительности воспроизведения.

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

Подключение XNA

Как можно вспомнить из глав 4 и 14, приложение на Silverlight может выполнять доступ к библиотеке фотографий телефона и сохранять изображения в ней. Это осуществляется с помощью класса XNA MediaLibrary из пространства имен Microsoft.Xna.Framework.Media. Для доступа и воспроизведения музыкальных файлов используется этот же класс и другие классы этого пространства имен.

В любом приложении, использующем MediaLibrary, должна присутствовать ссылка на библиотеку Microsoft.Xna.Framework. Приложению MusicByComposer для работы с элементом управления Pivot также необходима ссылка на Microsoft.Phone.Controls.

При использовании сервисов XNA для воспроизведения музыки из приложения на Silverlight возникают некоторые сложности. Как описывается в разделе документации по XNA «Enable XNA Framework Events in Windows Phone Applications» [22], для этого требуется класс, вызывающий статический метод XNA FrameworkDispatcher.Update с частотой, равной частоте обновления экрана, т.е. 30 раз в секунду. По сути, следующий класс проекта MusicByComposer – это класс, представленный в этом разделе документации:

Проект Silverlight: MusicByComposer Файл: XnaFrameworkDispatcherService.cs

using System;

using System.Windows;

using System.Windows.Threading;

using Microsoft.Xna.Framework;

namespace MusicByComposer {

public class XnaFrameworkDispatcherService : IApplicationService {

DispatcherTimer timer;

public XnaFrameworkDispatcherService() {

timer = new DispatcherTimer(); timer.Interval = TimeSpan.FromTicks(333333);

timer.Tick += OnTimerTick; FrameworkDispatcher.Update();

void OnTimerTick(object sender, EventArgs args) {

FrameworkDispatcher.Update();

}

void IApplicationService.StartService(ApplicationServiceContext context) {

timer.Start();

}

void IApplicationService.StopService() {

timer.Stop();

}

}

}

Экземпляр этого класса должен быть создан в разделе ApplicationLifetimeObjects файла App.xaml. Обратите внимание на объявление пространства имен XML для «local»:

Проект Silverlight: MusicByComposer Файл: App.xaml

<Application

x:Class="MusicByComposer.App"

xmlns="http://schemas.microsoft.com/winfx/2 0 0 6/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2 0 0 6/xaml"

xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" xmlns:local="clr-namespace:MusicByComposer">

<!–Ресурсы приложения–>

<Application.Resources>

</Application.Resources>

<Application.ApplicationLifetimeObjects>

<!– Необходимо для воспроизведения музыки из приложения на Silverlight –> <local:XnaFrameworkDispatcherService />

<!–Обязательный объект, обрабатывающий события времени жизни приложения–> <shell:PhoneApplicationService

Launching="Application Launching" Closing="Application Closing" Activated="Application_Activated" Deactivated="Application_Deactivated"/>

</Application.ApplicationLifetimeObjects> </Application>

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

Для отладки из Visual Studio приложения, выполняющегося на реальном телефоне, понадобиться выйти из настольного приложения Zune (потому что оно требует эксклюзивного доступа к музыкальной библиотеке) и запустить инструмент Connect (Подключение): WPDTPTConnect32 для 32-разрядной Windows или WPDTPTConnect64 для 64- разрядной Windows.

Я также выявил еще одну проблему. Когда приложение развернуто на телефоне и выполняется вне Visual Studio, оно сообщает, что в музыкальной библиотеке телефона нет доступных файлов… Этого не происходит, если до выполнения данного приложения выполнялось приложение на XNA. Я выяснил, что это дефект первой версии Windows Phone 7. Чтобы обойти эту проблему, я решил выполнять доступ к приложению через хаб Games телефона. Для этого в теге App файла WMAppManifest.xml зададим следующий атрибут:

Genre="apps.games"

Также я снабдил приложение файлами Backgrounding и Applicationlcon.png с портретами, наверное, самых известных композиторов.

Источник: Чарльз Петзольд, Программируем Windows Phone 7, Microsoft Press, © 2011.

По теме:

  • Комментарии