From 54b8b13a9bca973be6803c23ad52de021b9bfee2 Mon Sep 17 00:00:00 2001
From: amesgen <amesgen@amesgen.de>
Date: Mon, 3 Jan 2022 00:50:56 +0100
Subject: [PATCH] timidity: add module

---
 .github/CODEOWNERS            |  2 ++
 modules/lib/maintainers.nix   |  6 +++++
 modules/misc/news.nix         |  7 +++++
 modules/modules.nix           |  1 +
 modules/programs/timidity.nix | 51 +++++++++++++++++++++++++++++++++++
 5 files changed, 67 insertions(+)
 create mode 100644 modules/programs/timidity.nix

diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 7aedc793..c5ee2108 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -221,6 +221,8 @@
 
 /modules/programs/texlive.nix                         @rycee
 
+/modules/programs/timidity.nix                        @amesgen
+
 /modules/programs/topgrade.nix                        @msfjarvis
 /tests/modules/programs/topgrade                      @msfjarvis
 
diff --git a/modules/lib/maintainers.nix b/modules/lib/maintainers.nix
index 2ed3a846..5a3e7c27 100644
--- a/modules/lib/maintainers.nix
+++ b/modules/lib/maintainers.nix
@@ -7,6 +7,12 @@
 # [1] https://github.com/NixOS/nixpkgs/blob/fca0d6e093c82b31103dc0dacc48da2a9b06e24b/maintainers/maintainer-list.nix#LC1
 
 {
+  amesgen = {
+    name = "amesgen";
+    email = "amesgen@amesgen.de";
+    github = "amesgen";
+    githubId = 15369874;
+  };
   justinlovinger = {
     name = "Justin Lovinger";
     email = "git@justinlovinger.com";
diff --git a/modules/misc/news.nix b/modules/misc/news.nix
index 5840a274..51151607 100644
--- a/modules/misc/news.nix
+++ b/modules/misc/news.nix
@@ -2365,6 +2365,13 @@ in
           A new module is available: 'programs.watson'.
         '';
       }
+
+      {
+        time = "2022-01-22T15:33:42+00:00";
+        message = ''
+          A new module is available: 'programs.timidity'.
+        '';
+      }
     ];
   };
 }
diff --git a/modules/modules.nix b/modules/modules.nix
index 3b6fda0f..2f7d241b 100644
--- a/modules/modules.nix
+++ b/modules/modules.nix
@@ -142,6 +142,7 @@ let
     ./programs/terminator.nix
     ./programs/termite.nix
     ./programs/texlive.nix
+    ./programs/timidity.nix
     ./programs/tmux.nix
     ./programs/topgrade.nix
     ./programs/urxvt.nix
diff --git a/modules/programs/timidity.nix b/modules/programs/timidity.nix
new file mode 100644
index 00000000..26b9de98
--- /dev/null
+++ b/modules/programs/timidity.nix
@@ -0,0 +1,51 @@
+{ config, lib, pkgs, ... }:
+
+let
+
+  cfg = config.programs.timidity;
+
+in {
+  meta.maintainers = [ lib.hm.maintainers.amesgen ];
+
+  options.programs.timidity = {
+    enable = lib.mkEnableOption "timidity, a software MIDI renderer";
+
+    package = lib.mkOption {
+      type = lib.types.package;
+      default = pkgs.timidity;
+      defaultText = lib.literalExpression "pkgs.timidity";
+      description = "The timidity package to use.";
+    };
+
+    finalPackage = lib.mkOption {
+      readOnly = true;
+      type = lib.types.package;
+      description = "Resulting package.";
+    };
+
+    extraConfig = lib.mkOption {
+      type = lib.types.lines;
+      default = "";
+      example = lib.literalExpression ''
+        '''
+          soundfont ''${pkgs.soundfont-fluid}/share/soundfonts/FluidR3_GM2-2.sf2
+        '''
+      '';
+      description = "Extra configuration.";
+    };
+  };
+
+  config = lib.mkIf cfg.enable {
+    home.packages = [ cfg.finalPackage ];
+
+    programs.timidity.finalPackage = pkgs.symlinkJoin {
+      name = "timidity-with-config";
+      paths = [ cfg.package ];
+      nativeBuildInputs = [ pkgs.makeWrapper ];
+      postBuild = ''
+        wrapProgram $out/bin/timidity \
+          --add-flags '-c ${pkgs.writeText "timidity.cfg" cfg.extraConfig}'
+      '';
+    };
+  };
+}