Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

All the tests involving CHOWTapeModel.component fail #32

Closed
LucaMarconato opened this issue Sep 22, 2021 · 8 comments · Fixed by #56
Closed

All the tests involving CHOWTapeModel.component fail #32

LucaMarconato opened this issue Sep 22, 2021 · 8 comments · Fixed by #56
Labels
stale This issue is overdue for an update

Comments

@LucaMarconato
Copy link

LucaMarconato commented Sep 22, 2021

I have create a conda environment, installed pybind11 and tox via conda and run tox. But all the tests involving CHOWTapeModel.component fail.

Some more details (please tell me if you want more information):

  • macOS BigSur 11.4
  • Python 3.8.12

Any idea?

@psobot
Copy link
Member

psobot commented Sep 29, 2021

Hi @LucaMarconato! I do indeed more information - what errors do the tests fail with? Any useful stack traces or error messages?

@psobot
Copy link
Member

psobot commented Oct 12, 2021

Hi again @LucaMarconato - just an FYI that I'm going to close this in a week if it's no longer an issue, as I don't really have any information to go off of (and I've been unable to reproduce the issue).

@LucaMarconato
Copy link
Author

LucaMarconato commented Oct 12, 2021

Hi, sorry for the delay in answering, here is my full output from tox, do you need any extra information, like the full conda environment info?

(39) macbook@MacBook-Pro-di-macbook pedalboard % tox
py recreate: /Users/macbook/programming/python/pedalboard/.tox/py
py installdeps: -r/Users/macbook/programming/python/pedalboard/dev-requirements.txt
py installed: absl-py==0.14.1,appdirs==1.4.4,appnope==0.1.2,astunparse==1.6.3,attrs==21.2.0,backcall==0.2.0,black==21.7b0,bumpversion==0.5.3,cachetools==4.2.4,certifi==2021.10.8,charset-normalizer==2.0.7,click==8.0.3,colorama==0.4.4,coverage==5.0.2,decorator==5.1.0,flake8==4.0.1,flatbuffers==1.12,gast==0.4.0,google-auth==1.35.0,google-auth-oauthlib==0.4.6,google-pasta==0.2.0,grpcio==1.34.1,h5py==3.1.0,idna==3.2,interrogate==1.5.0,ipdb==0.13.9,ipython==7.28.0,jedi==0.18.0,Jinja2==3.0.2,keras-nightly==2.5.0.dev2021032900,Keras-Preprocessing==1.1.2,livereload==2.6.3,Markdown==3.3.4,MarkupSafe==2.0.1,matplotlib-inline==0.1.3,mccabe==0.6.1,mkdocs==1.0.4,more-itertools==8.10.0,mypy-extensions==0.4.3,numpy==1.19.5,oauthlib==3.1.1,opt-einsum==3.3.0,packaging==21.0,parso==0.8.2,pathspec==0.9.0,-e git+git@github.com:spotify/pedalboard.git@96f282c68b6f1ac3e43a7f7c83523d9e957a8c37#egg=pedalboard,pexpect==4.8.0,pickleshare==0.7.5,pluggy==0.13.1,prompt-toolkit==3.0.20,protobuf==3.18.1,ptyprocess==0.7.0,py==1.10.0,pyasn1==0.4.8,pyasn1-modules==0.2.8,pybind11==2.8.0,pycodestyle==2.8.0,pyflakes==2.4.0,Pygments==2.10.0,pyparsing==2.4.7,pytest==5.3.2,pytest-cov==2.8.1,pytest-mock==3.3.1,PyYAML==5.4.1,regex==2021.10.8,requests==2.26.0,requests-oauthlib==1.3.0,rsa==4.7.2,six==1.15.0,sox==1.4.1,tabulate==0.8.9,tensorboard==2.6.0,tensorboard-data-server==0.6.1,tensorboard-plugin-wit==1.8.0,tensorflow==2.5.0,tensorflow-estimator==2.5.0,termcolor==1.1.0,toml==0.10.2,tomli==1.2.1,tornado==6.1,traitlets==5.1.0,typing-extensions==3.7.4.3,urllib3==1.26.7,wcwidth==0.2.5,Werkzeug==2.0.2,wrapt==1.12.1
py run-test-pre: PYTHONHASHSEED='256814189'
py run-test: commands[0] | coverage run -m pytest
========================================================= test session starts =========================================================
platform darwin -- Python 3.9.7, pytest-5.3.2, py-1.10.0, pluggy-0.13.1 -- /Users/macbook/programming/python/pedalboard/.tox/py/bin/python
cachedir: .tox/py/.pytest_cache
rootdir: /Users/macbook/programming/python/pedalboard, inifile: tox.ini, testpaths: tests
plugins: mock-3.3.1, cov-2.8.1
collected 265 items                                                                                                                   

