dimayakovlev.ru


Как управлять эквалайзером плеера iTunes через PowerShell

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

Как обычно, работа с iTunes через PowerShell начинается с создания COM-объекта.

$itunes = New-Object -ComObject iTunes.Application

Скажу сразу, все доступные методы и свойства iTunes, относящиеся к работе с эквалайзером, содержат в названии сочетание букв EQ. Зная это, можно сократить вывод командлета Get-Member, убрав из него лишнее.

$itunes | Get-Member -Name "*EQ*"

В результате выполнения команды получен список из одного метода и четырёх свойств COM-объекта iTunes, предназначенных для управления эквалайзером плеера.

Name            MemberType Definition
----            ---------- ----------
CreateEQPreset  Method     IITEQPreset CreateEQPreset (string eqPresetName)
CurrentEQPreset Property   IITEQPreset CurrentEQPreset () {get} {set}
EQEnabled       Property   bool EQEnabled () {get} {set}
EQPresets       Property   IITEQPresetCollection EQPresets () {get}
EQWindow        Property   IITWindow EQWindow () {get}

Включение и выключение эквалайзера

Первое свойство, с которого следует подойти к началу работы с эквалайзером iTunes - EQEnabled. Это свойство хранит значение типа Boolean, позволяет узнать текущее состояние эквалайзера и изменить его - включить или выключить. При помощи следующего кода можно проверить включён ли эквалайзер в текущий момент, если не включён, то включить его.

# Включение эквалайзера, если он не включён
If (-Not $itunes.EQEnabled) { $itunes.EQEnabled = $True }

Для отключения эквалайзера свойству EQEnabled присваивается значение $False.

# Выключение эквалайзера
$itunes.EQEnabled = $False

Управление окном настроек эквалайзера

Для дальнейшей наглядности работы с эквалайзером, рекомендую открыть его окно. Для этого следует обратиться к свойству EQWindow. Это свойство хранит объект типа ITTWindow, который, в свою очередь, отвечает за настройку окна эквалайзера. Как обычно, работу со специальным типом данных, следует начать с ознакомления с его структурой.

# Получение свойств объекта EQWindow
$itunes.EQWindow | Get-Member
Name        MemberType Definition
----        ---------- ----------
Bottom      Property   int Bottom () {get} {set}
Height      Property   int Height () {get} {set}
Kind        Property   ITWindowKind Kind () {get}
Left        Property   int Left () {get} {set}
Maximizable Property   bool Maximizable () {get}
Maximized   Property   bool Maximized () {get} {set}
Minimized   Property   bool Minimized () {get} {set}
Name        Property   string Name () {get}
Resizable   Property   bool Resizable () {get}
Right       Property   int Right () {get} {set}
Top         Property   int Top () {get} {set}
Visible     Property   bool Visible () {get} {set}
Width       Property   int Width () {get} {set}
Zoomable    Property   bool Zoomable () {get}
Zoomed      Property   bool Zoomed () {get} {set}

По названию доступных свойств объекта можно догадаться о назначении каждого из них. Сейчас представляет интерес свойство EQWindow.Visible, которое хранит значение типа Boolean и управляет видимостью окна эквалайзера. Для того, чтобы сделать окно эквалайзера iTunes видимым, следует задать свойству EQWindow.Visible значение $True.

# Открытие окна эквалайзера
$itunes.EQWindow.Visible = $True

Для закрытия окна эквалайзера, свойству присваивается значение $False.

# Закрытие окна эквалайзера
$itunes.EQWindow.Visible = $False

Используя оставшиеся доступные свойства, можно получить размер, положение окна эквалайзера на экране и управлять ими.

# Вывести сообщение с текущим размером окна эквалайзера
Write-Host "Equalizer Window Size is $($itunes.EQWindow.Width)x$($itunes.EQWindow.Height)px"

# Переместить окно эквалайзера в левый верхний угол экрана
$itunes.EQWindow.Left = 0
$itunes.EQWindow.Top = 0

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

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

Работа с текущим используемым пресетом эквалайзера

Текущий используемый пресет эквалайзера хранится в свойстве COM-объекта iTunes CurrentEQPreset в виде объекта типа IITEQPreset.

# Посмотреть настройки текущего пресета эквалайзера
$itunes.CurrentEQPreset

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

Окно эквалайзера iTunes и команды в консоли PowerShell

Получение всех доступных пресетов эквалайзера

Все доступные пресеты эквалайзера iTunes можно получить через свойство EQPresets, которое хранит коллекцию пресетов в виде объекта типа IITEQPresetCollection.

# Вывести все доступные пресеты эквалайзера
$itunes.EQPresets

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

