Add type stubs for mido MIDI library

- Created type stubs for various modules in the mido library including messages, midifiles, parser, ports, sockets, syx, tokenizer, and version.
- Implemented type hints for functions and classes to improve type checking and code clarity.
- Added support for MIDI over TCP/IP in sockets module.
- Included methods for reading and writing SYX files in syx module.
- Enhanced the parser functionality with a dedicated Parser class for MIDI byte streams.
- Established a structure for MIDI file handling with MidiFile and MidiTrack classes.
This commit is contained in:
2026-04-26 00:51:40 +08:00
parent e5c692e5d7
commit 9009a7c5bc
23 changed files with 1875 additions and 0 deletions
+67
View File
@@ -0,0 +1,67 @@
from typing import Never, TypeIs, overload, override
from .messages import Message
from .midifiles import MetaMessage, UnknownMetaMessage
from .midifiles.meta import _MetaMessage # pyright: ignore[reportPrivateUsage]
class Frozen:
@override
def __setattr__(self, *_) -> Never: ...
@override
def __hash__(self) -> int: ...
class FrozenMessage(Frozen, Message): ...
class FrozenMetaMessage(Frozen, _MetaMessage): ...
class FrozenUnknownMetaMessage(Frozen, UnknownMetaMessage): ...
@overload
def is_frozen(msg: UnknownMetaMessage) -> TypeIs[FrozenUnknownMetaMessage]: ... # pyright: ignore[reportOverlappingOverload]
@overload
def is_frozen(msg: _MetaMessage) -> TypeIs[FrozenMetaMessage]: ...
@overload
def is_frozen(msg: Message) -> TypeIs[FrozenMessage]: ...
@overload
def is_frozen(msg: object) -> TypeIs[Frozen]:
"""Return True if message is frozen, otherwise False."""
@overload
def freeze_message[T: Frozen](msg: T) -> T: ...
@overload
def freeze_message(msg: Message) -> FrozenMessage: ...
@overload
def freeze_message(msg: UnknownMetaMessage) -> FrozenUnknownMetaMessage: ...
@overload
def freeze_message(msg: MetaMessage) -> FrozenMetaMessage: ...
@overload
def freeze_message(msg: None) -> None: ...
@overload
def freeze_message[T: Frozen](
msg: T | Message | UnknownMetaMessage | MetaMessage | None,
) -> T | FrozenMessage | FrozenUnknownMetaMessage | FrozenMetaMessage | None:
"""Freeze message.
Returns a frozen version of the message. Frozen messages are
immutable, hashable and can be used as dictionary keys.
Will return None if called with None. This allows you to do things
like::
msg = freeze_message(port.poll())
"""
@overload
def thaw_message(msg: FrozenUnknownMetaMessage) -> UnknownMetaMessage: ...
@overload
def thaw_message(msg: FrozenMetaMessage) -> MetaMessage: ...
@overload
def thaw_message(msg: FrozenMessage) -> Message: ...
@overload
def thaw_message(
msg: FrozenMessage | FrozenUnknownMetaMessage | FrozenMetaMessage,
) -> Message | UnknownMetaMessage | MetaMessage:
"""Thaw message.
Returns a mutable version of a frozen message.
Will return None if called with None.
"""