tests/test_benchmark.py::test_pysox_performance_difference SKIPPED                                                              [  0%]
tests/test_external_plugins.py::test_at_least_one_plugin_is_available_for_testing PASSED                                        [  0%]
tests/test_external_plugins.py::test_at_least_one_parameter[CHOWTapeModel.vst3] PASSED                                          [  1%]
tests/test_external_plugins.py::test_at_least_one_parameter[CHOWTapeModel.component] FAILED                                     [  1%]
tests/test_external_plugins.py::test_initial_parameters[CHOWTapeModel.vst3] PASSED                                              [  1%]
tests/test_external_plugins.py::test_initial_parameters[CHOWTapeModel.component] FAILED                                         [  2%]
tests/test_external_plugins.py::test_initial_parameter_validation[CHOWTapeModel.vst3-input_gain] PASSED                         [  2%]
tests/test_external_plugins.py::test_initial_parameter_validation[CHOWTapeModel.vst3-output_gain] PASSED                        [  3%]
tests/test_external_plugins.py::test_initial_parameter_validation[CHOWTapeModel.vst3-dry_wet] PASSED                            [  3%]
tests/test_external_plugins.py::test_initial_parameter_validation[CHOWTapeModel.vst3-preset] PASSED                             [  3%]
tests/test_external_plugins.py::test_initial_parameter_validation[CHOWTapeModel.vst3-tone_bass] PASSED                          [  4%]
tests/test_external_plugins.py::test_initial_parameter_validation[CHOWTapeModel.vst3-tone_treble] PASSED                        [  4%]
tests/test_external_plugins.py::test_initial_parameter_validation[CHOWTapeModel.vst3-tape_drive] PASSED                         [  4%]
tests/test_external_plugins.py::test_initial_parameter_validation[CHOWTapeModel.vst3-tape_saturation] PASSED                    [  5%]
tests/test_external_plugins.py::test_initial_parameter_validation[CHOWTapeModel.vst3-tape_bias] PASSED                          [  5%]
tests/test_external_plugins.py::test_initial_parameter_validation[CHOWTapeModel.vst3-oversampling] PASSED                       [  6%]
tests/test_external_plugins.py::test_initial_parameter_validation[CHOWTapeModel.vst3-tape_speed] PASSED                         [  6%]
tests/test_external_plugins.py::test_initial_parameter_validation[CHOWTapeModel.vst3-tape_spacing] PASSED                       [  6%]
tests/test_external_plugins.py::test_initial_parameter_validation[CHOWTapeModel.vst3-tape_thickness] PASSED                     [  7%]
tests/test_external_plugins.py::test_initial_parameter_validation[CHOWTapeModel.vst3-playhead_gap] PASSED                       [  7%]
tests/test_external_plugins.py::test_initial_parameter_validation[CHOWTapeModel.vst3-azimuth] PASSED                            [  7%]
tests/test_external_plugins.py::test_initial_parameter_validation[CHOWTapeModel.vst3-flutter_rate] PASSED                       [  8%]
tests/test_external_plugins.py::test_initial_parameter_validation[CHOWTapeModel.vst3-flutter_depth] PASSED                      [  8%]
tests/test_external_plugins.py::test_initial_parameter_validation[CHOWTapeModel.vst3-wow_rate] PASSED                           [  9%]
tests/test_external_plugins.py::test_initial_parameter_validation[CHOWTapeModel.vst3-wow_depth] PASSED                          [  9%]
tests/test_external_plugins.py::test_initial_parameter_validation[CHOWTapeModel.vst3-wow_variance] PASSED                       [  9%]
tests/test_external_plugins.py::test_initial_parameter_validation[CHOWTapeModel.vst3-wow_drift] PASSED                          [ 10%]
tests/test_external_plugins.py::test_initial_parameter_validation[CHOWTapeModel.vst3-degrade_depth] PASSED                      [ 10%]
tests/test_external_plugins.py::test_initial_parameter_validation[CHOWTapeModel.vst3-degrade_amount] PASSED                     [ 10%]
tests/test_external_plugins.py::test_initial_parameter_validation[CHOWTapeModel.vst3-degrade_variance] PASSED                   [ 11%]
tests/test_external_plugins.py::test_initial_parameter_validation[CHOWTapeModel.vst3-degrade_envelope] PASSED                   [ 11%]
tests/test_external_plugins.py::test_initial_parameter_validation[CHOWTapeModel.vst3-chew_depth] PASSED                         [ 12%]
tests/test_external_plugins.py::test_initial_parameter_validation[CHOWTapeModel.vst3-chew_freq] PASSED                          [ 12%]
tests/test_external_plugins.py::test_initial_parameter_validation[CHOWTapeModel.vst3-chew_variance] PASSED                      [ 12%]
tests/test_external_plugins.py::test_initial_parameter_validation_missing[CHOWTapeModel.vst3] PASSED                            [ 13%]
tests/test_external_plugins.py::test_initial_parameter_validation_missing[CHOWTapeModel.component] FAILED                       [ 13%]
tests/test_external_plugins.py::test_import_error_on_missing_path[__init__] PASSED                                              [ 13%]
tests/test_external_plugins.py::test_import_error_on_missing_path[VST3Plugin] PASSED                                            [ 14%]
tests/test_external_plugins.py::test_import_error_on_missing_path[AudioUnitPlugin] PASSED                                       [ 14%]
tests/test_external_plugins.py::test_plugin_accepts_variable_channel_count[1-48000-CHOWTapeModel.vst3] PASSED                   [ 15%]
tests/test_external_plugins.py::test_plugin_accepts_variable_channel_count[1-48000-CHOWTapeModel.component] FAILED              [ 15%]
tests/test_external_plugins.py::test_plugin_accepts_variable_channel_count[2-48000-CHOWTapeModel.vst3] PASSED                   [ 15%]
tests/test_external_plugins.py::test_plugin_accepts_variable_channel_count[2-48000-CHOWTapeModel.component] FAILED              [ 16%]
tests/test_external_plugins.py::test_plugin_accepts_variable_channel_count[1-44100-CHOWTapeModel.vst3] PASSED                   [ 16%]
tests/test_external_plugins.py::test_plugin_accepts_variable_channel_count[1-44100-CHOWTapeModel.component] FAILED              [ 16%]
tests/test_external_plugins.py::test_plugin_accepts_variable_channel_count[2-44100-CHOWTapeModel.vst3] PASSED                   [ 17%]
tests/test_external_plugins.py::test_plugin_accepts_variable_channel_count[2-44100-CHOWTapeModel.component] FAILED              [ 17%]
tests/test_external_plugins.py::test_plugin_accepts_variable_channel_count[1-22050-CHOWTapeModel.vst3] PASSED                   [ 18%]
tests/test_external_plugins.py::test_plugin_accepts_variable_channel_count[1-22050-CHOWTapeModel.component] FAILED              [ 18%]
tests/test_external_plugins.py::test_plugin_accepts_variable_channel_count[2-22050-CHOWTapeModel.vst3] PASSED                   [ 18%]
tests/test_external_plugins.py::test_plugin_accepts_variable_channel_count[2-22050-CHOWTapeModel.component] FAILED              [ 19%]
tests/test_external_plugins.py::test_plugin_accepts_variable_channel_count_without_reloading[CHOWTapeModel.vst3] PASSED         [ 19%]
tests/test_external_plugins.py::test_plugin_accepts_variable_channel_count_without_reloading[CHOWTapeModel.component] FAILED    [ 20%]
tests/test_external_plugins.py::test_all_parameters_are_accessible_as_properties[CHOWTapeModel.vst3] PASSED                     [ 20%]
tests/test_external_plugins.py::test_all_parameters_are_accessible_as_properties[CHOWTapeModel.component] FAILED                [ 20%]
tests/test_external_plugins.py::test_parameters_cant_be_assigned_to_directly[CHOWTapeModel.vst3] PASSED                         [ 21%]
tests/test_external_plugins.py::test_parameters_cant_be_assigned_to_directly[CHOWTapeModel.component] FAILED                    [ 21%]
tests/test_external_plugins.py::test_all_parameters_have_accessors[CHOWTapeModel.vst3] PASSED                                   [ 21%]
tests/test_external_plugins.py::test_all_parameters_have_accessors[CHOWTapeModel.component] FAILED                              [ 22%]
tests/test_external_plugins.py::test_attributes_proxy[CHOWTapeModel.vst3] PASSED                                                [ 22%]
tests/test_external_plugins.py::test_attributes_proxy[CHOWTapeModel.component] FAILED                                           [ 23%]
tests/test_external_plugins.py::test_bool_parameters[CHOWTapeModel.vst3-input_filters_on_off] PASSED                            [ 23%]
tests/test_external_plugins.py::test_bool_parameters[CHOWTapeModel.vst3-input_cut_makeup] PASSED                                [ 23%]
tests/test_external_plugins.py::test_bool_parameters[CHOWTapeModel.vst3-tone_on_off] PASSED                                     [ 24%]
tests/test_external_plugins.py::test_bool_parameters[CHOWTapeModel.vst3-tape_on_off] PASSED                                     [ 24%]
tests/test_external_plugins.py::test_bool_parameters[CHOWTapeModel.vst3-loss_on_off] PASSED                                     [ 24%]
tests/test_external_plugins.py::test_bool_parameters[CHOWTapeModel.vst3-wow_flutter_on_off] PASSED                              [ 25%]
tests/test_external_plugins.py::test_bool_parameters[CHOWTapeModel.vst3-degrade_point1x] PASSED                                 [ 25%]
tests/test_external_plugins.py::test_bool_parameters[CHOWTapeModel.vst3-degrade_on_off] PASSED                                  [ 26%]
tests/test_external_plugins.py::test_bool_parameters[CHOWTapeModel.vst3-chew_on_off] PASSED                                     [ 26%]
tests/test_external_plugins.py::test_bool_parameters[CHOWTapeModel.vst3-bypass] PASSED                                          [ 26%]
tests/test_external_plugins.py::test_bool_parameter_valdation[CHOWTapeModel.vst3-input_filters_on_off] PASSED                   [ 27%]
tests/test_external_plugins.py::test_bool_parameter_valdation[CHOWTapeModel.vst3-input_cut_makeup] PASSED                       [ 27%]
tests/test_external_plugins.py::test_bool_parameter_valdation[CHOWTapeModel.vst3-tone_on_off] PASSED                            [ 27%]
tests/test_external_plugins.py::test_bool_parameter_valdation[CHOWTapeModel.vst3-tape_on_off] PASSED                            [ 28%]
tests/test_external_plugins.py::test_bool_parameter_valdation[CHOWTapeModel.vst3-loss_on_off] PASSED                            [ 28%]
tests/test_external_plugins.py::test_bool_parameter_valdation[CHOWTapeModel.vst3-wow_flutter_on_off] PASSED                     [ 29%]
tests/test_external_plugins.py::test_bool_parameter_valdation[CHOWTapeModel.vst3-degrade_point1x] PASSED                        [ 29%]
tests/test_external_plugins.py::test_bool_parameter_valdation[CHOWTapeModel.vst3-degrade_on_off] PASSED                         [ 29%]
tests/test_external_plugins.py::test_bool_parameter_valdation[CHOWTapeModel.vst3-chew_on_off] PASSED                            [ 30%]
tests/test_external_plugins.py::test_bool_parameter_valdation[CHOWTapeModel.vst3-bypass] PASSED                                 [ 30%]
tests/test_external_plugins.py::test_float_parameters[CHOWTapeModel.vst3-input_gain] PASSED                                     [ 30%]
tests/test_external_plugins.py::test_float_parameters[CHOWTapeModel.vst3-output_gain] PASSED                                    [ 31%]
tests/test_external_plugins.py::test_float_parameters[CHOWTapeModel.vst3-dry_wet] PASSED                                        [ 31%]
tests/test_external_plugins.py::test_float_parameters[CHOWTapeModel.vst3-preset] PASSED                                         [ 32%]
tests/test_external_plugins.py::test_float_parameters[CHOWTapeModel.vst3-tone_bass] PASSED                                      [ 32%]
tests/test_external_plugins.py::test_float_parameters[CHOWTapeModel.vst3-tone_treble] PASSED                                    [ 32%]
tests/test_external_plugins.py::test_float_parameters[CHOWTapeModel.vst3-tape_drive] PASSED                                     [ 33%]
tests/test_external_plugins.py::test_float_parameters[CHOWTapeModel.vst3-tape_saturation] PASSED                                [ 33%]
tests/test_external_plugins.py::test_float_parameters[CHOWTapeModel.vst3-tape_bias] PASSED                                      [ 33%]
tests/test_external_plugins.py::test_float_parameters[CHOWTapeModel.vst3-oversampling] PASSED                                   [ 34%]
tests/test_external_plugins.py::test_float_parameters[CHOWTapeModel.vst3-tape_speed] PASSED                                     [ 34%]
tests/test_external_plugins.py::test_float_parameters[CHOWTapeModel.vst3-tape_spacing] PASSED                                   [ 35%]
tests/test_external_plugins.py::test_float_parameters[CHOWTapeModel.vst3-tape_thickness] PASSED                                 [ 35%]
tests/test_external_plugins.py::test_float_parameters[CHOWTapeModel.vst3-playhead_gap] PASSED                                   [ 35%]
tests/test_external_plugins.py::test_float_parameters[CHOWTapeModel.vst3-azimuth] PASSED                                        [ 36%]
tests/test_external_plugins.py::test_float_parameters[CHOWTapeModel.vst3-flutter_rate] PASSED                                   [ 36%]
tests/test_external_plugins.py::test_float_parameters[CHOWTapeModel.vst3-flutter_depth] PASSED                                  [ 36%]
tests/test_external_plugins.py::test_float_parameters[CHOWTapeModel.vst3-wow_rate] PASSED                                       [ 37%]
tests/test_external_plugins.py::test_float_parameters[CHOWTapeModel.vst3-wow_depth] PASSED                                      [ 37%]
tests/test_external_plugins.py::test_float_parameters[CHOWTapeModel.vst3-wow_variance] PASSED                                   [ 38%]
tests/test_external_plugins.py::test_float_parameters[CHOWTapeModel.vst3-wow_drift] PASSED                                      [ 38%]
tests/test_external_plugins.py::test_float_parameters[CHOWTapeModel.vst3-degrade_depth] PASSED                                  [ 38%]
tests/test_external_plugins.py::test_float_parameters[CHOWTapeModel.vst3-degrade_amount] PASSED                                 [ 39%]
tests/test_external_plugins.py::test_float_parameters[CHOWTapeModel.vst3-degrade_variance] PASSED                               [ 39%]
tests/test_external_plugins.py::test_float_parameters[CHOWTapeModel.vst3-degrade_envelope] PASSED                               [ 40%]
tests/test_external_plugins.py::test_float_parameters[CHOWTapeModel.vst3-chew_depth] PASSED                                     [ 40%]
tests/test_external_plugins.py::test_float_parameters[CHOWTapeModel.vst3-chew_freq] PASSED                                      [ 40%]
tests/test_external_plugins.py::test_float_parameters[CHOWTapeModel.vst3-chew_variance] PASSED                                  [ 41%]
tests/test_external_plugins.py::test_float_parameter_valdation[CHOWTapeModel.vst3-input_gain] PASSED                            [ 41%]
tests/test_external_plugins.py::test_float_parameter_valdation[CHOWTapeModel.vst3-output_gain] PASSED                           [ 41%]
tests/test_external_plugins.py::test_float_parameter_valdation[CHOWTapeModel.vst3-dry_wet] PASSED                               [ 42%]
tests/test_external_plugins.py::test_float_parameter_valdation[CHOWTapeModel.vst3-preset] PASSED                                [ 42%]
tests/test_external_plugins.py::test_float_parameter_valdation[CHOWTapeModel.vst3-tone_bass] PASSED                             [ 43%]
tests/test_external_plugins.py::test_float_parameter_valdation[CHOWTapeModel.vst3-tone_treble] PASSED                           [ 43%]
tests/test_external_plugins.py::test_float_parameter_valdation[CHOWTapeModel.vst3-tape_drive] PASSED                            [ 43%]
tests/test_external_plugins.py::test_float_parameter_valdation[CHOWTapeModel.vst3-tape_saturation] PASSED                       [ 44%]
tests/test_external_plugins.py::test_float_parameter_valdation[CHOWTapeModel.vst3-tape_bias] PASSED                             [ 44%]
tests/test_external_plugins.py::test_float_parameter_valdation[CHOWTapeModel.vst3-oversampling] PASSED                          [ 44%]
tests/test_external_plugins.py::test_float_parameter_valdation[CHOWTapeModel.vst3-tape_speed] PASSED                            [ 45%]
tests/test_external_plugins.py::test_float_parameter_valdation[CHOWTapeModel.vst3-tape_spacing] PASSED                          [ 45%]
tests/test_external_plugins.py::test_float_parameter_valdation[CHOWTapeModel.vst3-tape_thickness] PASSED                        [ 46%]
tests/test_external_plugins.py::test_float_parameter_valdation[CHOWTapeModel.vst3-playhead_gap] PASSED                          [ 46%]
tests/test_external_plugins.py::test_float_parameter_valdation[CHOWTapeModel.vst3-azimuth] PASSED                               [ 46%]
tests/test_external_plugins.py::test_float_parameter_valdation[CHOWTapeModel.vst3-flutter_rate] PASSED                          [ 47%]
tests/test_external_plugins.py::test_float_parameter_valdation[CHOWTapeModel.vst3-flutter_depth] PASSED                         [ 47%]
tests/test_external_plugins.py::test_float_parameter_valdation[CHOWTapeModel.vst3-wow_rate] PASSED                              [ 47%]
tests/test_external_plugins.py::test_float_parameter_valdation[CHOWTapeModel.vst3-wow_depth] PASSED                             [ 48%]
tests/test_external_plugins.py::test_float_parameter_valdation[CHOWTapeModel.vst3-wow_variance] PASSED                          [ 48%]
tests/test_external_plugins.py::test_float_parameter_valdation[CHOWTapeModel.vst3-wow_drift] PASSED                             [ 49%]
tests/test_external_plugins.py::test_float_parameter_valdation[CHOWTapeModel.vst3-degrade_depth] PASSED                         [ 49%]
tests/test_external_plugins.py::test_float_parameter_valdation[CHOWTapeModel.vst3-degrade_amount] PASSED                        [ 49%]
tests/test_external_plugins.py::test_float_parameter_valdation[CHOWTapeModel.vst3-degrade_variance] PASSED                      [ 50%]
tests/test_external_plugins.py::test_float_parameter_valdation[CHOWTapeModel.vst3-degrade_envelope] PASSED                      [ 50%]
tests/test_external_plugins.py::test_float_parameter_valdation[CHOWTapeModel.vst3-chew_depth] PASSED                            [ 50%]
tests/test_external_plugins.py::test_float_parameter_valdation[CHOWTapeModel.vst3-chew_freq] PASSED                             [ 51%]
tests/test_external_plugins.py::test_float_parameter_valdation[CHOWTapeModel.vst3-chew_variance] PASSED                         [ 51%]
tests/test_external_plugins.py::test_str_parameters[CHOWTapeModel.vst3-input_low_cut] PASSED                                    [ 52%]
tests/test_external_plugins.py::test_str_parameters[CHOWTapeModel.vst3-input_high_cut] PASSED                                   [ 52%]
tests/test_external_plugins.py::test_str_parameters[CHOWTapeModel.vst3-tone_transition_frequency] PASSED                        [ 52%]
tests/test_external_plugins.py::test_str_parameters[CHOWTapeModel.vst3-tape_mode] PASSED                                        [ 53%]
tests/test_external_plugins.py::test_str_parameters[CHOWTapeModel.vst3-mix_group] PASSED                                        [ 53%]
tests/test_external_plugins.py::test_str_parameters[CHOWTapeModel.vst3-program] PASSED                                          [ 53%]
tests/test_external_plugins.py::test_string_parameter_valdation[CHOWTapeModel.vst3-input_low_cut] PASSED                        [ 54%]
tests/test_external_plugins.py::test_string_parameter_valdation[CHOWTapeModel.vst3-input_high_cut] PASSED                       [ 54%]
tests/test_external_plugins.py::test_string_parameter_valdation[CHOWTapeModel.vst3-tone_transition_frequency] PASSED            [ 55%]
tests/test_external_plugins.py::test_string_parameter_valdation[CHOWTapeModel.vst3-tape_mode] PASSED                            [ 55%]
tests/test_external_plugins.py::test_string_parameter_valdation[CHOWTapeModel.vst3-mix_group] PASSED                            [ 55%]
tests/test_external_plugins.py::test_string_parameter_valdation[CHOWTapeModel.vst3-program] PASSED                              [ 56%]
tests/test_external_plugins.py::test_plugin_parameters_persist_between_calls[CHOWTapeModel.vst3] PASSED                         [ 56%]
tests/test_external_plugins.py::test_plugin_parameters_persist_between_calls[CHOWTapeModel.component] FAILED                    [ 56%]
tests/test_external_plugins.py::test_plugin_state_cleared_between_invocations_by_default[CHOWTapeModel.vst3] PASSED             [ 57%]
tests/test_external_plugins.py::test_plugin_state_cleared_between_invocations_by_default[CHOWTapeModel.component] FAILED        [ 57%]
tests/test_external_plugins.py::test_plugin_state_not_cleared_between_invocations_if_reset_is_false[CHOWTapeModel.vst3] PASSED  [ 58%]
tests/test_external_plugins.py::test_plugin_state_not_cleared_between_invocations_if_reset_is_false[CHOWTapeModel.component] FAILED [ 58%]
tests/test_external_plugins.py::test_explicit_reset[CHOWTapeModel.vst3] PASSED                                                  [ 58%]
tests/test_external_plugins.py::test_explicit_reset[CHOWTapeModel.component] FAILED                                             [ 59%]
tests/test_external_plugins.py::test_explicit_reset_in_pedalboard[CHOWTapeModel.vst3] PASSED                                    [ 59%]
tests/test_external_plugins.py::test_explicit_reset_in_pedalboard[CHOWTapeModel.component] FAILED                               [ 60%]
tests/test_external_plugins.py::test_wrapped_bool[True] PASSED                                                                  [ 60%]
tests/test_external_plugins.py::test_wrapped_bool[False] PASSED                                                                 [ 60%]
tests/test_external_plugins.py::test_wrapped_bool_requires_bool PASSED                                                          [ 61%]
tests/test_filters.py::test_filter_attenutation[22050-440-HighpassFilter] PASSED                                                [ 61%]
tests/test_filters.py::test_filter_attenutation[22050-440-LowpassFilter] PASSED                                                 [ 61%]
tests/test_filters.py::test_filter_attenutation[22050-880-HighpassFilter] PASSED                                                [ 62%]
tests/test_filters.py::test_filter_attenutation[22050-880-LowpassFilter] PASSED                                                 [ 62%]
tests/test_filters.py::test_filter_attenutation[44100-440-HighpassFilter] PASSED                                                [ 63%]
tests/test_filters.py::test_filter_attenutation[44100-440-LowpassFilter] PASSED                                                 [ 63%]
tests/test_filters.py::test_filter_attenutation[44100-880-HighpassFilter] PASSED                                                [ 63%]
tests/test_filters.py::test_filter_attenutation[44100-880-LowpassFilter] PASSED                                                 [ 64%]
tests/test_filters.py::test_filter_attenutation[48000-440-HighpassFilter] PASSED                                                [ 64%]
tests/test_filters.py::test_filter_attenutation[48000-440-LowpassFilter] PASSED                                                 [ 64%]
tests/test_filters.py::test_filter_attenutation[48000-880-HighpassFilter] PASSED                                                [ 65%]
tests/test_filters.py::test_filter_attenutation[48000-880-LowpassFilter] PASSED                                                 [ 65%]
tests/test_filters.py::test_lowpass_slope[22050-880-440] PASSED                                                                 [ 66%]
tests/test_filters.py::test_lowpass_slope[22050-880-880] PASSED                                                                 [ 66%]
tests/test_filters.py::test_lowpass_slope[22050-1760-440] PASSED                                                                [ 66%]
tests/test_filters.py::test_lowpass_slope[22050-1760-880] PASSED                                                                [ 67%]
tests/test_filters.py::test_lowpass_slope[44100-880-440] PASSED                                                                 [ 67%]
tests/test_filters.py::test_lowpass_slope[44100-880-880] PASSED                                                                 [ 67%]
tests/test_filters.py::test_lowpass_slope[44100-1760-440] PASSED                                                                [ 68%]
tests/test_filters.py::test_lowpass_slope[44100-1760-880] PASSED                                                                [ 68%]
tests/test_filters.py::test_lowpass_slope[48000-880-440] PASSED                                                                 [ 69%]
tests/test_filters.py::test_lowpass_slope[48000-880-880] PASSED                                                                 [ 69%]
tests/test_filters.py::test_lowpass_slope[48000-1760-440] PASSED                                                                [ 69%]
tests/test_filters.py::test_lowpass_slope[48000-1760-880] PASSED                                                                [ 70%]
tests/test_locking.py::test_multiple_threads_using_same_plugin_instances[2] PASSED                                              [ 70%]
tests/test_locking.py::test_multiple_threads_using_same_plugin_instances[10] PASSED                                             [ 70%]
tests/test_locking.py::test_multiple_threads_using_same_plugin_instances[20] PASSED                                             [ 71%]
tests/test_memory_leaks.py::test_plugin_can_be_garbage_collected[CHOWTapeModel.vst3] PASSED                                     [ 71%]
tests/test_memory_leaks.py::test_plugin_can_be_garbage_collected[CHOWTapeModel.component] FAILED                                [ 72%]
tests/test_native_module.py::test_no_transforms[shape0] PASSED                                                                  [ 72%]
tests/test_native_module.py::test_no_transforms[shape1] PASSED                                                                  [ 72%]
tests/test_native_module.py::test_no_transforms[shape2] PASSED                                                                  [ 73%]
tests/test_native_module.py::test_no_transforms[shape3] PASSED                                                                  [ 73%]
tests/test_native_module.py::test_no_transforms[shape4] PASSED                                                                  [ 73%]
tests/test_native_module.py::test_noise_gain[shape0] PASSED                                                                     [ 74%]
tests/test_native_module.py::test_noise_gain[shape1] PASSED                                                                     [ 74%]
tests/test_native_module.py::test_noise_gain[shape2] PASSED                                                                     [ 75%]
tests/test_native_module.py::test_noise_gain[shape3] PASSED                                                                     [ 75%]
tests/test_native_module.py::test_noise_gain[shape4] PASSED                                                                     [ 75%]
tests/test_native_module.py::test_throw_on_invalid_compressor_ratio PASSED                                                      [ 76%]
tests/test_native_module.py::test_convolution_file_exists PASSED                                                                [ 76%]
tests/test_native_module.py::test_convolution_works PASSED                                                                      [ 76%]
tests/test_native_module.py::test_throw_on_inaccessible_convolution_file PASSED                                                 [ 77%]
tests/test_native_module.py::test_distortion[shape0--12] PASSED                                                                 [ 77%]
tests/test_native_module.py::test_distortion[shape0--6] PASSED                                                                  [ 78%]
tests/test_native_module.py::test_distortion[shape0-0] PASSED                                                                   [ 78%]
tests/test_native_module.py::test_distortion[shape0-1.1] PASSED                                                                 [ 78%]
tests/test_native_module.py::test_distortion[shape0-6] PASSED                                                                   [ 79%]
tests/test_native_module.py::test_distortion[shape0-12] PASSED                                                                  [ 79%]
tests/test_native_module.py::test_distortion[shape0-24] PASSED                                                                  [ 80%]
tests/test_native_module.py::test_distortion[shape0-48] PASSED                                                                  [ 80%]
tests/test_native_module.py::test_distortion[shape0-96] PASSED                                                                  [ 80%]
tests/test_native_module.py::test_distortion[shape1--12] PASSED                                                                 [ 81%]
tests/test_native_module.py::test_distortion[shape1--6] PASSED                                                                  [ 81%]
tests/test_native_module.py::test_distortion[shape1-0] PASSED                                                                   [ 81%]
tests/test_native_module.py::test_distortion[shape1-1.1] PASSED                                                                 [ 82%]
tests/test_native_module.py::test_distortion[shape1-6] PASSED                                                                   [ 82%]
tests/test_native_module.py::test_distortion[shape1-12] PASSED                                                                  [ 83%]
tests/test_native_module.py::test_distortion[shape1-24] PASSED                                                                  [ 83%]
tests/test_native_module.py::test_distortion[shape1-48] PASSED                                                                  [ 83%]
tests/test_native_module.py::test_distortion[shape1-96] PASSED                                                                  [ 84%]
tests/test_native_module.py::test_distortion[shape2--12] PASSED                                                                 [ 84%]
tests/test_native_module.py::test_distortion[shape2--6] PASSED                                                                  [ 84%]
tests/test_native_module.py::test_distortion[shape2-0] PASSED                                                                   [ 85%]
tests/test_native_module.py::test_distortion[shape2-1.1] PASSED                                                                 [ 85%]
tests/test_native_module.py::test_distortion[shape2-6] PASSED                                                                   [ 86%]
tests/test_native_module.py::test_distortion[shape2-12] PASSED                                                                  [ 86%]
tests/test_native_module.py::test_distortion[shape2-24] PASSED                                                                  [ 86%]
tests/test_native_module.py::test_distortion[shape2-48] PASSED                                                                  [ 87%]
tests/test_native_module.py::test_distortion[shape2-96] PASSED                                                                  [ 87%]
tests/test_native_module.py::test_distortion[shape3--12] PASSED                                                                 [ 87%]
tests/test_native_module.py::test_distortion[shape3--6] PASSED                                                                  [ 88%]
tests/test_native_module.py::test_distortion[shape3-0] PASSED                                                                   [ 88%]
tests/test_native_module.py::test_distortion[shape3-1.1] PASSED                                                                 [ 89%]
tests/test_native_module.py::test_distortion[shape3-6] PASSED                                                                   [ 89%]
tests/test_native_module.py::test_distortion[shape3-12] PASSED                                                                  [ 89%]
tests/test_native_module.py::test_distortion[shape3-24] PASSED                                                                  [ 90%]
tests/test_native_module.py::test_distortion[shape3-48] PASSED                                                                  [ 90%]
tests/test_native_module.py::test_distortion[shape3-96] PASSED                                                                  [ 90%]
tests/test_native_module.py::test_distortion[shape4--12] PASSED                                                                 [ 91%]
tests/test_native_module.py::test_distortion[shape4--6] PASSED                                                                  [ 91%]
tests/test_native_module.py::test_distortion[shape4-0] PASSED                                                                   [ 92%]
tests/test_native_module.py::test_distortion[shape4-1.1] PASSED                                                                 [ 92%]
tests/test_native_module.py::test_distortion[shape4-6] PASSED                                                                   [ 92%]
tests/test_native_module.py::test_distortion[shape4-12] PASSED                                                                  [ 93%]
tests/test_native_module.py::test_distortion[shape4-24] PASSED                                                                  [ 93%]
tests/test_native_module.py::test_distortion[shape4-48] PASSED                                                                  [ 93%]
tests/test_native_module.py::test_distortion[shape4-96] PASSED                                                                  [ 94%]
tests/test_native_module.py::test_plugin_state_not_cleared_between_invocations[True] PASSED                                     [ 94%]
tests/test_native_module.py::test_plugin_state_not_cleared_between_invocations[False] PASSED                                    [ 95%]
tests/test_native_module.py::test_plugin_state_not_cleared_if_passed_smaller_buffer PASSED                                      [ 95%]
tests/test_python_interface.py::test_no_transforms[shape0] PASSED                                                               [ 95%]
tests/test_python_interface.py::test_no_transforms[shape1] PASSED                                                               [ 96%]
tests/test_python_interface.py::test_no_transforms[shape2] PASSED                                                               [ 96%]
tests/test_python_interface.py::test_no_transforms[shape3] PASSED                                                               [ 96%]
tests/test_python_interface.py::test_no_transforms[shape4] PASSED                                                               [ 97%]
tests/test_python_interface.py::test_fail_on_invalid_plugin PASSED                                                              [ 97%]
tests/test_python_interface.py::test_fail_on_invalid_sample_rate PASSED                                                         [ 98%]
tests/test_python_interface.py::test_fail_on_invalid_buffer_size PASSED                                                         [ 98%]
tests/test_python_interface.py::test_repr PASSED                                                                                [ 98%]
tests/test_python_interface.py::test_is_list_like PASSED                                                                        [ 99%]
tests/test_python_interface.py::test_process_validates_sample_rate PASSED                                                       [ 99%]
tests/test_tensorflow.py::test_can_be_called_in_tensorflow_data_pipeline PASSED                                                 [100%]

