csoundengine 2.23.0__tar.gz → 2.24.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {csoundengine-2.23.0 → csoundengine-2.24.0}/.github/workflows/test2.yml +38 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/PKG-INFO +11 -6
- {csoundengine-2.23.0 → csoundengine-2.24.0}/README.rst +7 -2
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/csoundlib.py +22 -109
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/dependencies.py +24 -68
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine.egg-info/PKG-INFO +11 -6
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine.egg-info/SOURCES.txt +2 -2
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine.egg-info/requires.txt +2 -2
- csoundengine-2.24.0/docs/Installation.rst +15 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/Introduction.rst +3 -2
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/index.rst +2 -1
- {csoundengine-2.23.0 → csoundengine-2.24.0}/pyproject.toml +6 -6
- csoundengine-2.24.0/test/testdeps.py +46 -0
- csoundengine-2.23.0/.cirrus.yml +0 -40
- csoundengine-2.23.0/docs/Installation.rst +0 -19
- {csoundengine-2.23.0 → csoundengine-2.24.0}/.gitignore +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/LICENSE.txt +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/MANIFEST.in +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/cmake/csound-custom-macos.cmake +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/__init__.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/_common.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/_palette.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/abstractrenderer.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/baseschedevent.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/busproxy.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/config.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/contants.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/csd.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/csounddefs.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/csoundparse.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/engine.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/enginebase.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/engineorc.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/errors.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/event.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/instr.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/instrtools.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/interact.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/internal.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/jacktools.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/jupytertools.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/linuxaudio.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/magic.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/offline.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/offlineengine.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/offlineorc.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/paramtable.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/plotting.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/py.typed +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/renderjob.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/schedevent.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/session.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/sessionhandler.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/sessioninstrs.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/sftools.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/state.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/synth.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/tableproxy.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine/tools.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine.egg-info/dependency_links.txt +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/csoundengine.egg-info/top_level.txt +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/Builtin-Opcodes.rst +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/Makefile +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/Reference.rst +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/_static/custom.css +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/_static/offlineengine-example1.mp3 +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/assets/config-edit.png +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/assets/eventui.png +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/assets/eventui2.png +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/assets/jupyter-config.png +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/assets/jupyter-plotTable.png +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/assets/jupyter-session-1.png +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/assets/offlineengine-example1.png +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/assets/select-preset.png +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/assets/synthui.png +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/assets/tableplot-sine.png +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/assets/tableplot-stereo.png +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/assets/tableproxy-plot.png +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/assets/tableproxy-plotspectrogram.png +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/assets/ui2.png +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/conf.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/config.rst +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/configkeys.rst +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/csoundengine.rst +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/csoundlib.rst +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/instr.rst +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/jupyternotebook.rst +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/magics.rst +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/make.bat +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/offline.rst +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/offlineengine.rst +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/offlineengine_example.inc +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/offlineengine_example2.inc +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/offlinerenderer.rst +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/renderjob.rst +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/requirements.txt +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/schedevent.rst +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/session.rst +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/synth.rst +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/docs/tables.rst +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/notebooks/buses.ipynb +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/notebooks/offlineengine-playback.ipynb +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/notebooks/offlineengine.ipynb +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/notebooks/snd/colours-german-male.flac +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/notebooks/snd/piano-pitchtest-2.flac +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/notebooks/snd/voiceover-fragment-48k.flac +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/notebooks/test/plltrack.ipynb +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/notebooks/test/test-bus.ipynb +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/notebooks/test/test-dealloc-synth.ipynb +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/notebooks/test/test-delay.ipynb +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/notebooks/test/test-engine-params.ipynb +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/notebooks/test/test-libcsound.ipynb +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/notebooks/test/test-named-events.ipynb +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/notebooks/test/test-new-named-params.ipynb +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/notebooks/test/test-offline-render.ipynb +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/notebooks/test/test-offlinesession.ipynb +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/notebooks/test/test-params.ipynb +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/notebooks/test/test-playsample.ipynb +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/notebooks/test/test-stop.ipynb +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/notebooks/test/test-tight-scheduling.ipynb +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/notebooks/test/test-whenfinished.ipynb +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/notebooks/voice-pitch-track.ipynb +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/pyrightconfig.json +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/readthedocs.yml +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/scripts/download-plugins.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/scripts/update-config-docs.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/setup.cfg +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/test/importtime.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/test/libcsoundtest.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/test/simple.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/test/test1.csd +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/test/test1.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/test/test2.py +0 -0
- {csoundengine-2.23.0 → csoundengine-2.24.0}/test/testargs.py +0 -0
|
@@ -169,3 +169,41 @@ jobs:
|
|
|
169
169
|
with:
|
|
170
170
|
name: artifact-csound7-${{ matrix.os }}-${{ matrix.python-version }}-${{ strategy.job-index }}
|
|
171
171
|
path: test/*.wav
|
|
172
|
+
|
|
173
|
+
testdeps:
|
|
174
|
+
name: Check that all dependencies are installed without a system csound
|
|
175
|
+
# csound is not preinstalled on these runners. Importing libcsound (which
|
|
176
|
+
# happens when importing csoundengine) is expected to install csound and
|
|
177
|
+
# its plugins on demand.
|
|
178
|
+
# ubuntu-latest -> linux x86_64, macos-latest -> macos arm64
|
|
179
|
+
# (intentionally not linux-arm64 nor windows, where this is not supported)
|
|
180
|
+
runs-on: ${{ matrix.os }}
|
|
181
|
+
strategy:
|
|
182
|
+
matrix:
|
|
183
|
+
os: ["ubuntu-latest", "macos-latest"]
|
|
184
|
+
python-version: ["3.12", "3.13"]
|
|
185
|
+
fail-fast: false
|
|
186
|
+
|
|
187
|
+
steps:
|
|
188
|
+
- uses: actions/checkout@v3
|
|
189
|
+
|
|
190
|
+
- uses: actions/setup-python@v4
|
|
191
|
+
with:
|
|
192
|
+
python-version: ${{ matrix.python-version }}
|
|
193
|
+
|
|
194
|
+
- name: check that csound is not preinstalled
|
|
195
|
+
run: |
|
|
196
|
+
if command -v csound; then
|
|
197
|
+
echo "ERROR: this test expects csound to not be installed beforehand"
|
|
198
|
+
exit 1
|
|
199
|
+
fi
|
|
200
|
+
echo "csound is not preinstalled, good"
|
|
201
|
+
|
|
202
|
+
- name: install csoundengine (csound is not installed on purpose)
|
|
203
|
+
run: |
|
|
204
|
+
pip install .
|
|
205
|
+
|
|
206
|
+
- name: check that all dependencies (csound, plugins) get installed
|
|
207
|
+
run: |
|
|
208
|
+
cd test
|
|
209
|
+
python testdeps.py
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: csoundengine
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.24.0
|
|
4
4
|
Summary: An audio synthesis framework using csound
|
|
5
5
|
Author-email: Eduardo Moguillansky <eduardo.moguillansky@gmail.com>
|
|
6
6
|
License: GNU GENERAL PUBLIC LICENSE
|
|
@@ -680,7 +680,7 @@ License: GNU GENERAL PUBLIC LICENSE
|
|
|
680
680
|
Project-URL: Homepage, https://github.com/gesellkammer/csoundengine
|
|
681
681
|
Classifier: Programming Language :: Python :: 3
|
|
682
682
|
Classifier: Operating System :: OS Independent
|
|
683
|
-
Requires-Python: >=3.
|
|
683
|
+
Requires-Python: >=3.12
|
|
684
684
|
Description-Content-Type: text/x-rst
|
|
685
685
|
License-File: LICENSE.txt
|
|
686
686
|
Requires-Dist: numpy
|
|
@@ -695,12 +695,12 @@ Requires-Dist: ipywidgets
|
|
|
695
695
|
Requires-Dist: xxhash
|
|
696
696
|
Requires-Dist: docstring_parser
|
|
697
697
|
Requires-Dist: typing_extensions
|
|
698
|
-
Requires-Dist: libcsound>=0.
|
|
698
|
+
Requires-Dist: libcsound>=0.17.1
|
|
699
699
|
Requires-Dist: sndfileio>=2.1.1
|
|
700
700
|
Requires-Dist: emlib>=1.20
|
|
701
701
|
Requires-Dist: configdict>=2.10.0
|
|
702
702
|
Requires-Dist: pitchtools>=1.14.0
|
|
703
|
-
Requires-Dist: risset>=3.
|
|
703
|
+
Requires-Dist: risset>=3.5.7
|
|
704
704
|
Requires-Dist: sounddevice
|
|
705
705
|
Dynamic: license-file
|
|
706
706
|
|
|
@@ -885,8 +885,13 @@ https://csoundengine.readthedocs.io/en/latest/Installation.html
|
|
|
885
885
|
Dependencies
|
|
886
886
|
~~~~~~~~~~~~
|
|
887
887
|
|
|
888
|
-
* python >= 3.
|
|
889
|
-
* csound
|
|
888
|
+
* python >= 3.12
|
|
889
|
+
* csound 7 >= 7.0 (csound 6 is supported but it is declared EOL)
|
|
890
|
+
|
|
891
|
+
.. note::
|
|
892
|
+
csound only needs to be installed previously on windows at the moment, for
|
|
893
|
+
the other platforms it is installed automatically if not present
|
|
894
|
+
|
|
890
895
|
|
|
891
896
|
.. code-block:: bash
|
|
892
897
|
|
|
@@ -179,8 +179,13 @@ https://csoundengine.readthedocs.io/en/latest/Installation.html
|
|
|
179
179
|
Dependencies
|
|
180
180
|
~~~~~~~~~~~~
|
|
181
181
|
|
|
182
|
-
* python >= 3.
|
|
183
|
-
* csound
|
|
182
|
+
* python >= 3.12
|
|
183
|
+
* csound 7 >= 7.0 (csound 6 is supported but it is declared EOL)
|
|
184
|
+
|
|
185
|
+
.. note::
|
|
186
|
+
csound only needs to be installed previously on windows at the moment, for
|
|
187
|
+
the other platforms it is installed automatically if not present
|
|
188
|
+
|
|
184
189
|
|
|
185
190
|
.. code-block:: bash
|
|
186
191
|
|
|
@@ -39,12 +39,6 @@ if TYPE_CHECKING:
|
|
|
39
39
|
logger = _logging.getLogger("csoundengine")
|
|
40
40
|
|
|
41
41
|
|
|
42
|
-
_cache: dict[str, Any] = {
|
|
43
|
-
'opcodes': None,
|
|
44
|
-
'versionTriplet': None
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
|
|
48
42
|
_audioDeviceRegex = r"(\d+):\s((?:adc|dac)\d+)\s*\((.*)\)(?:\s+\[ch:(\d+)\])?"
|
|
49
43
|
|
|
50
44
|
|
|
@@ -401,6 +395,8 @@ class _AlsaBackend(AudioBackend):
|
|
|
401
395
|
|
|
402
396
|
@_functools.cache
|
|
403
397
|
def _getAvailableAudioBackends() -> dict[str, AudioBackend]:
|
|
398
|
+
# This is not correct, we should actually check which plugins
|
|
399
|
+
# are available
|
|
404
400
|
_backendPortaudioCallback = _PortaudioBackend('callback')
|
|
405
401
|
|
|
406
402
|
backends: dict[str, AudioBackend] = {
|
|
@@ -414,7 +410,6 @@ def _getAvailableAudioBackends() -> dict[str, AudioBackend]:
|
|
|
414
410
|
|
|
415
411
|
if sys.platform == 'linux':
|
|
416
412
|
backends['alsa'] = _AlsaBackend()
|
|
417
|
-
backends['pulseaudio'] = _PulseAudioBackend()
|
|
418
413
|
elif sys.platform == 'darwin':
|
|
419
414
|
auhal = AudioBackend('auhal', alwaysAvailable=True, hasSystemSr=True,
|
|
420
415
|
needsRealtime=False, longname="coreaudio",
|
|
@@ -439,17 +434,7 @@ def findCsound() -> str | None:
|
|
|
439
434
|
return csound
|
|
440
435
|
|
|
441
436
|
|
|
442
|
-
def
|
|
443
|
-
"""
|
|
444
|
-
Returns the csound version as tuple (major, minor, patch)
|
|
445
|
-
"""
|
|
446
|
-
if (version := _cache.get('versionTriplet')) is not None:
|
|
447
|
-
return version
|
|
448
|
-
return _csoundGetInfoViaAPI()['versionTriplet']
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
@_functools.cache
|
|
452
|
-
def getVersion(useApi=True) -> tuple[int, int, int | str]:
|
|
437
|
+
def getVersion(opcodedir='') -> tuple[int, int, int | str]:
|
|
453
438
|
"""
|
|
454
439
|
Returns the csound version as tuple (major, minor, patch)
|
|
455
440
|
|
|
@@ -464,34 +449,7 @@ def getVersion(useApi=True) -> tuple[int, int, int | str]:
|
|
|
464
449
|
Raises RuntimeError if csound is not present or its version
|
|
465
450
|
can't be parsed
|
|
466
451
|
"""
|
|
467
|
-
|
|
468
|
-
return _getVersionViaApi()
|
|
469
|
-
|
|
470
|
-
csound = findCsound()
|
|
471
|
-
if not csound:
|
|
472
|
-
raise IOError("Csound not found")
|
|
473
|
-
cmd = '{csound} --version'.format(csound=csound).split()
|
|
474
|
-
proc = _subprocess.Popen(cmd, stderr=_subprocess.PIPE)
|
|
475
|
-
proc.wait()
|
|
476
|
-
if proc.stderr is None:
|
|
477
|
-
return (0, 0, 0)
|
|
478
|
-
outputbytes = proc.stderr.read()
|
|
479
|
-
if not outputbytes:
|
|
480
|
-
raise RuntimeError("Could not read csounds output")
|
|
481
|
-
output = outputbytes.decode('utf8')
|
|
482
|
-
lines = output.splitlines()
|
|
483
|
-
for line in lines:
|
|
484
|
-
if match := _re.search(r"Csound\s+version\s+(\d+)\.(\d+)(\.\w+)?", line):
|
|
485
|
-
major = int(match.group(1))
|
|
486
|
-
minor = int(match.group(2))
|
|
487
|
-
patch = match.group(3)
|
|
488
|
-
if patch is None:
|
|
489
|
-
patch = 0
|
|
490
|
-
elif patch.isdigit():
|
|
491
|
-
patch = int(patch)
|
|
492
|
-
return (major, minor, patch)
|
|
493
|
-
else:
|
|
494
|
-
raise RuntimeError(f"Did not find a csound version, csound output: '{output}'")
|
|
452
|
+
return csoundGetInfo(opcodedir=opcodedir)['versionTriplet']
|
|
495
453
|
|
|
496
454
|
|
|
497
455
|
def csoundSubproc(args: list[str], piped=True, wait=False) -> _subprocess.Popen:
|
|
@@ -558,28 +516,6 @@ def getSystemSr(backend: str) -> float | None:
|
|
|
558
516
|
return b.getSystemSr()
|
|
559
517
|
|
|
560
518
|
|
|
561
|
-
# def _getJackSrViaClient() -> float:
|
|
562
|
-
# import jack
|
|
563
|
-
# c = jack.Client("query")
|
|
564
|
-
# sr = c.samplerate
|
|
565
|
-
# c.close()
|
|
566
|
-
# return sr
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
# def _getCsoundSystemSr(backend: str) -> float:
|
|
570
|
-
# if backend not in {'jack', 'auhal'}:
|
|
571
|
-
# raise ValueError(f"backend {backend} does not support system sr")
|
|
572
|
-
# import libcsound
|
|
573
|
-
# csound = libcsound.Csound()
|
|
574
|
-
# csound.setOption(f"-+rtaudio={backend}")
|
|
575
|
-
# csound.setOption("-odac")
|
|
576
|
-
# csound.setOption("--use-system-sr")
|
|
577
|
-
# csound.start()
|
|
578
|
-
# sr = csound.sr()
|
|
579
|
-
# csound.stop()
|
|
580
|
-
# return sr
|
|
581
|
-
|
|
582
|
-
|
|
583
519
|
def getDefaultBackend() -> AudioBackend:
|
|
584
520
|
"""
|
|
585
521
|
Get the default active backend for platform
|
|
@@ -717,9 +653,9 @@ class CsoundProc:
|
|
|
717
653
|
csdstr: str = ""
|
|
718
654
|
|
|
719
655
|
|
|
720
|
-
def testCsound(dur=8., nchnls=2, backend='', device="
|
|
721
|
-
verbose=True
|
|
722
|
-
) ->
|
|
656
|
+
def testCsound(dur=8., nchnls=2, backend='', device="", sr=0, ksmps=64,
|
|
657
|
+
opcodeDir='', verbose=True, options: list[str] | None = None
|
|
658
|
+
) -> None:
|
|
723
659
|
"""
|
|
724
660
|
Test the current csound installation for realtime output
|
|
725
661
|
|
|
@@ -732,37 +668,14 @@ def testCsound(dur=8., nchnls=2, backend='', device="dac", sr=0, ksmps=64,
|
|
|
732
668
|
or a default sample rate otherwise
|
|
733
669
|
verbose: if True, make csound display debugging and status information
|
|
734
670
|
|
|
735
|
-
Returns:
|
|
736
|
-
a :class:`CsoundProc`
|
|
737
671
|
"""
|
|
738
672
|
backend = backend or getDefaultBackend().name
|
|
739
673
|
if not sr:
|
|
740
674
|
sr = getSamplerateForBackend(backend) or 44100
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
nchnls = {nchnls}
|
|
746
|
-
|
|
747
|
-
instr 1
|
|
748
|
-
iperiod = 1
|
|
749
|
-
kchn init -1
|
|
750
|
-
ktrig metro 1/iperiod
|
|
751
|
-
kchn = (kchn + ktrig) % nchnls
|
|
752
|
-
anoise pinker
|
|
753
|
-
outch kchn+1, anoise
|
|
754
|
-
{printchan}
|
|
755
|
-
endin
|
|
756
|
-
"""
|
|
757
|
-
sco = f"i1 0 {dur}"
|
|
758
|
-
orc = _textwrap.dedent(orc)
|
|
759
|
-
logger.debug(orc)
|
|
760
|
-
csd = joinCsd(orc, sco=sco)
|
|
761
|
-
tmp = _tempfile.mktemp(suffix=".csd")
|
|
762
|
-
open(tmp, "w").write(csd)
|
|
763
|
-
proc = runCsd(tmp, outdev=device, backend=backend)
|
|
764
|
-
return CsoundProc(proc=proc, backend=backend, outdev=device, sr=sr,
|
|
765
|
-
nchnls=nchnls, csdstr=csd)
|
|
675
|
+
import libcsound._util
|
|
676
|
+
libcsound._util.testCsound(module=backend, sr=sr, outdev=device, ksmps=ksmps,
|
|
677
|
+
nchnls=nchnls, dur=dur, opcodeDir=opcodeDir,
|
|
678
|
+
options=options)
|
|
766
679
|
|
|
767
680
|
|
|
768
681
|
def installedOpcodes(cached=True, opcodedir: str = '') -> set[str]:
|
|
@@ -778,15 +691,17 @@ def installedOpcodes(cached=True, opcodedir: str = '') -> set[str]:
|
|
|
778
691
|
Returns:
|
|
779
692
|
a list of all available opcodes
|
|
780
693
|
"""
|
|
781
|
-
if
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
return _csoundGetInfoViaAPI(opcodedir=opcodedir)['opcodes']
|
|
694
|
+
if not cached:
|
|
695
|
+
csoundGetInfo.cache_clear()
|
|
696
|
+
return csoundGetInfo(opcodedir=opcodedir)['opcodes']
|
|
697
|
+
|
|
786
698
|
|
|
699
|
+
@_functools.cache
|
|
700
|
+
def csoundGetInfo(opcodedir='') -> dict:
|
|
701
|
+
"""
|
|
702
|
+
Returns a dict of {'opcodedefs': list[OpcodeDef], 'opcodes': set[str], 'versionTriplet': (major, minor, patch)}
|
|
787
703
|
|
|
788
|
-
|
|
789
|
-
global _cache
|
|
704
|
+
"""
|
|
790
705
|
import libcsound
|
|
791
706
|
cs = libcsound.Csound(opcodeDir=opcodedir)
|
|
792
707
|
cs.setOption("-d")
|
|
@@ -799,11 +714,9 @@ def _csoundGetInfoViaAPI(opcodedir='') -> dict:
|
|
|
799
714
|
major = int(vs[:-3])
|
|
800
715
|
versionTriplet = (major, minor, patch)
|
|
801
716
|
opcodes = cs.getOpcodes()
|
|
802
|
-
opcodenames = set(opc.name for opc in opcodes)
|
|
803
|
-
_cache['versionTriplet'] = versionTriplet
|
|
804
|
-
_cache['opcodes'] = opcodenames
|
|
805
|
-
_cache['opcodedefs'] = opcodes
|
|
806
717
|
cs.stop()
|
|
718
|
+
cs.destroy()
|
|
719
|
+
opcodenames = {opc.name.split(".")[0] for opc in opcodes}
|
|
807
720
|
return {'opcodedefs': opcodes,
|
|
808
721
|
'opcodes': opcodenames,
|
|
809
722
|
'versionTriplet': versionTriplet}
|
|
@@ -10,9 +10,7 @@ import tempfile
|
|
|
10
10
|
from datetime import datetime
|
|
11
11
|
from pathlib import Path
|
|
12
12
|
|
|
13
|
-
from . import tools
|
|
14
13
|
from .state import state
|
|
15
|
-
from . import csounddefs
|
|
16
14
|
|
|
17
15
|
|
|
18
16
|
logger = logging.getLogger("csoundengine.dependencies")
|
|
@@ -151,13 +149,17 @@ def pluginsInstalled(cached=True) -> bool:
|
|
|
151
149
|
from . import csoundlib
|
|
152
150
|
installedOpcodes = csoundlib.installedOpcodes(cached=cached)
|
|
153
151
|
neededOpcodes = {
|
|
154
|
-
"atstop", "pwrite",
|
|
155
|
-
"dict_new", "
|
|
156
|
-
"pool_gen", "pool_pop", "pool_push", "pool_isfull",
|
|
152
|
+
"atstop", "pwrite",
|
|
153
|
+
"dict_new", "pool_gen", "pool_pop", "pool_push",
|
|
157
154
|
'interp1d', 'bisect', 'ftsetparams', 'zeroarray',
|
|
158
155
|
'panstereo'
|
|
159
156
|
}
|
|
160
|
-
|
|
157
|
+
ok = neededOpcodes.issubset(installedOpcodes)
|
|
158
|
+
if not ok:
|
|
159
|
+
notfound = neededOpcodes - installedOpcodes
|
|
160
|
+
logger.debug("Opcodes not found: %s", notfound)
|
|
161
|
+
logger.debug("Opcodes found: %s...", sorted(installedOpcodes)[:20])
|
|
162
|
+
return ok
|
|
161
163
|
|
|
162
164
|
|
|
163
165
|
def _getDownloadsFolder() -> Path:
|
|
@@ -169,44 +171,6 @@ def _getDownloadsFolder() -> Path:
|
|
|
169
171
|
return tempdir
|
|
170
172
|
|
|
171
173
|
|
|
172
|
-
def _installPluginsFromDist(apiversion=6, codesign=True) -> None:
|
|
173
|
-
platformid = tools.platformId()
|
|
174
|
-
rootfolder = Path(os.path.split(__file__)[0])
|
|
175
|
-
assert rootfolder.exists()
|
|
176
|
-
globpattern = {
|
|
177
|
-
'macos': '*.dylib',
|
|
178
|
-
'windows': '*.dll',
|
|
179
|
-
'linux': '*.so'
|
|
180
|
-
}.get(platformid.osname, None)
|
|
181
|
-
if globpattern is None:
|
|
182
|
-
raise RuntimeError(f"Platform {platformid} not supported")
|
|
183
|
-
|
|
184
|
-
subfolder = str(platformid)
|
|
185
|
-
pluginspath = rootfolder/f'data/plugins{apiversion}'/subfolder
|
|
186
|
-
if not pluginspath.exists():
|
|
187
|
-
raise RuntimeError(f"Could not find own csound plugins. Folder: {pluginspath}")
|
|
188
|
-
plugins = list(pluginspath.glob(globpattern))
|
|
189
|
-
if not plugins:
|
|
190
|
-
logger.error(f"Plugins not found. Plugins folder: '{pluginspath}', "
|
|
191
|
-
f"glob patter: '{globpattern}'")
|
|
192
|
-
raise RuntimeError("Plugins not found")
|
|
193
|
-
pluginsDest = csounddefs.userPluginsFolder(apiversion=f'{apiversion}.0')
|
|
194
|
-
logger.info(f"Installing plugins in folder: '{pluginsDest}'")
|
|
195
|
-
os.makedirs(pluginsDest, exist_ok=True)
|
|
196
|
-
_copyFiles([plugin.as_posix() for plugin in plugins], pluginsDest, verbose=True)
|
|
197
|
-
if platformid.osname == 'macos' and codesign:
|
|
198
|
-
installedBinaries = [os.path.join(pluginsDest, plugin.name)
|
|
199
|
-
for plugin in plugins]
|
|
200
|
-
assert all(os.path.exists(binary) for binary in installedBinaries)
|
|
201
|
-
try:
|
|
202
|
-
_codesignBinaries(installedBinaries)
|
|
203
|
-
except RuntimeError as e:
|
|
204
|
-
logger.error(f"Could not code-sign the binaries, error: {e}")
|
|
205
|
-
if platformid.arch == 'arm64':
|
|
206
|
-
logger.error(f"... The needed plugins will probably not work as is. You can still "
|
|
207
|
-
f"manually authorize them via right-click. The paths are: {installedBinaries}")
|
|
208
|
-
|
|
209
|
-
|
|
210
174
|
def _installPluginsViaRisset(majorversion: int | None = None) -> bool:
|
|
211
175
|
"""
|
|
212
176
|
Tries to install plugins via risset
|
|
@@ -215,7 +179,7 @@ def _installPluginsViaRisset(majorversion: int | None = None) -> bool:
|
|
|
215
179
|
"""
|
|
216
180
|
logger.info("Trying to install plugins via risset")
|
|
217
181
|
import risset
|
|
218
|
-
idx = risset.MainIndex(update=True,
|
|
182
|
+
idx = risset.MainIndex(update=True, major_version=majorversion or 7)
|
|
219
183
|
for pluginname in ['else', 'beosc', 'klib']:
|
|
220
184
|
p = idx.plugins.get(pluginname)
|
|
221
185
|
if p is None:
|
|
@@ -224,10 +188,12 @@ def _installPluginsViaRisset(majorversion: int | None = None) -> bool:
|
|
|
224
188
|
elif idx.is_plugin_installed(p):
|
|
225
189
|
logger.debug(f"Plugin '{pluginname}' already installed, skipping")
|
|
226
190
|
else:
|
|
191
|
+
logger.debug(f"Installing plugin {pluginname}")
|
|
227
192
|
errmsg = idx.install_plugin(p)
|
|
228
193
|
if errmsg:
|
|
229
194
|
logger.error(f"Error while installing plugin {pluginname}: {errmsg}")
|
|
230
195
|
return False
|
|
196
|
+
logger.debug("---- Installed all plugins")
|
|
231
197
|
return True
|
|
232
198
|
|
|
233
199
|
|
|
@@ -251,36 +217,35 @@ def installPlugins() -> bool:
|
|
|
251
217
|
" listed by csound")
|
|
252
218
|
from . import csoundlib
|
|
253
219
|
opcodes = csoundlib.installedOpcodes(cached=False)
|
|
254
|
-
|
|
255
|
-
logger.error(f"List of opcodes loaded by csound: {opcodestr}")
|
|
220
|
+
logger.error("List of opcodes loaded by csound: %s", ', '.join(sorted(opcodes)))
|
|
256
221
|
return False
|
|
257
222
|
except Exception as e:
|
|
258
223
|
logger.error(f"Exception {e} while trying to install plugins via risset")
|
|
259
224
|
return False
|
|
260
225
|
|
|
261
226
|
|
|
262
|
-
def _checkDependencies(fix=False
|
|
227
|
+
def _checkDependencies(fix=False) -> str:
|
|
263
228
|
"""
|
|
264
229
|
Returns an error message on failure, or an empty string on success
|
|
265
230
|
"""
|
|
266
231
|
from . import csoundlib
|
|
267
|
-
|
|
232
|
+
info = csoundlib.csoundGetInfo()
|
|
233
|
+
version = info['versionTriplet']
|
|
268
234
|
|
|
269
235
|
if version < (6, 16, 0):
|
|
270
236
|
return f"Csound version ({version}) is too old, should be >= 6.16"
|
|
271
237
|
|
|
272
|
-
|
|
273
|
-
logger.
|
|
238
|
+
elif version < (7, 0, 0):
|
|
239
|
+
logger.info("Support for csound 6 has been deprecated, use at your own risk")
|
|
274
240
|
|
|
275
241
|
if not pluginsInstalled():
|
|
276
242
|
if fix:
|
|
277
|
-
print("** csoundengine: Csound external plugins
|
|
278
|
-
" I will try to install them now")
|
|
243
|
+
print("** csoundengine: Csound external plugins not found, installing...")
|
|
279
244
|
ok = installPlugins()
|
|
280
245
|
if ok:
|
|
281
|
-
print("** csoundengine:
|
|
246
|
+
print("** csoundengine: ... plugins installed ok")
|
|
282
247
|
else:
|
|
283
|
-
print("** csoundengine:
|
|
248
|
+
print("** csoundengine: plugins could not be installed")
|
|
284
249
|
return "csound external plugins could not be installed"
|
|
285
250
|
else:
|
|
286
251
|
return ("Some plugins are not installed. They can be installed via "
|
|
@@ -309,13 +274,15 @@ def installDependencies() -> bool:
|
|
|
309
274
|
return not err
|
|
310
275
|
|
|
311
276
|
|
|
312
|
-
def checkDependencies(force=True, fix=False) -> bool:
|
|
277
|
+
def checkDependencies(force=True, fix=False, timeoutDays=30) -> bool:
|
|
313
278
|
"""
|
|
314
279
|
Check that all external dependencies are fullfilled.
|
|
315
280
|
|
|
316
281
|
Args:
|
|
317
282
|
force: if True, do not use cached results
|
|
318
283
|
fix: if True, try to fix missing dependencies if needed
|
|
284
|
+
timeoutDays: if the last check was done less than this
|
|
285
|
+
number of days ago, skip the check
|
|
319
286
|
|
|
320
287
|
Returns:
|
|
321
288
|
True if all dependencies are fullfilled
|
|
@@ -328,7 +295,7 @@ def checkDependencies(force=True, fix=False) -> bool:
|
|
|
328
295
|
|
|
329
296
|
now = datetime.now()
|
|
330
297
|
timeSinceLastCheck = now - datetime.fromisoformat(state['last_check'])
|
|
331
|
-
if not force and timeSinceLastCheck.days <
|
|
298
|
+
if not force and timeoutDays > 0 and timeSinceLastCheck.days < timeoutDays:
|
|
332
299
|
return True
|
|
333
300
|
logger.info("Checking dependencies")
|
|
334
301
|
errormsg = _checkDependencies(fix=fix)
|
|
@@ -337,14 +304,3 @@ def checkDependencies(force=True, fix=False) -> bool:
|
|
|
337
304
|
if not fix:
|
|
338
305
|
logger.error("Missing dependencies might be installed by calling installDependencies()")
|
|
339
306
|
return not errormsg
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
def _codesignBinaries(binaries: list[str]) -> None:
|
|
343
|
-
"""
|
|
344
|
-
Calls codesign to sign the binaries with adhoc signature
|
|
345
|
-
|
|
346
|
-
Raises RuntimeError on fail
|
|
347
|
-
"""
|
|
348
|
-
import risset
|
|
349
|
-
logger.warning(f"Codesigning macos binaries: {binaries}")
|
|
350
|
-
risset.macos_codesign(binaries, signature='-')
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: csoundengine
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.24.0
|
|
4
4
|
Summary: An audio synthesis framework using csound
|
|
5
5
|
Author-email: Eduardo Moguillansky <eduardo.moguillansky@gmail.com>
|
|
6
6
|
License: GNU GENERAL PUBLIC LICENSE
|
|
@@ -680,7 +680,7 @@ License: GNU GENERAL PUBLIC LICENSE
|
|
|
680
680
|
Project-URL: Homepage, https://github.com/gesellkammer/csoundengine
|
|
681
681
|
Classifier: Programming Language :: Python :: 3
|
|
682
682
|
Classifier: Operating System :: OS Independent
|
|
683
|
-
Requires-Python: >=3.
|
|
683
|
+
Requires-Python: >=3.12
|
|
684
684
|
Description-Content-Type: text/x-rst
|
|
685
685
|
License-File: LICENSE.txt
|
|
686
686
|
Requires-Dist: numpy
|
|
@@ -695,12 +695,12 @@ Requires-Dist: ipywidgets
|
|
|
695
695
|
Requires-Dist: xxhash
|
|
696
696
|
Requires-Dist: docstring_parser
|
|
697
697
|
Requires-Dist: typing_extensions
|
|
698
|
-
Requires-Dist: libcsound>=0.
|
|
698
|
+
Requires-Dist: libcsound>=0.17.1
|
|
699
699
|
Requires-Dist: sndfileio>=2.1.1
|
|
700
700
|
Requires-Dist: emlib>=1.20
|
|
701
701
|
Requires-Dist: configdict>=2.10.0
|
|
702
702
|
Requires-Dist: pitchtools>=1.14.0
|
|
703
|
-
Requires-Dist: risset>=3.
|
|
703
|
+
Requires-Dist: risset>=3.5.7
|
|
704
704
|
Requires-Dist: sounddevice
|
|
705
705
|
Dynamic: license-file
|
|
706
706
|
|
|
@@ -885,8 +885,13 @@ https://csoundengine.readthedocs.io/en/latest/Installation.html
|
|
|
885
885
|
Dependencies
|
|
886
886
|
~~~~~~~~~~~~
|
|
887
887
|
|
|
888
|
-
* python >= 3.
|
|
889
|
-
* csound
|
|
888
|
+
* python >= 3.12
|
|
889
|
+
* csound 7 >= 7.0 (csound 6 is supported but it is declared EOL)
|
|
890
|
+
|
|
891
|
+
.. note::
|
|
892
|
+
csound only needs to be installed previously on windows at the moment, for
|
|
893
|
+
the other platforms it is installed automatically if not present
|
|
894
|
+
|
|
890
895
|
|
|
891
896
|
.. code-block:: bash
|
|
892
897
|
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
Installation
|
|
2
|
+
============
|
|
3
|
+
|
|
4
|
+
For all platforms, the installation is the same::
|
|
5
|
+
|
|
6
|
+
pip install csoundengine
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
Dependencies
|
|
10
|
+
------------
|
|
11
|
+
|
|
12
|
+
on windows, **csoundengine** depends on **csound** being installed. For the other platforms
|
|
13
|
+
it will be installed if it is not present. If you already have csound installed, the
|
|
14
|
+
version detected will be used, but bear in mind that if using csound 7, a recent version
|
|
15
|
+
is needed since the plugins used are compiled against the last development version
|
|
@@ -297,8 +297,9 @@ Features
|
|
|
297
297
|
parameters and default values. This makes it very easy to create instruments with
|
|
298
298
|
many parameters. When an instance of such an instrument is scheduled **csoundengine**
|
|
299
299
|
fills the values of any parameter which is not explicitely given with the default
|
|
300
|
-
value. Any parg can also be modulated in real-time.
|
|
301
|
-
|
|
300
|
+
value. Any parg can also be modulated in real-time.
|
|
301
|
+
See :meth:`Engine.setp() <csoundengine.engine.Engine.setp>`
|
|
302
|
+
|
|
302
303
|
* **Event ids / Modulation** - in *csoundengine* every event can have a unique id assigned,
|
|
303
304
|
allowing the user to control it during performance, from python or from csound directly.
|
|
304
305
|
* **Informed use of the Csound API** - *csoundengine* uses the most convenient part of the
|
|
@@ -14,7 +14,8 @@ Interaction with *csound* is through its API using
|
|
|
14
14
|
`libcsound <https://github.com/csound-plugins/libcsound>`_.
|
|
15
15
|
See the `Csound FLOSS manual <https://flossmanual.csound.com/introduction/preface>`_
|
|
16
16
|
to learn more about csound and its syntax and run examples online. **csoundengine**
|
|
17
|
-
is compatible with any recent version of
|
|
17
|
+
is compatible with any recent version of csound7 (csound 6 is supported but
|
|
18
|
+
it has been declared EOL)
|
|
18
19
|
|
|
19
20
|
The source code of this package is hosted at https://github.com/gesellkammer/csoundengine
|
|
20
21
|
|
|
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
|
|
|
5
5
|
|
|
6
6
|
[project]
|
|
7
7
|
name = "csoundengine"
|
|
8
|
-
version = "2.
|
|
8
|
+
version = "2.24.0"
|
|
9
9
|
license = { file = "LICENSE.txt" }
|
|
10
10
|
description = "An audio synthesis framework using csound"
|
|
11
11
|
authors = [
|
|
@@ -19,7 +19,7 @@ classifiers = [
|
|
|
19
19
|
"Operating System :: OS Independent",
|
|
20
20
|
]
|
|
21
21
|
|
|
22
|
-
requires-python = ">=3.
|
|
22
|
+
requires-python = ">=3.12"
|
|
23
23
|
|
|
24
24
|
dependencies = [
|
|
25
25
|
"numpy",
|
|
@@ -35,12 +35,12 @@ dependencies = [
|
|
|
35
35
|
"docstring_parser",
|
|
36
36
|
"typing_extensions",
|
|
37
37
|
|
|
38
|
-
"libcsound>=0.
|
|
38
|
+
"libcsound>=0.17.1",
|
|
39
39
|
"sndfileio>=2.1.1",
|
|
40
40
|
"emlib>=1.20",
|
|
41
41
|
"configdict>=2.10.0",
|
|
42
42
|
"pitchtools>=1.14.0",
|
|
43
|
-
"risset>=3.
|
|
43
|
+
"risset>=3.5.7",
|
|
44
44
|
"sounddevice",
|
|
45
45
|
]
|
|
46
46
|
|
|
@@ -48,8 +48,8 @@ dependencies = [
|
|
|
48
48
|
packages = ["csoundengine"]
|
|
49
49
|
|
|
50
50
|
|
|
51
|
-
[tool.setuptools.package-data]
|
|
52
|
-
csoundengine = ['csoundengine/data']
|
|
51
|
+
# [tool.setuptools.package-data]
|
|
52
|
+
# csoundengine = ['csoundengine/data']
|
|
53
53
|
|
|
54
54
|
|
|
55
55
|
[project.urls]
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Check that all dependencies needed by csoundengine (csound and its plugins)
|
|
3
|
+
are available even if csound is not preinstalled in the system.
|
|
4
|
+
|
|
5
|
+
csoundengine does not use the csound binary. The csound library comes
|
|
6
|
+
with the pip package ``libcsound``, which installs csound (and the needed
|
|
7
|
+
plugins) on demand the first time it is imported if no csound
|
|
8
|
+
installation is found.
|
|
9
|
+
|
|
10
|
+
This test is meant to be run in a clean environment where csound is not
|
|
11
|
+
installed (see the ``testdeps`` job in .github/workflows/test2.yml)
|
|
12
|
+
"""
|
|
13
|
+
import sys
|
|
14
|
+
import shutil
|
|
15
|
+
import platform
|
|
16
|
+
import logging
|
|
17
|
+
|
|
18
|
+
logging.basicConfig(level=logging.DEBUG,
|
|
19
|
+
format="%(levelname)s %(name)s: %(message)s")
|
|
20
|
+
|
|
21
|
+
print("python :", sys.version)
|
|
22
|
+
print("platform:", platform.platform())
|
|
23
|
+
print("machine :", platform.machine())
|
|
24
|
+
|
|
25
|
+
csoundbin = shutil.which("csound")
|
|
26
|
+
print(f"csound binary in path: {csoundbin or '<not found>'}")
|
|
27
|
+
if csoundbin:
|
|
28
|
+
print("Warning: csound is preinstalled, the auto-installation of csound"
|
|
29
|
+
" by libcsound will not be exercised")
|
|
30
|
+
|
|
31
|
+
# Importing csoundengine imports libcsound. If no csound installation is
|
|
32
|
+
# found, libcsound installs csound (together with its plugins) automatically
|
|
33
|
+
import csoundengine # noqa: F401
|
|
34
|
+
from csoundengine import dependencies
|
|
35
|
+
|
|
36
|
+
ok = dependencies.checkDependencies(force=True, fix=True)
|
|
37
|
+
pluginsok = dependencies.pluginsInstalled(cached=False)
|
|
38
|
+
print(f"Dependencies ok: {ok}")
|
|
39
|
+
print(f"Plugins ok: {pluginsok}")
|
|
40
|
+
if not (ok and pluginsok):
|
|
41
|
+
print("******************* Some dependencies are not met")
|
|
42
|
+
sys.exit(1)
|
|
43
|
+
|
|
44
|
+
from csoundengine import csoundlib
|
|
45
|
+
print("csound version:", csoundlib.getVersion())
|
|
46
|
+
print(":::::::::::::::: All dependencies are installed")
|
csoundengine-2.23.0/.cirrus.yml
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
container:
|
|
2
|
-
image: python:latest
|
|
3
|
-
|
|
4
|
-
test_task:
|
|
5
|
-
|
|
6
|
-
macos_instance:
|
|
7
|
-
image: ghcr.io/cirruslabs/macos-ventura-xcode:latest
|
|
8
|
-
|
|
9
|
-
test_script: |
|
|
10
|
-
set -x
|
|
11
|
-
ls -l
|
|
12
|
-
python3 -c 'import platform; print(platform.machine(), platform.uname())' # , platform.dist())'
|
|
13
|
-
brew install csound
|
|
14
|
-
|
|
15
|
-
python3 -m venv .venv
|
|
16
|
-
source .venv/bin/activate
|
|
17
|
-
|
|
18
|
-
python3 -m pip install .
|
|
19
|
-
cd test
|
|
20
|
-
python3 test1.py -o test1-mac-arm64.wav
|
|
21
|
-
python3 test2.py
|
|
22
|
-
|
|
23
|
-
ls -l
|
|
24
|
-
cd ..
|
|
25
|
-
|
|
26
|
-
binaries_artifacts:
|
|
27
|
-
path: test/*.wav
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
#
|
|
32
|
-
# OSX
|
|
33
|
-
#
|
|
34
|
-
#osx_task:
|
|
35
|
-
# auto_cancellation: true
|
|
36
|
-
|
|
37
|
-
#
|
|
38
|
-
# check_script:
|
|
39
|
-
# - python3 -c "import platform; print(platform.machine(), platform.architecture())"
|
|
40
|
-
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
Installation
|
|
2
|
-
============
|
|
3
|
-
|
|
4
|
-
`csoundengine` needs a python version >= 3.8. For all platforms, the installation is
|
|
5
|
-
the same::
|
|
6
|
-
|
|
7
|
-
pip install csoundengine
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
Dependencies
|
|
11
|
-
------------
|
|
12
|
-
|
|
13
|
-
**csoundengine** depends on **csound** itself being installed. At the moment the minimal
|
|
14
|
-
version of csound supported is **6.16**. **csound 7**, even if not officially released
|
|
15
|
-
yet, is supported and tested regularly.
|
|
16
|
-
|
|
17
|
-
For **macos** and **windows**, **csound** can be installed by the provided installers
|
|
18
|
-
(`<https://github.com/csound/csound/releases>`_). For linux, the installation via
|
|
19
|
-
the distribution's package manager is the recommended way.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|