{"id":50913172,"url":"https://github.com/p4suta/typing-sound","last_synced_at":"2026-06-16T12:02:20.165Z","repository":{"id":361774156,"uuid":"1255768684","full_name":"P4suta/typing-sound","owner":"P4suta","description":"キーを打つと心地よい音が鳴る、Windows 常駐型のタイピング・サウンドアプリ(WinUI 3 / ポータブル)","archived":false,"fork":false,"pushed_at":"2026-06-01T07:01:13.000Z","size":640,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-01T08:25:53.624Z","etag":null,"topics":["csharp","desktop","dotnet","keyboard-sounds","portable","tray-app","typing","windows","winui3"],"latest_commit_sha":null,"homepage":"https://P4suta.github.io/typing-sound/","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/P4suta.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-01T06:45:28.000Z","updated_at":"2026-06-01T06:57:03.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/P4suta/typing-sound","commit_stats":null,"previous_names":["p4suta/typing-sound"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/P4suta/typing-sound","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/P4suta%2Ftyping-sound","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/P4suta%2Ftyping-sound/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/P4suta%2Ftyping-sound/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/P4suta%2Ftyping-sound/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/P4suta","download_url":"https://codeload.github.com/P4suta/typing-sound/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/P4suta%2Ftyping-sound/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34404748,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-16T02:00:06.860Z","response_time":126,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["csharp","desktop","dotnet","keyboard-sounds","portable","tray-app","typing","windows","winui3"],"created_at":"2026-06-16T12:02:19.164Z","updated_at":"2026-06-16T12:02:20.137Z","avatar_url":"https://github.com/P4suta.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# TypingSound\n\n[![CI](https://github.com/P4suta/typing-sound/actions/workflows/ci.yml/badge.svg)](https://github.com/P4suta/typing-sound/actions/workflows/ci.yml)\n[![Release](https://img.shields.io/github/v/release/P4suta/typing-sound?sort=semver)](https://github.com/P4suta/typing-sound/releases/latest)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n\n\u003e キーを打つと心地よい音が鳴る、Windows 常駐型のタイピング・サウンドアプリ。\n\u003e タイプライターのように打鍵ごとに音を鳴らし、Enter で行頭復帰のベルを鳴らします。\n\nタイプ内容（どのキーを押したか）は一切扱いません。扱うのは「キーが押された」という事実と、その大まかな分類（通常キー / 復帰キーなど）だけです。\n\n## 特長\n\n- **タイプライターモード** — 打鍵ごとに打鍵音、Enter で復帰ベル。\n- **ポータブル** — インストール不要。ランタイム同梱の self-contained ビルドで、フォルダごとコピーすれば動きます（管理者権限・開発者モード不要）。\n- **常駐 \u0026 軽量** — システムトレイに常駐。不要な重量級アセンブリ（ML / WinForms 等）はビルド時に除去済み。\n- **既定オーディオデバイス追従** — 出力デバイスの切り替えに追従します。\n- **プライバシー** — キーの内容は記録も送信もしません。ネットワーク通信はありません。\n\n## ダウンロード\n\n[**最新リリース**](https://github.com/P4suta/typing-sound/releases/latest) から zip を取得し、展開して `TypingSound.exe` をダブルクリックするだけです。フォルダごと移動・コピーしても動作します。\n\nランディングページ: https://P4suta.github.io/typing-sound/\n\n## アーキテクチャ\n\nこのプロジェクトの最優先目標は **抽象化の美しさ** です。プラットフォーム非依存のドメインロジック（`TypingSound.Core`）と、Windows 固有の実装（`TypingSound.Platform` / `TypingSound.App`）を厳密に分離しています。\n\n```\nTypingSound.Core        ドメイン層。OS にもオーディオ実装にも依存しない純粋ロジック。\n├─ Abstractions/        IAudioEngine / ISoundClip / ITimerFactory / IRandomSource ... 境界インターフェース\n├─ Triggers/            軸A「いつ鳴らすか」  EveryKeyTrigger / DebounceTrigger\n├─ Selectors/           軸B「どのクリップを鳴らすか」 Fixed / Random / ShuffleQueue / Typewriter\n├─ Playback/            軸C「どう鳴らすか」  Monophonic / Polyphonic\n├─ Modes/               3 軸を束ねる SoundModePipeline と各モード\n└─ TypingSoundEngine    司令塔。キー押下を起動中モードへ流し、モード切替を担う\n\nTypingSound.Platform    Core の境界インターフェースを Windows 実装で満たすアダプタ層。\n├─ Audio/               NAudio ベースの IAudioEngine / ISoundBank 実装\n└─ Interop/             低レベルキーボードフック（P/Invoke）\n\nTypingSound.App         WinUI 3 シェル。トレイ常駐 UI、DI 配線、診断/ロギング。\nTypingSound.Launcher    ポータブル配布の入口 exe（self-contained ランチャー）。\nTypingSound.Core.Tests  Core 層の xUnit ユニットテスト（プロパティテスト含む）。\n```\n\n### サウンドの組み立て（3 軸 × パイプライン）\n\n音の鳴り方を直交する 3 つの軸に分解し、`SoundModePipeline` が配線します。新しい鳴らし方は、軸の実装を差し替えるだけで合成できます。\n\n| 軸 | 役割 | 実装例 |\n| --- | --- | --- |\n| **Trigger** | いつ鳴らすか | `EveryKeyTrigger`, `DebounceTrigger` |\n| **Selector** | どのクリップを鳴らすか | `FixedSelector`, `RandomSelector`, `ShuffleQueueSelector`, `TypewriterSelector` |\n| **Playback** | どう鳴らすか（声部管理） | `MonophonicPolicy`, `PolyphonicPolicy` |\n\n```\nキー押下 ─▶ Trigger ──(発火)──▶ Selector ──(クリップ)──▶ Playback ─▶ 発音\n```\n\n`Core` は実時間タイマーも乱数もオーディオ出力も抽象越しにしか触らないため、テストではすべてフェイクに差し替えて決定的に検証できます。\n\n## ビルド \u0026 実行\n\n### 前提\n\n- Windows 11（WinUI 3 / Windows App SDK）\n- [mise](https://mise.jdx.dev/) — .NET SDK と [just](https://github.com/casey/just) を宣言的に管理します（バージョンは `mise.toml` 固定）。\n\n```sh\nmise install        # mise.toml に従い dotnet SDK と just を導入\n```\n\n### 主なタスク（`just`）\n\n```sh\njust build          # App を Debug ビルド（x64）\njust build-all      # ソリューション全体（テスト/ランチャー含む）をビルド\njust test           # Core のユニットテスト\njust run            # ビルドして起動\njust publish        # App を Release publish（ポータブル一式 / 既定 x64）\njust dist           # 配布レイアウト dist/TypingSound/ を作成（入口 exe + app/）\njust clean          # ビルド成果物と dist を削除\n```\n\n\u003e .NET SDK は mise 管理のため素の PATH からは見えません。`just` 経由（内部で `mise exec -- dotnet`）で呼んでください。\n\u003e WinUI 本体は x64 固定でビルドします（詳細は `justfile` 冒頭のコメント参照）。\n\n## 開発方針\n\n- **超厳格な品質ゲート** — 警告はエラー扱い（`TreatWarningsAsErrors`）、アナライザ最大（`latest-all`）、StyleCop / Roslynator、`EnforceCodeStyleInBuild`。抑制ではなく根本対処を原則とします（`Directory.Build.props` / `.editorconfig`）。\n- **観測可能性** — Serilog によるログとグローバル例外ハンドラを備え、境界で握りつぶさず記録します。\n\n## クレジット\n\n- 打鍵音 / ベル音（`TypingSound.App/Assets/Sounds/*.wav`）: [Mixkit](https://mixkit.co)（Mixkit Free License）\n- アプリアイコン: 本プロジェクトのオリジナル\n\n## ライセンス\n\nソースコードは [MIT License](LICENSE) です。同梱のサウンドアセットは Mixkit のライセンス条項に従います（詳細は `LICENSE` 参照）。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fp4suta%2Ftyping-sound","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fp4suta%2Ftyping-sound","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fp4suta%2Ftyping-sound/lists"}