From 9c08311c0fb5d3a3c7ba2fa47138fc335f4d806f Mon Sep 17 00:00:00 2001 From: Anish Lakhwara Date: Sat, 2 Apr 2022 20:02:52 +1000 Subject: [PATCH] init commit --- .gitignore | 19 +++ CHANGELOG.md | 24 +++ LICENSE | 280 +++++++++++++++++++++++++++++++++++ README.md | 25 ++++ doc/intro.md | 3 + flake.lock | 42 ++++++ flake.nix | 26 ++++ link-audio.sh | 11 ++ project.clj | 8 + result | 1 + src/oversound/core.clj | 80 ++++++++++ start.sh | 5 + supercollider.scd | 1 + test/oversound/core_test.clj | 7 + 14 files changed, 532 insertions(+) create mode 100644 .gitignore create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 doc/intro.md create mode 100644 flake.lock create mode 100644 flake.nix create mode 100755 link-audio.sh create mode 100644 project.clj create mode 120000 result create mode 100644 src/oversound/core.clj create mode 100755 start.sh create mode 100644 supercollider.scd create mode 100644 test/oversound/core_test.clj diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7011ded --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +/target +/classes +/checkouts +profiles.clj +pom.xml +pom.xml.asc +*.jar +*.class +/.lein-* +/.nrepl-port +/.prepl-port +.hgignore +.hg/ +result/ +native/ +.envrc +.direnv/ +.clj-kondo/ +.lsp/ diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..53cf49d --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,24 @@ +# Change Log +All notable changes to this project will be documented in this file. This change log follows the conventions of [keepachangelog.com](http://keepachangelog.com/). + +## [Unreleased] +### Changed +- Add a new arity to `make-widget-async` to provide a different widget shape. + +## [0.1.1] - 2022-04-02 +### Changed +- Documentation on how to make the widgets. + +### Removed +- `make-widget-sync` - we're all async, all the time. + +### Fixed +- Fixed widget maker to keep working when daylight savings switches over. + +## 0.1.0 - 2022-04-02 +### Added +- Files from the new template. +- Widget maker public API - `make-widget-sync`. + +[Unreleased]: https://sourcehost.site/your-name/overtone/compare/0.1.1...HEAD +[0.1.1]: https://sourcehost.site/your-name/overtone/compare/0.1.0...0.1.1 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..2315126 --- /dev/null +++ b/LICENSE @@ -0,0 +1,280 @@ +Eclipse Public License - v 2.0 + + THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE + PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION + OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + + a) in the case of the initial Contributor, the initial content + Distributed under this Agreement, and + + b) in the case of each subsequent Contributor: + i) changes to the Program, and + ii) additions to the Program; + where such changes and/or additions to the Program originate from + and are Distributed by that particular Contributor. A Contribution + "originates" from a Contributor if it was added to the Program by + such Contributor itself or anyone acting on such Contributor's behalf. + Contributions do not include changes or additions to the Program that + are not Modified Works. + +"Contributor" means any person or entity that Distributes the Program. + +"Licensed Patents" mean patent claims licensable by a Contributor which +are necessarily infringed by the use or sale of its Contribution alone +or when combined with the Program. + +"Program" means the Contributions Distributed in accordance with this +Agreement. + +"Recipient" means anyone who receives the Program under this Agreement +or any Secondary License (as applicable), including Contributors. + +"Derivative Works" shall mean any work, whether in Source Code or other +form, that is based on (or derived from) the Program and for which the +editorial revisions, annotations, elaborations, or other modifications +represent, as a whole, an original work of authorship. + +"Modified Works" shall mean any work in Source Code or other form that +results from an addition to, deletion from, or modification of the +contents of the Program, including, for purposes of clarity any new file +in Source Code form that contains any contents of the Program. Modified +Works shall not include works that contain only declarations, +interfaces, types, classes, structures, or files of the Program solely +in each case in order to link to, bind by name, or subclass the Program +or Modified Works thereof. + +"Distribute" means the acts of a) distributing or b) making available +in any manner that enables the transfer of a copy. + +"Source Code" means the form of a Program preferred for making +modifications, including but not limited to software source code, +documentation source, and configuration files. + +"Secondary License" means either the GNU General Public License, +Version 2.0, or any later versions of that license, including any +exceptions or additional permissions as identified by the initial +Contributor. + +2. GRANT OF RIGHTS + + a) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free copyright + license to reproduce, prepare Derivative Works of, publicly display, + publicly perform, Distribute and sublicense the Contribution of such + Contributor, if any, and such Derivative Works. + + b) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free patent + license under Licensed Patents to make, use, sell, offer to sell, + import and otherwise transfer the Contribution of such Contributor, + if any, in Source Code or other form. This patent license shall + apply to the combination of the Contribution and the Program if, at + the time the Contribution is added by the Contributor, such addition + of the Contribution causes such combination to be covered by the + Licensed Patents. The patent license shall not apply to any other + combinations which include the Contribution. No hardware per se is + licensed hereunder. + + c) Recipient understands that although each Contributor grants the + licenses to its Contributions set forth herein, no assurances are + provided by any Contributor that the Program does not infringe the + patent or other intellectual property rights of any other entity. + Each Contributor disclaims any liability to Recipient for claims + brought by any other entity based on infringement of intellectual + property rights or otherwise. As a condition to exercising the + rights and licenses granted hereunder, each Recipient hereby + assumes sole responsibility to secure any other intellectual + property rights needed, if any. For example, if a third party + patent license is required to allow Recipient to Distribute the + Program, it is Recipient's responsibility to acquire that license + before distributing the Program. + + d) Each Contributor represents that to its knowledge it has + sufficient copyright rights in its Contribution, if any, to grant + the copyright license set forth in this Agreement. + + e) Notwithstanding the terms of any Secondary License, no + Contributor makes additional grants to any Recipient (other than + those set forth in this Agreement) as a result of such Recipient's + receipt of the Program under the terms of a Secondary License + (if permitted under the terms of Section 3). + +3. REQUIREMENTS + +3.1 If a Contributor Distributes the Program in any form, then: + + a) the Program must also be made available as Source Code, in + accordance with section 3.2, and the Contributor must accompany + the Program with a statement that the Source Code for the Program + is available under this Agreement, and informs Recipients how to + obtain it in a reasonable manner on or through a medium customarily + used for software exchange; and + + b) the Contributor may Distribute the Program under a license + different than this Agreement, provided that such license: + i) effectively disclaims on behalf of all other Contributors all + warranties and conditions, express and implied, including + warranties or conditions of title and non-infringement, and + implied warranties or conditions of merchantability and fitness + for a particular purpose; + + ii) effectively excludes on behalf of all other Contributors all + liability for damages, including direct, indirect, special, + incidental and consequential damages, such as lost profits; + + iii) does not attempt to limit or alter the recipients' rights + in the Source Code under section 3.2; and + + iv) requires any subsequent distribution of the Program by any + party to be under a license that satisfies the requirements + of this section 3. + +3.2 When the Program is Distributed as Source Code: + + a) it must be made available under this Agreement, or if the + Program (i) is combined with other material in a separate file or + files made available under a Secondary License, and (ii) the initial + Contributor attached to the Source Code the notice described in + Exhibit A of this Agreement, then the Program may be made available + under the terms of such Secondary Licenses, and + + b) a copy of this Agreement must be included with each copy of + the Program. + +3.3 Contributors may not remove or alter any copyright, patent, +trademark, attribution notices, disclaimers of warranty, or limitations +of liability ("notices") contained within the Program from any copy of +the Program which they Distribute, provided that Contributors may add +their own appropriate notices. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities +with respect to end users, business partners and the like. While this +license is intended to facilitate the commercial use of the Program, +the Contributor who includes the Program in a commercial product +offering should do so in a manner which does not create potential +liability for other Contributors. Therefore, if a Contributor includes +the Program in a commercial product offering, such Contributor +("Commercial Contributor") hereby agrees to defend and indemnify every +other Contributor ("Indemnified Contributor") against any losses, +damages and costs (collectively "Losses") arising from claims, lawsuits +and other legal actions brought by a third party against the Indemnified +Contributor to the extent caused by the acts or omissions of such +Commercial Contributor in connection with its distribution of the Program +in a commercial product offering. The obligations in this section do not +apply to any claims or Losses relating to any actual or alleged +intellectual property infringement. In order to qualify, an Indemnified +Contributor must: a) promptly notify the Commercial Contributor in +writing of such claim, and b) allow the Commercial Contributor to control, +and cooperate with the Commercial Contributor in, the defense and any +related settlement negotiations. The Indemnified Contributor may +participate in any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial +product offering, Product X. That Contributor is then a Commercial +Contributor. If that Commercial Contributor then makes performance +claims, or offers warranties related to Product X, those performance +claims and warranties are such Commercial Contributor's responsibility +alone. Under this section, the Commercial Contributor would have to +defend claims against the other Contributors related to those performance +claims and warranties, and if a court requires any other Contributor to +pay any damages as a result, the Commercial Contributor must pay +those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT +PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS" +BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR +IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF +TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR +PURPOSE. Each Recipient is solely responsible for determining the +appropriateness of using and distributing the Program and assumes all +risks associated with its exercise of rights under this Agreement, +including but not limited to the risks and costs of program errors, +compliance with applicable laws, damage to or loss of data, programs +or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT +PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS +SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST +PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE +EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of +the remainder of the terms of this Agreement, and without further +action by the parties hereto, such provision shall be reformed to the +minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against any entity +(including a cross-claim or counterclaim in a lawsuit) alleging that the +Program itself (excluding combinations of the Program with other software +or hardware) infringes such Recipient's patent(s), then such Recipient's +rights granted under Section 2(b) shall terminate as of the date such +litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it +fails to comply with any of the material terms or conditions of this +Agreement and does not cure such failure in a reasonable period of +time after becoming aware of such noncompliance. If all Recipient's +rights under this Agreement terminate, Recipient agrees to cease use +and distribution of the Program as soon as reasonably practicable. +However, Recipient's obligations under this Agreement and any licenses +granted by Recipient relating to the Program shall continue and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, +but in order to avoid inconsistency the Agreement is copyrighted and +may only be modified in the following manner. The Agreement Steward +reserves the right to publish new versions (including revisions) of +this Agreement from time to time. No one other than the Agreement +Steward has the right to modify this Agreement. The Eclipse Foundation +is the initial Agreement Steward. The Eclipse Foundation may assign the +responsibility to serve as the Agreement Steward to a suitable separate +entity. Each new version of the Agreement will be given a distinguishing +version number. The Program (including Contributions) may always be +Distributed subject to the version of the Agreement under which it was +received. In addition, after a new version of the Agreement is published, +Contributor may elect to Distribute the Program (including its +Contributions) under the new version. + +Except as expressly stated in Sections 2(a) and 2(b) above, Recipient +receives no rights or licenses to the intellectual property of any +Contributor under this Agreement, whether expressly, by implication, +estoppel or otherwise. All rights in the Program not expressly granted +under this Agreement are reserved. Nothing in this Agreement is intended +to be enforceable by any entity that is not a Contributor or Recipient. +No third-party beneficiary rights are created under this Agreement. + +Exhibit A - Form of Secondary Licenses Notice + +"This Source Code may also be made available under the following +Secondary Licenses when the conditions for such availability set forth +in the Eclipse Public License, v. 2.0 are satisfied: GNU General Public +License as published by the Free Software Foundation, either version 2 +of the License, or (at your option) any later version, with the GNU +Classpath Exception which is available at +https://www.gnu.org/software/classpath/license.html." + + Simply including a copy of this Agreement, including this Exhibit A + is not sufficient to license the Source Code under Secondary Licenses. + + If it is not possible or desirable to put the notice in a particular + file, then You may include the notice in a location (such as a LICENSE + file in a relevant directory) where a recipient would be likely to + look for such a notice. + + You may add additional accurate notices of copyright ownership. diff --git a/README.md b/README.md new file mode 100644 index 0000000..1d69a78 --- /dev/null +++ b/README.md @@ -0,0 +1,25 @@ +# overtone + +Experiments with Overtone. + +## Usage + +Configured through NixOS with pipewire routing over jackdbus(?) +This flake.nix only provides leiningen, it's dependencies and a link-audio script to connect Overtone's first channel to the output of my specific audio sink using `pw-link` +For a fully working setup you also need to configure pipewire and/or jack for your own system. +A look at my configuration is available at [nix-garden/profiles/music/default.nix](LINKME) + +## License + +Copyright © 2022 FIXME + +This program and the accompanying materials are made available under the +terms of the Eclipse Public License 2.0 which is available at +http://www.eclipse.org/legal/epl-2.0. + +This Source Code may also be made available under the following Secondary +Licenses when the conditions for such availability set forth in the Eclipse +Public License, v. 2.0 are satisfied: GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or (at your +option) any later version, with the GNU Classpath Exception which is available +at https://www.gnu.org/software/classpath/license.html. diff --git a/doc/intro.md b/doc/intro.md new file mode 100644 index 0000000..7fc9ebb --- /dev/null +++ b/doc/intro.md @@ -0,0 +1,3 @@ +# Introduction to overtone + +TODO: write [great documentation](http://jacobian.org/writing/what-to-write/) diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..93e32fa --- /dev/null +++ b/flake.lock @@ -0,0 +1,42 @@ +{ + "nodes": { + "flake-utils": { + "locked": { + "lastModified": 1644229661, + "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1648175834, + "narHash": "sha256-mL+zcC4IR0TwQKHdlQZmnUtQnfS1wvlQR1bbsFKhpi8=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "c7c341796d0308562ea518869c9db5a9e032bda8", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..83e0f69 --- /dev/null +++ b/flake.nix @@ -0,0 +1,26 @@ +{ + description = "tumblr RSS feed fixer"; + + inputs = { + nixpkgs.url = "github:nixos/nixpkgs"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { self, nixpkgs, flake-utils }: + flake-utils.lib.eachDefaultSystem (system: + let pkgs = nixpkgs.legacyPackages.${system}; + in + { + devShell = pkgs.mkShell { + buildInputs = [ + pkgs.leiningen + pkgs.jdk11 + pkgs.clojure + ]; + shellHook = '' + alias repl='lein repl'; + repl + ''; + }; + }); +} diff --git a/link-audio.sh b/link-audio.sh new file mode 100755 index 0000000..43e33df --- /dev/null +++ b/link-audio.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +# ports obtained from `pw-link -io` + +# built in scserver +#pw-link "Overtone:out_1" "alsa_output.pci-0000_00_1f.3.analog-stereo:playback_FL" +#pw-link "Overtone:out_1" "alsa_output.pci-0000_00_1f.3.analog-stereo:playback_FR" + +# external scserver +pw-link "SuperCollider:out_1" "alsa_output.pci-0000_00_1f.3.analog-stereo:playback_FL" +pw-link "SuperCollider:out_2" "alsa_output.pci-0000_00_1f.3.analog-stereo:playback_FR" diff --git a/project.clj b/project.clj new file mode 100644 index 0000000..b83e91e --- /dev/null +++ b/project.clj @@ -0,0 +1,8 @@ +(defproject oversound "0.1.0-SNAPSHOT" + :description "FIXME: write description" + :url "http://example.com/FIXME" + :jvm-opts ^:replace [] + :license {:name "EPL-2.0 OR GPL-2.0-or-later WITH Classpath-exception-2.0" + :url "https://www.eclipse.org/legal/epl-2.0/"} + :dependencies [[org.clojure/clojure "1.10.3"] [org.clojure/clojure "1.9.0"] [overtone "0.10.6"]] + :repl-options {:init-ns oversound.core}) diff --git a/result b/result new file mode 120000 index 0000000..b1d7b26 --- /dev/null +++ b/result @@ -0,0 +1 @@ +/nix/store/7zgbf32wq2dcz8kavldr567j7wsnim3q-nixos-system-curve-21.11.20220216.62a2a1b \ No newline at end of file diff --git a/src/oversound/core.clj b/src/oversound/core.clj new file mode 100644 index 0000000..2f84a4f --- /dev/null +++ b/src/oversound/core.clj @@ -0,0 +1,80 @@ +(ns oversound.core + (:require [overtone.core :refer :all])) + +(connect-external-server 57110) + +(definst quux [freq 440] (* 0.3 (saw freq))) +(definst bar [freq 220] (saw freq)) +(definst trem [freq 440 depth 10 rate 6 length 3] + (* 0.3 + (line:kr 0 1 length FREE) + (saw (+ freq (* depth (sin-osc:kr rate)))))) + +(defsynth foo [freq 200 dur 0.5] + (let [src (saw [freq (* freq 1.01) (* 0.99 freq)]) + low (sin-osc (/ freq 3)) + filt (lpf src (line:kr (* 10 freq) freq 10)) + env (env-gen (perc 0.1 dur) :action FREE)] + (out 0 (pan2 (* 0.8 low env filt))))) + +(comment + (quux) + (bar) + (trem 200 60 0.9) + (foo 200)) + +(defn foo-10 + [t] + (dotimes [i 7] + (let [j (* i t)] + (foo (* j 220) j) + (Thread/sleep 300)))) + +(defn foo-timed + [] + (let [n (now)] + (dotimes [i 10] + (at (+ n (* i 300)) + (foo (* i 220) 0.2))))) +(comment + (foo-10 0.8) + (foo-timed)) + +(definst overpad [note 60 amp 0.7 attack 0.001 release 2] + (let [freq (midicps note) + env (env-gen (perc attack release) :action FREE) + f-env (+ freq (* 3 freq (env-gen (perc 0.012 (- release 0.1))))) + bfreq (/ freq 2) + sig (apply + + (concat (* 0.7 (sin-osc [bfreq (* 0.99 bfreq)])) + (lpf (saw [freq (* freq 1.01)]) f-env)))] + (* amp env sig))) + +(definst kick [] + (let [src (sin-osc 80) + env (env-gen (perc 0.001 0.3) :action FREE)] + (* 0.7 src env))) + +(def metro (metronome 128)) + +(comment + (overpad 41 :attack 10 :release 12) + (overpad) + (kick)) + +(defn player [beat notes] + (let [notes (if (empty? notes) + [50 55 53 50] + notes)] + (at (metro beat) + (kick)) + (at (metro beat) + (if (zero? (mod beat 5)) + (overpad (+ 24 (choose notes)) 0.2 0.75 0.005))) + (at (metro (+ 0.5 beat)) + (if (zero? (mod beat 6)) + (overpad (+ 12 (choose notes)) 0.5 0.15 0.1) + (overpad (choose notes) 0.5 0.15 0.1))) + (apply-by (metro (inc beat)) #'player (inc beat) (next notes) []))) + +(stop) diff --git a/start.sh b/start.sh new file mode 100755 index 0000000..53dfbc9 --- /dev/null +++ b/start.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +pkill -9 scsynth +scsynth -u 57110 & +./link-audio.sh # audio links scsynth output to audio out +lein repl diff --git a/supercollider.scd b/supercollider.scd new file mode 100644 index 0000000..108b27e --- /dev/null +++ b/supercollider.scd @@ -0,0 +1 @@ +s.options.maxLogins = 2; \ No newline at end of file diff --git a/test/oversound/core_test.clj b/test/oversound/core_test.clj new file mode 100644 index 0000000..fe0a972 --- /dev/null +++ b/test/oversound/core_test.clj @@ -0,0 +1,7 @@ +(ns overtone.core-test + (:require [clojure.test :refer :all] + [oversound.core :refer :all])) + +(deftest a-test + (testing "FIXME, I fail." + (is (= 0 1))))