# Вывести названия всех доступных пресетов эквалайзера
$itunes.EQPresets | Select-Object -Property Name

Установка текущего пресета эквалайзера из списка доступных пресетов

Зная название пресета, можно применить его в качестве текущего. Для этого используется, рассмотренное ранее, свойство CurrentEQPreset.

# Применить пресет эквалайзера Acoustic
$itunes.CurrentEQPreset = $itunes.EQPresets | Where-Object {$_.Name -eq "Acoustic"}

Настройка параметров текущего пресета

После применения пресета, можно выполнить его точную настройку. Для того, чтобы понять, как это сделать, следует посмотреть на доступные методы и свойства объекта IITEQPreset, хранящегося в свойстве CurrentEQPreset.

# Вывести доступные методы и свойства объекта типа IITEQPreset
$itunes.CurrentEQPreset | Get-Member
Name       MemberType Definition
----       ---------- ----------
Delete     Method     void Delete (bool updateAllTracks)
Rename     Method     void Rename (string newName, bool updateAllTracks)
Band1      Property   double Band1 () {get} {set}
Band10     Property   double Band10 () {get} {set}
Band2      Property   double Band2 () {get} {set}
Band3      Property   double Band3 () {get} {set}
Band4      Property   double Band4 () {get} {set}
Band5      Property   double Band5 () {get} {set}
Band6      Property   double Band6 () {get} {set}
Band7      Property   double Band7 () {get} {set}
Band8      Property   double Band8 () {get} {set}
Band9      Property   double Band9 () {get} {set}
Modifiable Property   bool Modifiable () {get}
Name       Property   string Name () {get}
Preamp     Property   double Preamp () {get} {set}

На обработку звука влияют свойства Preamp и Band1 - Band10, хранящие числовые значения типа Double в диапазоне от -12 до +12, соответствующие величине усиления или ослабления соответствующих свойств настроек эквалайзера. Свойство Preamp хранит значение для управления преампом в децибелах, свойства Band1 - Band10 хранят значения для управления полосами звуковых частот.

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

# Изменить значение для преампа
$itunes.CurrentEQPreset.Preamp = -0.5
# Изменить значение для полосы 1K
$itunes.CurrentEQPreset.Band6 = 2

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

Переименование пресета

При помощи метода Rename() можно переименовать выбранный пресет. Метод Rename() принимает два обязательных параметра: первый параметр типа String задаёт новое имя пресета, второй параметр типа Boolean управляет изменениями в библиотеке iTunes. Если параметр равен $True, будет произведено обновление индивидуальных настроек эквалайзера для всех треков в библиотеке iTunes, для которых ранее был задан переименованный пресет эквалайзера.

# Переименование текущего пресета эквалайзера
$itunes.CurrentEQPreset.Rename('Custom #3', $True)

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

# Удаление пресета с именем Custom #4
($itunes.EQPresets | Where-Object {$_.Name -eq "Custom #3"}).Rename('Custom #4', $True)

Удаление пресета эквалайзера

Если текущий пресет эквалайзера больше не нужен, его можно удалить при помощи метода Delete(). Метод Delete() принимает один обязательный параметр типа Boolean. Если параметр равен $True, будет удалён не только сам пресет, но и его упоминание в индивидуальных настройках эквалайзера для всех треков в библиотеке iTunes.

# Удаление текущего пресета
$itunes.CurrentEQPreset.Delete($True)

Вместо удалённого пресета, в качестве текущего будет автоматически применён пресет Manual.

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

# Удаление пресета с именем Custom #4
($itunes.EQPresets | Where-Object {$_.Name -eq "Custom #4"}).Delete($True)

Создание собственного пресета эквалайзера

Для создания собственного пресета эквалайзера используется метод CreateEQPreset COM-объекта iTunes. Метод принимает один обязательный параметр типа String, через который задаётся имя пресета. В случае успешного создания пресета, метод возвращает объект типа IITEQPreset. В следующем примере кода возвращаемый методом CreateEQPreset объект присваивается переменной $preset.

# Создание нового пресета эквалайзера с именем Custom #4
$preset = $itunes.CreateEQPreset('Custom #4')

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

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

# Настройка созданного пресета эквалайзера
$preset.Band1 = 1
$preset.Band2 = 1.25
$preset.Band3 = 1.5

# Установка созданного пресета в качестве текущего
$itunes.CurrentEQPreset = $preset

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

Однако здесь я не стал косаться вопросов экспорта и импорта настроек эквалайзера. Дело в том, что API плеера iTunes не предоставляет методов, чтобы сделать это штатными средствами. Поэтому вопрос экспорта и импорта настроек эквалайзера будет темой для отдельной заметки, которую я планирую написать в будущем.