============================================================== FAILURES ===============================================================
________________________________________ test_at_least_one_parameter[CHOWTapeModel.component] _________________________________________

plugin_filename = 'CHOWTapeModel.component'

    @pytest.mark.parametrize("plugin_filename", AVAILABLE_PLUGINS_IN_TEST_ENVIRONMENT)
    def test_at_least_one_parameter(plugin_filename: str):
        """
        Many tests below are parametrized on the parameters of the plugin;
        if our parameter parsing code fails, those tests won't fail as
        there will just be no code to run. This works around that problem.
        """
    
>       assert get_parameters(plugin_filename)
E       AssertionError: assert {}
E        +  where {} = get_parameters('CHOWTapeModel.component')

tests/test_external_plugins.py:114: AssertionError
__________________________________________ test_initial_parameters[CHOWTapeModel.component] ___________________________________________

plugin_filename = 'CHOWTapeModel.component'

    @pytest.mark.parametrize("plugin_filename", AVAILABLE_PLUGINS_IN_TEST_ENVIRONMENT)
    def test_initial_parameters(plugin_filename: str):
        parameters = {
            k: v.min_value for k, v in get_parameters(plugin_filename).items() if v.type == float
        }
    
        # Reload the plugin, but set the initial parameters in the load call.
>       plugin = load_test_plugin(plugin_filename, parameter_values=parameters)

