[PYTHON] Erstellen Sie einen Audio-Interface-Controller mit pyusb (2).

Es ist viel Zeit vergangen, aber die Fortsetzung von Letztes Mal. Diesmal

Diese zwei. Da die Focusrite-Software Linux jedoch nicht unterstützt, müssen Sie die Initialisierungssequenz ausführen, die Windows für Sie durchgeführt hat. Zunächst aus der Analyse.

Analyse der Scarlett-Initialisierungssequenz

Starten Sie zuerst Ratatoskr und schalten Sie dann die Stromversorgung von Scarlett 18i20 ein / aus.

VirtualBox_Windows 10_07_01_2020_00_40_15.png

Es gibt eine beträchtliche Menge an Kommunikation, aber es geht darum, die Seriennummer zurückzusetzen. Achten Sie also auf die Position der Seriennummer und drücken Sie sie. Die Position der Seriennummer scheint 15..16 Bytes zu sein. Wenn Sie also normal darüber nachdenken, ist die Seriennummer 0 oder 1, und es scheint, dass die Funktion im Nachrichtentyp Teil von 9..14 Bytes erscheint. (* Im Bild werden verschiedene Filter zur Unterdrückung verwendet.)

Infolgedessen wurden die folgenden zwei Kontrollübertragungen so wie sie waren getroffen.

SEND 21 02 00 00 03 00 10 00 00 00 00 00 00 00 01 00
SEND 21 02 00 00 03 00 10 00 02 00 00 00 00 00 01 00

Ich habe die Nachricht zweimal mit der Seriennummer 1 gesendet, aber es scheint, dass der erste Vorgang das Zurücksetzen der Seriennummer ist und der zweite normalerweise die Nachricht mit der Seriennummer 1 sendet. Schreiben Sie zunächst den Code genau so, wie er ist, und versuchen Sie, den zuvor geschriebenen Code zur Erfassung des Gerätestatus nach dem Zurücksetzen mit der Seriennummer zu bearbeiten. (Der folgende Code ist ein Auszug. Einzelheiten finden Sie im vorherigen Code.)

reset_seq.py


device.ctrl_transfer(0x21, 0x02, 0x00, 0x03,
    [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
device.ctrl_transfer(0xA1, 0x03, 0x00, 0x03, 0x0010)
device.ctrl_transfer(0x21, 0x02, 0x00, 0x03,
    [0x00, 0x00, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x7C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00])

Übrigens scheint der Wert des Teils der Seriennummer des Befehls zum Zurücksetzen der Seriennummer alles sein zu können.

Funktioniert unter Linux

Wenn ich mir die Kommunikation mit USB-Geräten unter Linux anschaue, denke ich, dass die Methode mit Wireshark ziemlich umfangreich ist, aber ich katze unter / sys / kernel / debug / usbmon und spiele unnötige Ausgabe mit grep -v. (In jedem Fall muss das usbmon-Modul installiert werden.)

Unter Linux scheint sich der Initialisierungsprozess ein wenig von Windows zu unterscheiden. Wenn Sie beispielsweise set_configuration schlecht aufrufen, tritt ein Fehler auf.

analogstat4linux.py


import usb.core
import usb.backend.libusb1
from ctypes import c_void_p, c_int
backend = usb.backend.libusb1.get_backend()

from usb.util import CTRL_IN, CTRL_OUT, CTRL_TYPE_CLASS, CTRL_RECIPIENT_INTERFACE, build_request_type
from usb.control import get_status

VENDOR_ID = 0x1235
PRODUCT_ID = 0x8215
device = usb.core.find(idVendor=VENDOR_ID, idProduct=PRODUCT_ID, backend=backend)
device.ctrl_transfer(0x21, 0x02, 0x00, 0x03,
    [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
device.ctrl_transfer(0xA1, 0x03, 0x00, 0x03, 0x0010)
device.ctrl_transfer(0x21, 0x02, 0x00, 0x03,
    [0x00, 0x00, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x7C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00])
device.read(0x83, 8, 100)
ret = bytearray(device.ctrl_transfer(0xA1, 0x03, 0x00, 0x03, 0x0028))
print(' '.join(map(lambda x: '{0:0{1}x}'.format(x, 2), ret)))
$ sudo cat /sys/kernel/debug/usbmon/3t > dump.txt
* Führen Sie das Skript in einem anderen Terminal aus
Ctrl-C
$ grep -v 'Z[io]:' dump.txt 
ffff95a78595f500 560234266 S Co:013:00 s 21 02 0000 0003 0010 16 = 00000000 00000100 00000000 00000000
ffff95a78595f500 560234401 C Co:013:00 0 16 >
ffff95a78595f500 560234429 S Ci:013:00 s a1 03 0000 0003 0010 16 <
ffff95a78595f500 560234646 C Ci:013:00 0 16 = 00000000 00000000 00000000 00000000
ffff95a78595f500 560234667 S Co:013:00 s 21 02 0000 0003 0018 24 = 00008000 08000100 00000000 00000000 7c000000 18000000
ffff95a78595f500 560234893 C Co:013:00 0 24 >
ffff95a78595f500 560235404 S Ii:013:03 -115 8 <
ffff95a78595f500 560235649 C Ii:013:03 0 8 = 01000000 00000000
ffff95a78595f500 560235693 S Ci:013:00 s a1 03 0000 0003 0028 40 <
ffff95a78595f500 560235776 C Ci:013:00 0 40 = 00008000 18000100 00000000 00000000 00000000 00000000 00000000 00000000

Anscheinend ist dies auch das erwartete Ergebnis. (* Einige Bytes werden konvertiert, sodass einige Teile nicht mit den Ergebnissen der Windows-Umgebung übereinstimmen.)

Während des Schreibens verschiedener Codes und des Experimentierens gab es Zeiten, in denen das Gerät aufgrund eines Betriebszeitlimits hängen blieb. Derzeit wurde jedoch keine andere Wiederherstellungsmethode als das Ausschalten der Hardware gefunden. Dies ist eine zukünftige Ausgabe.

Ändern Sie den Gerätestatus mit Python-Code

Endlich das Hauptthema. Unter den Funktionen von Scarlett 18i20 sind die Funktionen, die vom Schalter am Hauptgerät nicht unterstützt werden und vom Allzwecktreiber von Linux nicht bedient werden können, wie folgt.

Letzteres ist ziemlich kompliziert oder mühsam, aber es ist nicht so mühsam für mich, [^ 2] zu verwenden, also zusätzlich zu Ersterem LINE / INST IMPEDANCE [^ 3] Schalt- und Eingangs-PAD [^ 4]. Ich werde versuchen zu korrespondieren.

Analyse wie AIR-Umschaltung

Das Verfahren ist fast das gleiche wie zuvor.

Infolgedessen scheint die folgende Kommunikation eine AIR-Umschaltung zu sein.

Sequenz (1)
SEND: 21 02 00 00 00 03 00 19 01 00 80 00 09 00 01 00 00 00 00 00 00 00 00 00 8c 00 00 00 01 00 00 00 01
SEND: 03 00 00 00 03 00 10 
RECV: 01 00 80 00 00 00 01 00 00 00 00 00 00 00 00 00

Sequenz (2)
SEND: 21 02 00 00 00 03 00 14 02 00 80 00 04 00 02 00 00 00 00 00 00 00 00 00 08 00 00 00
SEND: 03 00 00 00 03 00 10 
RECV: 01 00 80 00 00 00 02 00 00 00 00 00 00 00 00 00

Infolge des Umschaltens von IMPEDANCE usw. scheint die Ausgangssteuerungsübertragung in der Sequenz zur Änderung des analogen Eingangszustands (1) das folgende Format zu haben.

Die Details des 25. Bytes sind wie folgt.

Ich habe mich auch gefragt, was die Übertragung der Ausgangssteuerung von Sequenz (2) bedeutet, aber es scheint, dass dies ein Anzeigeumschaltbefehl der Anzeige am Hauptgerät ist. ** Wenn Sie diese Nachricht nicht senden, schalten die INST / PAD / AIR-Anzeigen am Hauptgerät nicht. ** ** **

Zusammenfassungscode bisher

Der folgende Code schaltet bei jeder Ausführung den AIR-Status des Analogeingangs 1 um.

switch_air.py


import usb.core
import usb.backend.libusb1
from ctypes import c_void_p, c_int
backend = usb.backend.libusb1.get_backend()

from usb.util import CTRL_IN, CTRL_OUT, CTRL_TYPE_CLASS, CTRL_RECIPIENT_INTERFACE, build_request_type
from usb.control import get_status

VENDOR_ID = 0x1235
PRODUCT_ID = 0x8215
device = usb.core.find(idVendor=VENDOR_ID, idProduct=PRODUCT_ID, backend=backend)
device.ctrl_transfer(0x21, 0x02, 0x00, 0x03,
    [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
device.ctrl_transfer(0xA1, 0x03, 0x00, 0x03, 0x0010)

#Statusabfrage
device.ctrl_transfer(0x21, 0x02, 0x00, 0x03,
    [0x00, 0x00, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x7C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00])
device.read(0x83, 8, 100)
ret = bytearray(device.ctrl_transfer(0xA1, 0x03, 0x00, 0x03, 0x0028))
stat = ret[32] #AIR mit Analogeingang 1

device.ctrl_transfer(0x21, 0x02, 0x00, 0x03, [0x01, 0x00, 0x80, 0x00, 0x09, 0x00, 0x02, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x8C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
    stat ^1]) #Status mit XOR wechseln
device.ctrl_transfer(0xA1, 0x03, 0x00, 0x03, 0x0010)

#Schaltanzeigen
device.ctrl_transfer(0x21, 0x02, 0x00, 0x03, [0x02, 0x00, 0x80, 0x00, 0x04, 0x00, 0x03, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00])
device.ctrl_transfer(0xA1, 0x03, 0x00, 0x03, 0x0010)



Der Code, den ich gerade entwickle, ist unten verfügbar.

Ich bin so beschäftigt, dass ich völlig außer Kontrolle bin

Wenn Sie unter eine der oben genannten Bedingungen fallen, kooperieren Sie bitte. [^ 6]

[^ 1]: Eine Funktion zum Ändern der Klangqualität während der Mikrofonaufnahme in eine Funktion, die den meistverkauften Mikrofonvorverstärker des Unternehmens emuliert. Wenn Sie dies nicht verwenden können, lohnt es sich nicht, es für 56.000 Yen zu kaufen. [^ 2]: Während der Aufnahme wird das Eingangssignal während der Aufnahme mit einem PC manchmal direkt an den Ausgang angeschlossen, um es ohne Latenz zu überwachen. Spielen Sie daher am besten mit dem eingebauten Mixer. [^ 3]: Da die Impedanz des Signalflusses je nach Gerät unterschiedlich ist, schalten Sie sie um. [^ 4]: Verringern Sie die Verstärkung bei übermäßiger Eingabe. [^ 5]: Es ist notwendig, je nach Situation zu entwickeln, z. B. das Protokoll nach Abschluss der Startsequenz einmal mit F4 zu löschen und mit einem Filter einzugrenzen, wie beim letzten Mal erwähnt. Ist es wichtig, keine zusätzlichen Operationen durchzuführen? [^ 6]: Ich weiß nicht, wie viele Leute in Japan sind. Ich fand zwei Leute, die ähnliche Dinge in Übersee machten.

Recommended Posts

Erstellen Sie einen Audio-Interface-Controller mit pyusb (2).
Erstellen Sie einen Audio-Interface-Controller mit pyusb (1).
Machen Sie Scrapy exe mit Pyinstaller
Stellen Sie ein Überwachungsgerät mit einem Infrarotsensor her
Verstärkungslernen 37 Starten Sie automatisch mit Ataris Wrapper
So erstellen Sie einen HTTPS-Server mit Go / Gin
Machen Sie eine Regenschirmerinnerung mit Raspberry Pi Zero W.
Ich habe versucht, eine OCR-App mit PySimpleGUI zu erstellen
Erstellen Sie mit tkinter eine Anwendung mit cx_freeze zu einer ausführbaren Datei
Bilden Sie Lambda-Schichten mit Lambda
Machen Sie eine Yuma mit Discord.py
Erstellen Sie Folien mit iPython
Machen Sie einen in die Klimaanlage integrierten Personal Computer "airpi" mit Raspberry Pi 3!