tests/test_external_plugins.py:124: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/test_external_plugins.py:67: in load_test_plugin
    plugin = pedalboard.load_plugin(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

args = ('/Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component',)
kwargs = {'parameter_values': {}}
exceptions = [ImportError('Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.co...ogramming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.')]
plugin_class = <class 'pedalboard.pedalboard.AudioUnitPlugin'>, tried_plugins = 'VST3Plugin or AudioUnitPlugin'

    def load_plugin(*args, **kwargs):
        if not AVAILABLE_PLUGIN_CLASSES:
            raise ImportError(
                "Pedalboard found no supported external plugin types in this installation ({}).".format(
                    platform.system()
                )
            )
        exceptions = []
        for plugin_class in AVAILABLE_PLUGIN_CLASSES:
            try:
                return plugin_class(*args, **kwargs)
            except ImportError as e:
                exceptions.append(e)
            except Exception:
                raise
        else:
            tried_plugins = ", ".join([c.__name__ for c in AVAILABLE_PLUGIN_CLASSES])
            # Good error messages are important, okay?
            if len(AVAILABLE_PLUGIN_CLASSES) > 2:
                tried_plugins = ", or ".join(tried_plugins.rsplit(", ", 1))
            else:
                tried_plugins = " or ".join(tried_plugins.rsplit(", ", 1))
>           raise ImportError(
                "Failed to load plugin as {}. Errors were:\n\t{}".format(
                    tried_plugins,
                    "\n\t".join(
                        [
                            "{}: {}".format(klass.__name__, exception)
                            for klass, exception in zip(AVAILABLE_PLUGIN_CLASSES, exceptions)
                        ]
                    ),
                )
            )
E           ImportError: Failed to load plugin as VST3Plugin or AudioUnitPlugin. Errors were:
E           	VST3Plugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.
E           	AudioUnitPlugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.

pedalboard/pedalboard.py:659: ImportError
_________________________________ test_initial_parameter_validation_missing[CHOWTapeModel.component] __________________________________

plugin_filename = 'CHOWTapeModel.component'

    @pytest.mark.parametrize("plugin_filename", AVAILABLE_PLUGINS_IN_TEST_ENVIRONMENT)
    def test_initial_parameter_validation_missing(plugin_filename: str):
        with pytest.raises(AttributeError):
>           load_test_plugin(plugin_filename, parameter_values={"missing_parameter": 123})

tests/test_external_plugins.py:153: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/test_external_plugins.py:67: in load_test_plugin
    plugin = pedalboard.load_plugin(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

args = ('/Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component',)
kwargs = {'parameter_values': {'missing_parameter': 123}}
exceptions = [ImportError('Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.co...ogramming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.')]
plugin_class = <class 'pedalboard.pedalboard.AudioUnitPlugin'>, tried_plugins = 'VST3Plugin or AudioUnitPlugin'

    def load_plugin(*args, **kwargs):
        if not AVAILABLE_PLUGIN_CLASSES:
            raise ImportError(
                "Pedalboard found no supported external plugin types in this installation ({}).".format(
                    platform.system()
                )
            )
        exceptions = []
        for plugin_class in AVAILABLE_PLUGIN_CLASSES:
            try:
                return plugin_class(*args, **kwargs)
            except ImportError as e:
                exceptions.append(e)
            except Exception:
                raise
        else:
            tried_plugins = ", ".join([c.__name__ for c in AVAILABLE_PLUGIN_CLASSES])
            # Good error messages are important, okay?
            if len(AVAILABLE_PLUGIN_CLASSES) > 2:
                tried_plugins = ", or ".join(tried_plugins.rsplit(", ", 1))
            else:
                tried_plugins = " or ".join(tried_plugins.rsplit(", ", 1))
>           raise ImportError(
                "Failed to load plugin as {}. Errors were:\n\t{}".format(
                    tried_plugins,
                    "\n\t".join(
                        [
                            "{}: {}".format(klass.__name__, exception)
                            for klass, exception in zip(AVAILABLE_PLUGIN_CLASSES, exceptions)
                        ]
                    ),
                )
            )
E           ImportError: Failed to load plugin as VST3Plugin or AudioUnitPlugin. Errors were:
E           	VST3Plugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.
E           	AudioUnitPlugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.

pedalboard/pedalboard.py:659: ImportError
_____________________________ test_plugin_accepts_variable_channel_count[1-48000-CHOWTapeModel.component] _____________________________

plugin_filename = 'CHOWTapeModel.component', num_channels = 1, sample_rate = 48000

    @pytest.mark.parametrize("plugin_filename", AVAILABLE_PLUGINS_IN_TEST_ENVIRONMENT)
    @pytest.mark.parametrize(
        "num_channels,sample_rate",
        [(1, 48000), (2, 48000), (1, 44100), (2, 44100), (1, 22050), (2, 22050)],
    )
    def test_plugin_accepts_variable_channel_count(
        plugin_filename: str, num_channels: int, sample_rate: float
    ):
>       plugin = load_test_plugin(plugin_filename)

tests/test_external_plugins.py:170: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/test_external_plugins.py:67: in load_test_plugin
    plugin = pedalboard.load_plugin(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

args = ('/Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component',), kwargs = {}
exceptions = [ImportError('Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.co...ogramming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.')]
plugin_class = <class 'pedalboard.pedalboard.AudioUnitPlugin'>, tried_plugins = 'VST3Plugin or AudioUnitPlugin'

    def load_plugin(*args, **kwargs):
        if not AVAILABLE_PLUGIN_CLASSES:
            raise ImportError(
                "Pedalboard found no supported external plugin types in this installation ({}).".format(
                    platform.system()
                )
            )
        exceptions = []
        for plugin_class in AVAILABLE_PLUGIN_CLASSES:
            try:
                return plugin_class(*args, **kwargs)
            except ImportError as e:
                exceptions.append(e)
            except Exception:
                raise
        else:
            tried_plugins = ", ".join([c.__name__ for c in AVAILABLE_PLUGIN_CLASSES])
            # Good error messages are important, okay?
            if len(AVAILABLE_PLUGIN_CLASSES) > 2:
                tried_plugins = ", or ".join(tried_plugins.rsplit(", ", 1))
            else:
                tried_plugins = " or ".join(tried_plugins.rsplit(", ", 1))
>           raise ImportError(
                "Failed to load plugin as {}. Errors were:\n\t{}".format(
                    tried_plugins,
                    "\n\t".join(
                        [
                            "{}: {}".format(klass.__name__, exception)
                            for klass, exception in zip(AVAILABLE_PLUGIN_CLASSES, exceptions)
                        ]
                    ),
                )
            )
E           ImportError: Failed to load plugin as VST3Plugin or AudioUnitPlugin. Errors were:
E           	VST3Plugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.
E           	AudioUnitPlugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.

pedalboard/pedalboard.py:659: ImportError
_____________________________ test_plugin_accepts_variable_channel_count[2-48000-CHOWTapeModel.component] _____________________________

plugin_filename = 'CHOWTapeModel.component', num_channels = 2, sample_rate = 48000

    @pytest.mark.parametrize("plugin_filename", AVAILABLE_PLUGINS_IN_TEST_ENVIRONMENT)
    @pytest.mark.parametrize(
        "num_channels,sample_rate",
        [(1, 48000), (2, 48000), (1, 44100), (2, 44100), (1, 22050), (2, 22050)],
    )
    def test_plugin_accepts_variable_channel_count(
        plugin_filename: str, num_channels: int, sample_rate: float
    ):
>       plugin = load_test_plugin(plugin_filename)

tests/test_external_plugins.py:170: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/test_external_plugins.py:67: in load_test_plugin
    plugin = pedalboard.load_plugin(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

args = ('/Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component',), kwargs = {}
exceptions = [ImportError('Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.co...ogramming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.')]
plugin_class = <class 'pedalboard.pedalboard.AudioUnitPlugin'>, tried_plugins = 'VST3Plugin or AudioUnitPlugin'

    def load_plugin(*args, **kwargs):
        if not AVAILABLE_PLUGIN_CLASSES:
            raise ImportError(
                "Pedalboard found no supported external plugin types in this installation ({}).".format(
                    platform.system()
                )
            )
        exceptions = []
        for plugin_class in AVAILABLE_PLUGIN_CLASSES:
            try:
                return plugin_class(*args, **kwargs)
            except ImportError as e:
                exceptions.append(e)
            except Exception:
                raise
        else:
            tried_plugins = ", ".join([c.__name__ for c in AVAILABLE_PLUGIN_CLASSES])
            # Good error messages are important, okay?
            if len(AVAILABLE_PLUGIN_CLASSES) > 2:
                tried_plugins = ", or ".join(tried_plugins.rsplit(", ", 1))
            else:
                tried_plugins = " or ".join(tried_plugins.rsplit(", ", 1))
>           raise ImportError(
                "Failed to load plugin as {}. Errors were:\n\t{}".format(
                    tried_plugins,
                    "\n\t".join(
                        [
                            "{}: {}".format(klass.__name__, exception)
                            for klass, exception in zip(AVAILABLE_PLUGIN_CLASSES, exceptions)
                        ]
                    ),
                )
            )
E           ImportError: Failed to load plugin as VST3Plugin or AudioUnitPlugin. Errors were:
E           	VST3Plugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.
E           	AudioUnitPlugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.

pedalboard/pedalboard.py:659: ImportError
_____________________________ test_plugin_accepts_variable_channel_count[1-44100-CHOWTapeModel.component] _____________________________

plugin_filename = 'CHOWTapeModel.component', num_channels = 1, sample_rate = 44100

    @pytest.mark.parametrize("plugin_filename", AVAILABLE_PLUGINS_IN_TEST_ENVIRONMENT)
    @pytest.mark.parametrize(
        "num_channels,sample_rate",
        [(1, 48000), (2, 48000), (1, 44100), (2, 44100), (1, 22050), (2, 22050)],
    )
    def test_plugin_accepts_variable_channel_count(
        plugin_filename: str, num_channels: int, sample_rate: float
    ):
>       plugin = load_test_plugin(plugin_filename)

tests/test_external_plugins.py:170: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/test_external_plugins.py:67: in load_test_plugin
    plugin = pedalboard.load_plugin(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

args = ('/Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component',), kwargs = {}
exceptions = [ImportError('Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.co...ogramming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.')]
plugin_class = <class 'pedalboard.pedalboard.AudioUnitPlugin'>, tried_plugins = 'VST3Plugin or AudioUnitPlugin'

    def load_plugin(*args, **kwargs):
        if not AVAILABLE_PLUGIN_CLASSES:
            raise ImportError(
                "Pedalboard found no supported external plugin types in this installation ({}).".format(
                    platform.system()
                )
            )
        exceptions = []
        for plugin_class in AVAILABLE_PLUGIN_CLASSES:
            try:
                return plugin_class(*args, **kwargs)
            except ImportError as e:
                exceptions.append(e)
            except Exception:
                raise
        else:
            tried_plugins = ", ".join([c.__name__ for c in AVAILABLE_PLUGIN_CLASSES])
            # Good error messages are important, okay?
            if len(AVAILABLE_PLUGIN_CLASSES) > 2:
                tried_plugins = ", or ".join(tried_plugins.rsplit(", ", 1))
            else:
                tried_plugins = " or ".join(tried_plugins.rsplit(", ", 1))
>           raise ImportError(
                "Failed to load plugin as {}. Errors were:\n\t{}".format(
                    tried_plugins,
                    "\n\t".join(
                        [
                            "{}: {}".format(klass.__name__, exception)
                            for klass, exception in zip(AVAILABLE_PLUGIN_CLASSES, exceptions)
                        ]
                    ),
                )
            )
E           ImportError: Failed to load plugin as VST3Plugin or AudioUnitPlugin. Errors were:
E           	VST3Plugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.
E           	AudioUnitPlugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.

pedalboard/pedalboard.py:659: ImportError
_____________________________ test_plugin_accepts_variable_channel_count[2-44100-CHOWTapeModel.component] _____________________________

plugin_filename = 'CHOWTapeModel.component', num_channels = 2, sample_rate = 44100

    @pytest.mark.parametrize("plugin_filename", AVAILABLE_PLUGINS_IN_TEST_ENVIRONMENT)
    @pytest.mark.parametrize(
        "num_channels,sample_rate",
        [(1, 48000), (2, 48000), (1, 44100), (2, 44100), (1, 22050), (2, 22050)],
    )
    def test_plugin_accepts_variable_channel_count(
        plugin_filename: str, num_channels: int, sample_rate: float
    ):
>       plugin = load_test_plugin(plugin_filename)

tests/test_external_plugins.py:170: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/test_external_plugins.py:67: in load_test_plugin
    plugin = pedalboard.load_plugin(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

args = ('/Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component',), kwargs = {}
exceptions = [ImportError('Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.co...ogramming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.')]
plugin_class = <class 'pedalboard.pedalboard.AudioUnitPlugin'>, tried_plugins = 'VST3Plugin or AudioUnitPlugin'

    def load_plugin(*args, **kwargs):
        if not AVAILABLE_PLUGIN_CLASSES:
            raise ImportError(
                "Pedalboard found no supported external plugin types in this installation ({}).".format(
                    platform.system()
                )
            )
        exceptions = []
        for plugin_class in AVAILABLE_PLUGIN_CLASSES:
            try:
                return plugin_class(*args, **kwargs)
            except ImportError as e:
                exceptions.append(e)
            except Exception:
                raise
        else:
            tried_plugins = ", ".join([c.__name__ for c in AVAILABLE_PLUGIN_CLASSES])
            # Good error messages are important, okay?
            if len(AVAILABLE_PLUGIN_CLASSES) > 2:
                tried_plugins = ", or ".join(tried_plugins.rsplit(", ", 1))
            else:
                tried_plugins = " or ".join(tried_plugins.rsplit(", ", 1))
>           raise ImportError(
                "Failed to load plugin as {}. Errors were:\n\t{}".format(
                    tried_plugins,
                    "\n\t".join(
                        [
                            "{}: {}".format(klass.__name__, exception)
                            for klass, exception in zip(AVAILABLE_PLUGIN_CLASSES, exceptions)
                        ]
                    ),
                )
            )
E           ImportError: Failed to load plugin as VST3Plugin or AudioUnitPlugin. Errors were:
E           	VST3Plugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.
E           	AudioUnitPlugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.

pedalboard/pedalboard.py:659: ImportError
_____________________________ test_plugin_accepts_variable_channel_count[1-22050-CHOWTapeModel.component] _____________________________

plugin_filename = 'CHOWTapeModel.component', num_channels = 1, sample_rate = 22050

    @pytest.mark.parametrize("plugin_filename", AVAILABLE_PLUGINS_IN_TEST_ENVIRONMENT)
    @pytest.mark.parametrize(
        "num_channels,sample_rate",
        [(1, 48000), (2, 48000), (1, 44100), (2, 44100), (1, 22050), (2, 22050)],
    )
    def test_plugin_accepts_variable_channel_count(
        plugin_filename: str, num_channels: int, sample_rate: float
    ):
>       plugin = load_test_plugin(plugin_filename)

tests/test_external_plugins.py:170: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/test_external_plugins.py:67: in load_test_plugin
    plugin = pedalboard.load_plugin(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

args = ('/Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component',), kwargs = {}
exceptions = [ImportError('Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.co...ogramming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.')]
plugin_class = <class 'pedalboard.pedalboard.AudioUnitPlugin'>, tried_plugins = 'VST3Plugin or AudioUnitPlugin'

    def load_plugin(*args, **kwargs):
        if not AVAILABLE_PLUGIN_CLASSES:
            raise ImportError(
                "Pedalboard found no supported external plugin types in this installation ({}).".format(
                    platform.system()
                )
            )
        exceptions = []
        for plugin_class in AVAILABLE_PLUGIN_CLASSES:
            try:
                return plugin_class(*args, **kwargs)
            except ImportError as e:
                exceptions.append(e)
            except Exception:
                raise
        else:
            tried_plugins = ", ".join([c.__name__ for c in AVAILABLE_PLUGIN_CLASSES])
            # Good error messages are important, okay?
            if len(AVAILABLE_PLUGIN_CLASSES) > 2:
                tried_plugins = ", or ".join(tried_plugins.rsplit(", ", 1))
            else:
                tried_plugins = " or ".join(tried_plugins.rsplit(", ", 1))
>           raise ImportError(
                "Failed to load plugin as {}. Errors were:\n\t{}".format(
                    tried_plugins,
                    "\n\t".join(
                        [
                            "{}: {}".format(klass.__name__, exception)
                            for klass, exception in zip(AVAILABLE_PLUGIN_CLASSES, exceptions)
                        ]
                    ),
                )
            )
E           ImportError: Failed to load plugin as VST3Plugin or AudioUnitPlugin. Errors were:
E           	VST3Plugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.
E           	AudioUnitPlugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.

pedalboard/pedalboard.py:659: ImportError
_____________________________ test_plugin_accepts_variable_channel_count[2-22050-CHOWTapeModel.component] _____________________________

plugin_filename = 'CHOWTapeModel.component', num_channels = 2, sample_rate = 22050

    @pytest.mark.parametrize("plugin_filename", AVAILABLE_PLUGINS_IN_TEST_ENVIRONMENT)
    @pytest.mark.parametrize(
        "num_channels,sample_rate",
        [(1, 48000), (2, 48000), (1, 44100), (2, 44100), (1, 22050), (2, 22050)],
    )
    def test_plugin_accepts_variable_channel_count(
        plugin_filename: str, num_channels: int, sample_rate: float
    ):
>       plugin = load_test_plugin(plugin_filename)

tests/test_external_plugins.py:170: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/test_external_plugins.py:67: in load_test_plugin
    plugin = pedalboard.load_plugin(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

args = ('/Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component',), kwargs = {}
exceptions = [ImportError('Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.co...ogramming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.')]
plugin_class = <class 'pedalboard.pedalboard.AudioUnitPlugin'>, tried_plugins = 'VST3Plugin or AudioUnitPlugin'

    def load_plugin(*args, **kwargs):
        if not AVAILABLE_PLUGIN_CLASSES:
            raise ImportError(
                "Pedalboard found no supported external plugin types in this installation ({}).".format(
                    platform.system()
                )
            )
        exceptions = []
        for plugin_class in AVAILABLE_PLUGIN_CLASSES:
            try:
                return plugin_class(*args, **kwargs)
            except ImportError as e:
                exceptions.append(e)
            except Exception:
                raise
        else:
            tried_plugins = ", ".join([c.__name__ for c in AVAILABLE_PLUGIN_CLASSES])
            # Good error messages are important, okay?
            if len(AVAILABLE_PLUGIN_CLASSES) > 2:
                tried_plugins = ", or ".join(tried_plugins.rsplit(", ", 1))
            else:
                tried_plugins = " or ".join(tried_plugins.rsplit(", ", 1))
>           raise ImportError(
                "Failed to load plugin as {}. Errors were:\n\t{}".format(
                    tried_plugins,
                    "\n\t".join(
                        [
                            "{}: {}".format(klass.__name__, exception)
                            for klass, exception in zip(AVAILABLE_PLUGIN_CLASSES, exceptions)
                        ]
                    ),
                )
            )
E           ImportError: Failed to load plugin as VST3Plugin or AudioUnitPlugin. Errors were:
E           	VST3Plugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.
E           	AudioUnitPlugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.

pedalboard/pedalboard.py:659: ImportError
________________________ test_plugin_accepts_variable_channel_count_without_reloading[CHOWTapeModel.component] ________________________

plugin_filename = 'CHOWTapeModel.component'

    @pytest.mark.parametrize("plugin_filename", AVAILABLE_PLUGINS_IN_TEST_ENVIRONMENT)
    def test_plugin_accepts_variable_channel_count_without_reloading(plugin_filename: str):
>       plugin = load_test_plugin(plugin_filename)

tests/test_external_plugins.py:182: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/test_external_plugins.py:67: in load_test_plugin
    plugin = pedalboard.load_plugin(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

args = ('/Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component',), kwargs = {}
exceptions = [ImportError('Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.co...ogramming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.')]
plugin_class = <class 'pedalboard.pedalboard.AudioUnitPlugin'>, tried_plugins = 'VST3Plugin or AudioUnitPlugin'

    def load_plugin(*args, **kwargs):
        if not AVAILABLE_PLUGIN_CLASSES:
            raise ImportError(
                "Pedalboard found no supported external plugin types in this installation ({}).".format(
                    platform.system()
                )
            )
        exceptions = []
        for plugin_class in AVAILABLE_PLUGIN_CLASSES:
            try:
                return plugin_class(*args, **kwargs)
            except ImportError as e:
                exceptions.append(e)
            except Exception:
                raise
        else:
            tried_plugins = ", ".join([c.__name__ for c in AVAILABLE_PLUGIN_CLASSES])
            # Good error messages are important, okay?
            if len(AVAILABLE_PLUGIN_CLASSES) > 2:
                tried_plugins = ", or ".join(tried_plugins.rsplit(", ", 1))
            else:
                tried_plugins = " or ".join(tried_plugins.rsplit(", ", 1))
>           raise ImportError(
                "Failed to load plugin as {}. Errors were:\n\t{}".format(
                    tried_plugins,
                    "\n\t".join(
                        [
                            "{}: {}".format(klass.__name__, exception)
                            for klass, exception in zip(AVAILABLE_PLUGIN_CLASSES, exceptions)
                        ]
                    ),
                )
            )
E           ImportError: Failed to load plugin as VST3Plugin or AudioUnitPlugin. Errors were:
E           	VST3Plugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.
E           	AudioUnitPlugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.

pedalboard/pedalboard.py:659: ImportError
______________________________ test_all_parameters_are_accessible_as_properties[CHOWTapeModel.component] ______________________________

plugin_filename = 'CHOWTapeModel.component'

    @pytest.mark.parametrize("plugin_filename", AVAILABLE_PLUGINS_IN_TEST_ENVIRONMENT)
    def test_all_parameters_are_accessible_as_properties(plugin_filename: str):
>       plugin = load_test_plugin(plugin_filename)

tests/test_external_plugins.py:202: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/test_external_plugins.py:67: in load_test_plugin
    plugin = pedalboard.load_plugin(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

args = ('/Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component',), kwargs = {}
exceptions = [ImportError('Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.co...ogramming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.')]
plugin_class = <class 'pedalboard.pedalboard.AudioUnitPlugin'>, tried_plugins = 'VST3Plugin or AudioUnitPlugin'

    def load_plugin(*args, **kwargs):
        if not AVAILABLE_PLUGIN_CLASSES:
            raise ImportError(
                "Pedalboard found no supported external plugin types in this installation ({}).".format(
                    platform.system()
                )
            )
        exceptions = []
        for plugin_class in AVAILABLE_PLUGIN_CLASSES:
            try:
                return plugin_class(*args, **kwargs)
            except ImportError as e:
                exceptions.append(e)
            except Exception:
                raise
        else:
            tried_plugins = ", ".join([c.__name__ for c in AVAILABLE_PLUGIN_CLASSES])
            # Good error messages are important, okay?
            if len(AVAILABLE_PLUGIN_CLASSES) > 2:
                tried_plugins = ", or ".join(tried_plugins.rsplit(", ", 1))
            else:
                tried_plugins = " or ".join(tried_plugins.rsplit(", ", 1))
>           raise ImportError(
                "Failed to load plugin as {}. Errors were:\n\t{}".format(
                    tried_plugins,
                    "\n\t".join(
                        [
                            "{}: {}".format(klass.__name__, exception)
                            for klass, exception in zip(AVAILABLE_PLUGIN_CLASSES, exceptions)
                        ]
                    ),
                )
            )
E           ImportError: Failed to load plugin as VST3Plugin or AudioUnitPlugin. Errors were:
E           	VST3Plugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.
E           	AudioUnitPlugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.

pedalboard/pedalboard.py:659: ImportError
________________________________ test_parameters_cant_be_assigned_to_directly[CHOWTapeModel.component] ________________________________

plugin_filename = 'CHOWTapeModel.component'

    @pytest.mark.parametrize("plugin_filename", AVAILABLE_PLUGINS_IN_TEST_ENVIRONMENT)
    def test_parameters_cant_be_assigned_to_directly(plugin_filename: str):
>       plugin = load_test_plugin(plugin_filename)

tests/test_external_plugins.py:210: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/test_external_plugins.py:67: in load_test_plugin
    plugin = pedalboard.load_plugin(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

args = ('/Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component',), kwargs = {}
exceptions = [ImportError('Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.co...ogramming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.')]
plugin_class = <class 'pedalboard.pedalboard.AudioUnitPlugin'>, tried_plugins = 'VST3Plugin or AudioUnitPlugin'

    def load_plugin(*args, **kwargs):
        if not AVAILABLE_PLUGIN_CLASSES:
            raise ImportError(
                "Pedalboard found no supported external plugin types in this installation ({}).".format(
                    platform.system()
                )
            )
        exceptions = []
        for plugin_class in AVAILABLE_PLUGIN_CLASSES:
            try:
                return plugin_class(*args, **kwargs)
            except ImportError as e:
                exceptions.append(e)
            except Exception:
                raise
        else:
            tried_plugins = ", ".join([c.__name__ for c in AVAILABLE_PLUGIN_CLASSES])
            # Good error messages are important, okay?
            if len(AVAILABLE_PLUGIN_CLASSES) > 2:
                tried_plugins = ", or ".join(tried_plugins.rsplit(", ", 1))
            else:
                tried_plugins = " or ".join(tried_plugins.rsplit(", ", 1))
>           raise ImportError(
                "Failed to load plugin as {}. Errors were:\n\t{}".format(
                    tried_plugins,
                    "\n\t".join(
                        [
                            "{}: {}".format(klass.__name__, exception)
                            for klass, exception in zip(AVAILABLE_PLUGIN_CLASSES, exceptions)
                        ]
                    ),
                )
            )
E           ImportError: Failed to load plugin as VST3Plugin or AudioUnitPlugin. Errors were:
E           	VST3Plugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.
E           	AudioUnitPlugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.

pedalboard/pedalboard.py:659: ImportError
_____________________________________ test_all_parameters_have_accessors[CHOWTapeModel.component] _____________________________________

plugin_filename = 'CHOWTapeModel.component'

    @pytest.mark.parametrize("plugin_filename", AVAILABLE_PLUGINS_IN_TEST_ENVIRONMENT)
    def test_all_parameters_have_accessors(plugin_filename: str):
>       plugin = load_test_plugin(plugin_filename)

tests/test_external_plugins.py:220: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/test_external_plugins.py:67: in load_test_plugin
    plugin = pedalboard.load_plugin(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

args = ('/Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component',), kwargs = {}
exceptions = [ImportError('Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.co...ogramming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.')]
plugin_class = <class 'pedalboard.pedalboard.AudioUnitPlugin'>, tried_plugins = 'VST3Plugin or AudioUnitPlugin'

    def load_plugin(*args, **kwargs):
        if not AVAILABLE_PLUGIN_CLASSES:
            raise ImportError(
                "Pedalboard found no supported external plugin types in this installation ({}).".format(
                    platform.system()
                )
            )
        exceptions = []
        for plugin_class in AVAILABLE_PLUGIN_CLASSES:
            try:
                return plugin_class(*args, **kwargs)
            except ImportError as e:
                exceptions.append(e)
            except Exception:
                raise
        else:
            tried_plugins = ", ".join([c.__name__ for c in AVAILABLE_PLUGIN_CLASSES])
            # Good error messages are important, okay?
            if len(AVAILABLE_PLUGIN_CLASSES) > 2:
                tried_plugins = ", or ".join(tried_plugins.rsplit(", ", 1))
            else:
                tried_plugins = " or ".join(tried_plugins.rsplit(", ", 1))
>           raise ImportError(
                "Failed to load plugin as {}. Errors were:\n\t{}".format(
                    tried_plugins,
                    "\n\t".join(
                        [
                            "{}: {}".format(klass.__name__, exception)
                            for klass, exception in zip(AVAILABLE_PLUGIN_CLASSES, exceptions)
                        ]
                    ),
                )
            )
E           ImportError: Failed to load plugin as VST3Plugin or AudioUnitPlugin. Errors were:
E           	VST3Plugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.
E           	AudioUnitPlugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.

pedalboard/pedalboard.py:659: ImportError
___________________________________________ test_attributes_proxy[CHOWTapeModel.component] ____________________________________________

plugin_filename = 'CHOWTapeModel.component'

    @pytest.mark.parametrize("plugin_filename", AVAILABLE_PLUGINS_IN_TEST_ENVIRONMENT)
    def test_attributes_proxy(plugin_filename: str):
>       plugin = load_test_plugin(plugin_filename)

tests/test_external_plugins.py:234: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/test_external_plugins.py:67: in load_test_plugin
    plugin = pedalboard.load_plugin(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

args = ('/Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component',), kwargs = {}
exceptions = [ImportError('Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.co...ogramming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.')]
plugin_class = <class 'pedalboard.pedalboard.AudioUnitPlugin'>, tried_plugins = 'VST3Plugin or AudioUnitPlugin'

    def load_plugin(*args, **kwargs):
        if not AVAILABLE_PLUGIN_CLASSES:
            raise ImportError(
                "Pedalboard found no supported external plugin types in this installation ({}).".format(
                    platform.system()
                )
            )
        exceptions = []
        for plugin_class in AVAILABLE_PLUGIN_CLASSES:
            try:
                return plugin_class(*args, **kwargs)
            except ImportError as e:
                exceptions.append(e)
            except Exception:
                raise
        else:
            tried_plugins = ", ".join([c.__name__ for c in AVAILABLE_PLUGIN_CLASSES])
            # Good error messages are important, okay?
            if len(AVAILABLE_PLUGIN_CLASSES) > 2:
                tried_plugins = ", or ".join(tried_plugins.rsplit(", ", 1))
            else:
                tried_plugins = " or ".join(tried_plugins.rsplit(", ", 1))
>           raise ImportError(
                "Failed to load plugin as {}. Errors were:\n\t{}".format(
                    tried_plugins,
                    "\n\t".join(
                        [
                            "{}: {}".format(klass.__name__, exception)
                            for klass, exception in zip(AVAILABLE_PLUGIN_CLASSES, exceptions)
                        ]
                    ),
                )
            )
E           ImportError: Failed to load plugin as VST3Plugin or AudioUnitPlugin. Errors were:
E           	VST3Plugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.
E           	AudioUnitPlugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.

pedalboard/pedalboard.py:659: ImportError
________________________________ test_plugin_parameters_persist_between_calls[CHOWTapeModel.component] ________________________________

plugin_filename = 'CHOWTapeModel.component'

    @pytest.mark.parametrize("plugin_filename", AVAILABLE_PLUGINS_IN_TEST_ENVIRONMENT)
    def test_plugin_parameters_persist_between_calls(plugin_filename: str):
>       plugin = load_test_plugin(plugin_filename)

tests/test_external_plugins.py:383: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/test_external_plugins.py:67: in load_test_plugin
    plugin = pedalboard.load_plugin(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

args = ('/Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component',), kwargs = {}
exceptions = [ImportError('Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.co...ogramming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.')]
plugin_class = <class 'pedalboard.pedalboard.AudioUnitPlugin'>, tried_plugins = 'VST3Plugin or AudioUnitPlugin'

    def load_plugin(*args, **kwargs):
        if not AVAILABLE_PLUGIN_CLASSES:
            raise ImportError(
                "Pedalboard found no supported external plugin types in this installation ({}).".format(
                    platform.system()
                )
            )
        exceptions = []
        for plugin_class in AVAILABLE_PLUGIN_CLASSES:
            try:
                return plugin_class(*args, **kwargs)
            except ImportError as e:
                exceptions.append(e)
            except Exception:
                raise
        else:
            tried_plugins = ", ".join([c.__name__ for c in AVAILABLE_PLUGIN_CLASSES])
            # Good error messages are important, okay?
            if len(AVAILABLE_PLUGIN_CLASSES) > 2:
                tried_plugins = ", or ".join(tried_plugins.rsplit(", ", 1))
            else:
                tried_plugins = " or ".join(tried_plugins.rsplit(", ", 1))
>           raise ImportError(
                "Failed to load plugin as {}. Errors were:\n\t{}".format(
                    tried_plugins,
                    "\n\t".join(
                        [
                            "{}: {}".format(klass.__name__, exception)
                            for klass, exception in zip(AVAILABLE_PLUGIN_CLASSES, exceptions)
                        ]
                    ),
                )
            )
E           ImportError: Failed to load plugin as VST3Plugin or AudioUnitPlugin. Errors were:
E           	VST3Plugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.
E           	AudioUnitPlugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.

pedalboard/pedalboard.py:659: ImportError
__________________________ test_plugin_state_cleared_between_invocations_by_default[CHOWTapeModel.component] __________________________

plugin_filename = 'CHOWTapeModel.component'

    @pytest.mark.parametrize("plugin_filename", AVAILABLE_PLUGINS_IN_TEST_ENVIRONMENT)
    def test_plugin_state_cleared_between_invocations_by_default(plugin_filename: str):
>       plugin = load_test_plugin(plugin_filename, disable_caching=True)

tests/test_external_plugins.py:427: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/test_external_plugins.py:67: in load_test_plugin
    plugin = pedalboard.load_plugin(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

args = ('/Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component',), kwargs = {}
exceptions = [ImportError('Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.co...ogramming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.')]
plugin_class = <class 'pedalboard.pedalboard.AudioUnitPlugin'>, tried_plugins = 'VST3Plugin or AudioUnitPlugin'

    def load_plugin(*args, **kwargs):
        if not AVAILABLE_PLUGIN_CLASSES:
            raise ImportError(
                "Pedalboard found no supported external plugin types in this installation ({}).".format(
                    platform.system()
                )
            )
        exceptions = []
        for plugin_class in AVAILABLE_PLUGIN_CLASSES:
            try:
                return plugin_class(*args, **kwargs)
            except ImportError as e:
                exceptions.append(e)
            except Exception:
                raise
        else:
            tried_plugins = ", ".join([c.__name__ for c in AVAILABLE_PLUGIN_CLASSES])
            # Good error messages are important, okay?
            if len(AVAILABLE_PLUGIN_CLASSES) > 2:
                tried_plugins = ", or ".join(tried_plugins.rsplit(", ", 1))
            else:
                tried_plugins = " or ".join(tried_plugins.rsplit(", ", 1))
>           raise ImportError(
                "Failed to load plugin as {}. Errors were:\n\t{}".format(
                    tried_plugins,
                    "\n\t".join(
                        [
                            "{}: {}".format(klass.__name__, exception)
                            for klass, exception in zip(AVAILABLE_PLUGIN_CLASSES, exceptions)
                        ]
                    ),
                )
            )
E           ImportError: Failed to load plugin as VST3Plugin or AudioUnitPlugin. Errors were:
E           	VST3Plugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.
E           	AudioUnitPlugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.

pedalboard/pedalboard.py:659: ImportError
____________________ test_plugin_state_not_cleared_between_invocations_if_reset_is_false[CHOWTapeModel.component] _____________________

plugin_filename = 'CHOWTapeModel.component'

    @pytest.mark.parametrize("plugin_filename", AVAILABLE_PLUGINS_IN_TEST_ENVIRONMENT)
    def test_plugin_state_not_cleared_between_invocations_if_reset_is_false(plugin_filename: str):
>       plugin = load_test_plugin(plugin_filename, disable_caching=True)

tests/test_external_plugins.py:444: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/test_external_plugins.py:67: in load_test_plugin
    plugin = pedalboard.load_plugin(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

args = ('/Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component',), kwargs = {}
exceptions = [ImportError('Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.co...ogramming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.')]
plugin_class = <class 'pedalboard.pedalboard.AudioUnitPlugin'>, tried_plugins = 'VST3Plugin or AudioUnitPlugin'

    def load_plugin(*args, **kwargs):
        if not AVAILABLE_PLUGIN_CLASSES:
            raise ImportError(
                "Pedalboard found no supported external plugin types in this installation ({}).".format(
                    platform.system()
                )
            )
        exceptions = []
        for plugin_class in AVAILABLE_PLUGIN_CLASSES:
            try:
                return plugin_class(*args, **kwargs)
            except ImportError as e:
                exceptions.append(e)
            except Exception:
                raise
        else:
            tried_plugins = ", ".join([c.__name__ for c in AVAILABLE_PLUGIN_CLASSES])
            # Good error messages are important, okay?
            if len(AVAILABLE_PLUGIN_CLASSES) > 2:
                tried_plugins = ", or ".join(tried_plugins.rsplit(", ", 1))
            else:
                tried_plugins = " or ".join(tried_plugins.rsplit(", ", 1))
>           raise ImportError(
                "Failed to load plugin as {}. Errors were:\n\t{}".format(
                    tried_plugins,
                    "\n\t".join(
                        [
                            "{}: {}".format(klass.__name__, exception)
                            for klass, exception in zip(AVAILABLE_PLUGIN_CLASSES, exceptions)
                        ]
                    ),
                )
            )
E           ImportError: Failed to load plugin as VST3Plugin or AudioUnitPlugin. Errors were:
E           	VST3Plugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.
E           	AudioUnitPlugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.

pedalboard/pedalboard.py:659: ImportError
____________________________________________ test_explicit_reset[CHOWTapeModel.component] _____________________________________________

plugin_filename = 'CHOWTapeModel.component'

    @pytest.mark.parametrize("plugin_filename", AVAILABLE_PLUGINS_IN_TEST_ENVIRONMENT)
    def test_explicit_reset(plugin_filename: str):
>       plugin = load_test_plugin(plugin_filename, disable_caching=True)

tests/test_external_plugins.py:459: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/test_external_plugins.py:67: in load_test_plugin
    plugin = pedalboard.load_plugin(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

args = ('/Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component',), kwargs = {}
exceptions = [ImportError('Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.co...ogramming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.')]
plugin_class = <class 'pedalboard.pedalboard.AudioUnitPlugin'>, tried_plugins = 'VST3Plugin or AudioUnitPlugin'

    def load_plugin(*args, **kwargs):
        if not AVAILABLE_PLUGIN_CLASSES:
            raise ImportError(
                "Pedalboard found no supported external plugin types in this installation ({}).".format(
                    platform.system()
                )
            )
        exceptions = []
        for plugin_class in AVAILABLE_PLUGIN_CLASSES:
            try:
                return plugin_class(*args, **kwargs)
            except ImportError as e:
                exceptions.append(e)
            except Exception:
                raise
        else:
            tried_plugins = ", ".join([c.__name__ for c in AVAILABLE_PLUGIN_CLASSES])
            # Good error messages are important, okay?
            if len(AVAILABLE_PLUGIN_CLASSES) > 2:
                tried_plugins = ", or ".join(tried_plugins.rsplit(", ", 1))
            else:
                tried_plugins = " or ".join(tried_plugins.rsplit(", ", 1))
>           raise ImportError(
                "Failed to load plugin as {}. Errors were:\n\t{}".format(
                    tried_plugins,
                    "\n\t".join(
                        [
                            "{}: {}".format(klass.__name__, exception)
                            for klass, exception in zip(AVAILABLE_PLUGIN_CLASSES, exceptions)
                        ]
                    ),
                )
            )
E           ImportError: Failed to load plugin as VST3Plugin or AudioUnitPlugin. Errors were:
E           	VST3Plugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.
E           	AudioUnitPlugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.

pedalboard/pedalboard.py:659: ImportError
_____________________________________ test_explicit_reset_in_pedalboard[CHOWTapeModel.component] ______________________________________

plugin_filename = 'CHOWTapeModel.component'

    @pytest.mark.parametrize("plugin_filename", AVAILABLE_PLUGINS_IN_TEST_ENVIRONMENT)
    def test_explicit_reset_in_pedalboard(plugin_filename: str):
        sr = 44100
>       board = pedalboard.Pedalboard([load_test_plugin(plugin_filename, disable_caching=True)], sr)

tests/test_external_plugins.py:476: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/test_external_plugins.py:67: in load_test_plugin
    plugin = pedalboard.load_plugin(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

args = ('/Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component',), kwargs = {}
exceptions = [ImportError('Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.co...ogramming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.')]
plugin_class = <class 'pedalboard.pedalboard.AudioUnitPlugin'>, tried_plugins = 'VST3Plugin or AudioUnitPlugin'

    def load_plugin(*args, **kwargs):
        if not AVAILABLE_PLUGIN_CLASSES:
            raise ImportError(
                "Pedalboard found no supported external plugin types in this installation ({}).".format(
                    platform.system()
                )
            )
        exceptions = []
        for plugin_class in AVAILABLE_PLUGIN_CLASSES:
            try:
                return plugin_class(*args, **kwargs)
            except ImportError as e:
                exceptions.append(e)
            except Exception:
                raise
        else:
            tried_plugins = ", ".join([c.__name__ for c in AVAILABLE_PLUGIN_CLASSES])
            # Good error messages are important, okay?
            if len(AVAILABLE_PLUGIN_CLASSES) > 2:
                tried_plugins = ", or ".join(tried_plugins.rsplit(", ", 1))
            else:
                tried_plugins = " or ".join(tried_plugins.rsplit(", ", 1))
>           raise ImportError(
                "Failed to load plugin as {}. Errors were:\n\t{}".format(
                    tried_plugins,
                    "\n\t".join(
                        [
                            "{}: {}".format(klass.__name__, exception)
                            for klass, exception in zip(AVAILABLE_PLUGIN_CLASSES, exceptions)
                        ]
                    ),
                )
            )
E           ImportError: Failed to load plugin as VST3Plugin or AudioUnitPlugin. Errors were:
E           	VST3Plugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.
E           	AudioUnitPlugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.

pedalboard/pedalboard.py:659: ImportError
____________________________________ test_plugin_can_be_garbage_collected[CHOWTapeModel.component] ____________________________________

plugin_path = 'CHOWTapeModel.component'

    @pytest.mark.parametrize("plugin_path", AVAILABLE_PLUGINS_IN_TEST_ENVIRONMENT)
    def test_plugin_can_be_garbage_collected(plugin_path: str):
        # Load a VST3 plugin from disk:
>       plugin = pedalboard.load_plugin(
            os.path.join(TEST_PLUGIN_BASE_PATH, platform.system(), plugin_path)
        )

tests/test_memory_leaks.py:31: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

args = ('/Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component',), kwargs = {}
exceptions = [ImportError('Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.co...ogramming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.')]
plugin_class = <class 'pedalboard.pedalboard.AudioUnitPlugin'>, tried_plugins = 'VST3Plugin or AudioUnitPlugin'

    def load_plugin(*args, **kwargs):
        if not AVAILABLE_PLUGIN_CLASSES:
            raise ImportError(
                "Pedalboard found no supported external plugin types in this installation ({}).".format(
                    platform.system()
                )
            )
        exceptions = []
        for plugin_class in AVAILABLE_PLUGIN_CLASSES:
            try:
                return plugin_class(*args, **kwargs)
            except ImportError as e:
                exceptions.append(e)
            except Exception:
                raise
        else:
            tried_plugins = ", ".join([c.__name__ for c in AVAILABLE_PLUGIN_CLASSES])
            # Good error messages are important, okay?
            if len(AVAILABLE_PLUGIN_CLASSES) > 2:
                tried_plugins = ", or ".join(tried_plugins.rsplit(", ", 1))
            else:
                tried_plugins = " or ".join(tried_plugins.rsplit(", ", 1))
>           raise ImportError(
                "Failed to load plugin as {}. Errors were:\n\t{}".format(
                    tried_plugins,
                    "\n\t".join(
                        [
                            "{}: {}".format(klass.__name__, exception)
                            for klass, exception in zip(AVAILABLE_PLUGIN_CLASSES, exceptions)
                        ]
                    ),
                )
            )
E           ImportError: Failed to load plugin as VST3Plugin or AudioUnitPlugin. Errors were:
E           	VST3Plugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.
E           	AudioUnitPlugin: Unable to load plugin /Users/macbook/programming/python/pedalboard/tests/plugins/Darwin/CHOWTapeModel.component: unsupported plugin format or load failure.

pedalboard/pedalboard.py:659: ImportError
========================================================== warnings summary ===========================================================
.tox/py/lib/python3.9/site-packages/_pytest/junitxml.py:436
  /Users/macbook/programming/python/pedalboard/.tox/py/lib/python3.9/site-packages/_pytest/junitxml.py:436: PytestDeprecationWarning: The 'junit_family' default value will change to 'xunit2' in pytest 6.0.
  Add 'junit_family=legacy' to your pytest.ini file to silence this warning and make your suite compatible.
    _issue_warning_captured(deprecated.JUNIT_XML_DEFAULT_FAMILY, config.hook, 2)

pedalboard/pedalboard.py:29
  /Users/macbook/programming/python/pedalboard/pedalboard/pedalboard.py:29: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3, and in 3.10 it will stop working
    class Pedalboard(collections.MutableSequence):

.tox/py/lib/python3.9/site-packages/tensorflow/python/autograph/impl/api.py:22
  /Users/macbook/programming/python/pedalboard/.tox/py/lib/python3.9/site-packages/tensorflow/python/autograph/impl/api.py:22: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
    import imp

-- Docs: https://docs.pytest.org/en/latest/warnings.html
----------------------------- generated xml file: /Users/macbook/programming/python/pedalboard/junit.xml ------------------------------

---------- coverage: platform darwin, python 3.9.7-final-0 -----------
Name                       Stmts   Miss  Cover   Missing
--------------------------------------------------------
pedalboard/__init__.py         5      0   100%
pedalboard/pedalboard.py     353     31    91%   44, 75, 91, 122, 136, 182, 233, 331, 358, 373, 383-386, 394-395, 479, 486, 490, 543, 545, 553, 556, 583, 611-613, 625-631, 639, 656
pedalboard/version.py          4      0   100%
--------------------------------------------------------
TOTAL                        362     31    91%
Coverage XML written to file cobertura/coverage.xml

======================================= 20 failed, 244 passed, 1 skipped, 3 warnings in 58.60s ========================================
ERROR: InvocationError for command /Users/macbook/programming/python/pedalboard/.tox/py/bin/coverage run -m pytest (exited with code 1)
docs recreate: /Users/macbook/programming/python/pedalboard/.tox/docs
docs installdeps: -rdocs-requirements.txt
docs installed: attrs==21.2.0,click==8.0.3,colorama==0.4.4,interrogate==1.5.0,Jinja2==3.0.2,livereload==2.6.3,Markdown==3.3.4,MarkupSafe==2.0.1,mkdocs==1.0.4,py==1.10.0,PyYAML==5.4.1,six==1.16.0,tabulate==0.8.9,toml==0.10.2,tornado==6.1
docs run-test-pre: PYTHONHASHSEED='256814189'
check-formatting recreate: /Users/macbook/programming/python/pedalboard/.tox/check-formatting
check-formatting installdeps: black
check-formatting installed: black==21.9b0,click==8.0.3,mypy-extensions==0.4.3,pathspec==0.9.0,platformdirs==2.4.0,regex==2021.10.8,tomli==1.2.1,typing-extensions==3.10.0.2
check-formatting run-test-pre: PYTHONHASHSEED='256814189'
lint recreate: /Users/macbook/programming/python/pedalboard/.tox/lint
lint installdeps: flake8
lint installed: flake8==4.0.1,mccabe==0.6.1,pycodestyle==2.8.0,pyflakes==2.4.0
lint run-test-pre: PYTHONHASHSEED='256814189'
lint run-test: commands[0] | flake8
_______________________________________________________________ summary _______________________________________________________________
ERROR:   py: commands failed
  docs: commands succeeded
  check-formatting: commands succeeded
  lint: commands succeeded
(39) macbook@MacBook-Pro-di-macbook pedalboard % 

@psobot
Copy link
Member

psobot commented Oct 12, 2021

Thanks @LucaMarconato! A couple more things to try:

  • Do you happen to be running on Apple Silicon? (i.e.: an M1 Mac) The CHOWTapeModel.component plugin in the repo is compiled for x86, so I'm not entirely sure what would happen if you tried to load it on an M1 Mac.
  • If you copy CHOWTapeModel.component into ~/Library/Audio/Plug-Ins/Components/:
    • Does auvaltool -al list the plugin?
    • Does auvaltool -v aufx Jdox Chow (to run validation on the plugin) complete successfully?
    • If you have a plug-in host installed, can you see CHOWTapeModel in the list of available plug-ins?

@psobot psobot added the stale This issue is overdue for an update label Nov 22, 2021
@HussainAbdi
Copy link
Contributor

Hi again @psobot! I ran into the same issue as @LucaMarconato and thought I could help answer these questions. I am running on a M1.

  • Does auvaltool -al list the plugin?

    Yes, it is listed as aufx Jdox Chow - chowdsp: CHOWTapeModel (file:///Library/Audio/Plug-Ins/Components/CHOWTapeModel.component/)

  • Does auvaltool -v aufx Jdox Chow (to run validation on the plugin) complete successfully?

    Yes it does. It returns AU VALIDATION SUCCEEDED.

  • If you have a plug-in host installed, can you see CHOWTapeModel in the list of available plug-ins?

    I can see the plugin and use it as well!

@HussainAbdi
Copy link
Contributor

After adding CHOWTapeModel.component to ~/Library/Audio/Plug-Ins/Components/, all these component test cases pass. Not sure why, but I've left it there for now.

@HussainAbdi
Copy link
Contributor

FYI for anyone facing this issue, I had the same problem on a non-M1 MacBook Pro (2016 13-inch MBP) and it was resolved the same way as above. Adding CHOWTapeModel.component to ~/Library/Audio/Plug-Ins/Components/.

@psobot
Copy link
Member

psobot commented Dec 30, 2021

Thanks @HussainAbdi and @LucaMarconato! I'm adding a change to fix these tests and raise a more descriptive ImportError if the plugin fails to load. It seems that on M1, or in certain unknown configurations, plugins are required to be installed to ~/Library/Audio/Plug-Ins/Components or they'll fail to load.

psobot added a commit that referenced this issue Dec 30, 2021
* Fix tests when running on M1 macOS. Fixes #32.

* Add more verbose error message even if not on Apple Silicon.

* Run black.

* More pythonic test code.

* Lint.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
stale This issue is overdue for an update
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants