haskell - 为计算机音乐应用程序和 Haskell 安装 Euterpea

标签 haskell dsl euterpea

我按照这里的说明 http://www.euterpea.com用于安装 Euterpea(一种用于嵌入在 Haskell 中的计算机音乐应用程序的特定领域语言),并且我收到一条消息,指出某些软件包和东西无法安装(参见下面的代码)。如何安装剩余的软件包?

Mo-MacBook-Pro:~ Mo$ cabal update
Downloading the latest package list from hackage.haskell.org
cabal install Euterpea
To revert to previous state run:
cabal update --index-state='2018-06-25T08:34:14Z'
Mo-MacBook-Pro:~ Mo$ cabal install Euterpea
clang: warning: argument unused during compilation: '-nopie' [-Wunused-         
command-line-argument]
Resolving dependencies...
Downloading heap-1.0.4...
Downloading PortMidi-0.1.6.1...
Configuring PortMidi-0.1.6.1...
Downloading lazysmallcheck-0.6...
Configuring heap-1.0.4...
Downloading semigroups-0.18.5...
Configuring lazysmallcheck-0.6...
Configuring semigroups-0.18.5...
Building heap-1.0.4...
Building PortMidi-0.1.6.1...
Building lazysmallcheck-0.6...
Building semigroups-0.18.5...
Installed semigroups-0.18.5
Downloading stm-2.5.0.0...
Configuring stm-2.5.0.0...
Installed lazysmallcheck-0.6
Downloading HCodecs-0.5.1...
Installed heap-1.0.4
Downloading Stream-0.4.7.2...
Configuring HCodecs-0.5.1...
Configuring Stream-0.4.7.2...
Building stm-2.5.0.0...
Building HCodecs-0.5.1...
Building Stream-0.4.7.2...
Failed to install HCodecs-0.5.1
Build log ( /Users/Mo/.cabal/logs/ghc-8.4.3/HCodecs-0.5.1-    
BtnY8oBJJ5FGnsoQaqbvOm.log ):
cabal: Entering directory      
'/var/folders/dy/q51p3v595kbd8_wclmt80v700000gn/T/cabal-tmp-   
5294/HCodecs-0.5.1'
Configuring HCodecs-0.5.1...
clang: warning: argument unused during compilation: '-nopie' [-Wunused-     
command-line-argument]
Preprocessing library for HCodecs-0.5.1..
Building library for HCodecs-0.5.1..
<command line>: cannot satisfy -package-id random-1.1-    
7T1TXpwb46H1j0av1OnVaD
(use -v for more information)
cabal: Leaving directory    
'/var/folders/dy/q51p3v595kbd8_wclmt80v700000gn/T/cabal-tmp-  
5294/HCodecs-0.5.1'
Failed to install Stream-0.4.7.2
Build log ( /Users/Mo/.cabal/logs/ghc-8.4.3/Stream-0.4.7.2-    
ES6rey5IgWg9tsXDghlP7Y.log ):
cabal: Entering directory     
'/var/folders/dy/q51p3v595kbd8_wclmt80v700000gn/T/cabal-tmp-    
5295/Stream-0.4.7.2'
Warning: Stream.cabal:6:4: Tabs used as indentation at 6:4, 12:4, 13:4,    
14:4,
15:4, 16:4, 17:4
Configuring Stream-0.4.7.2...
clang: warning: argument unused during compilation: '-nopie' [-Wunused-   
command-line-argument]
Preprocessing library for Stream-0.4.7.2..
Building library for Stream-0.4.7.2..
<command line>: cannot satisfy -package-id QuickCheck-2.11.3-    
4Q6LQ7mN6Tj8otrLuHN0se
(use -v for more information)
cabal: Leaving directory    
'/var/folders/dy/q51p3v595kbd8_wclmt80v700000gn/T/cabal-tmp-    
5295/Stream-0.4.7.2'
Installed PortMidi-0.1.6.1
Installed stm-2.5.0.0
cabal: Error: some packages failed to install:
Euterpea-2.0.6-LLo28S848YneLemh6QUkK depends on Euterpea-2.0.6 which     
failed to
install.
HCodecs-0.5.1-BtnY8oBJJ5FGnsoQaqbvOm failed during the building phase.          
The
exception was:
ExitFailure 1
Stream-0.4.7.2-ES6rey5IgWg9tsXDghlP7Y failed during the building phase.     
The
exception was:
ExitFailure 1
arrows-0.4.4.2-GLke2GgDEro6Tzj3MGmTOB depends on arrows-0.4.4.2 which     
failed
to install.

如果有人可以提供帮助,那就太好了。谢谢。

我已经包含了所有代码,以免遗漏一些特定的相关细节。

编辑

我也尝试通过堆栈安装 Euterpea。我收到这条消息:
Mo-MacBook-Pro:~ Mo$ stack install Euterpea

Error: While constructing the build plan, the following exceptions were     
encountered:


In the dependencies for Euterpea-2.0.6:
PortMidi must match ==0.1.6.1, but the stack configuration has no   specified version  (latest matching version is 0.1.6.1)
arrows must match >=0.4 && <0.5, but the stack configuration has no specified version  (latest matching version is 0.4.4.2)
needed since Euterpea is a build target.

Some different approaches to resolving this:

  * Consider trying 'stack solver', which uses the cabal-install solver     to attempt to find some working build configuration. This can be convenient     when dealing with many complicated constraint
    errors, but results may be unpredictable.

  * Recommended action: try adding the following to your extra-deps in     /Users/Mo/.stack/global-project/stack.yaml:

- PortMidi-0.1.6.1
- arrows-0.4.4.2

Plan construction failed.

--
编辑 2。

如下所示,我尝试了 cabal install random-1.1 --force-reinstalls这产生了:
 clang: warning: argument unused during compilation: '-nopie' [-    Wunused-command-line-argument]
 Resolving dependencies...
 Warning: The following packages are likely to be broken by the      reinstalls:
 tf-random-0.5
 QuickCheck-2.11.3
 Continuing even though the plan contains dangerous reinstalls.
 Configuring random-1.1...
 Building random-1.1...
 Installed random-1.1

然后
 Mo-MacBook-Pro:~ Mo$ cabal install Euterpea
 clang: warning: argument unused during compilation: '-nopie' [-   Wunused-command-line-argument]
 Resolving dependencies...
 Configuring Stream-0.4.7.2...
 Configuring HCodecs-0.5.1...
 Building HCodecs-0.5.1...
 Building Stream-0.4.7.2...
 Failed to install HCodecs-0.5.1
 Build log ( /Users/lukeburke/.cabal/logs/ghc-8.4.3/HCodecs-0.5.1-    BtnY8oBJJ5FGnsoQaqbvOm.log ):
 cabal: Entering directory      '/var/folders/dy/q51p3v595kbd8_wclmt80v700000gn/T/cabal-tmp-20742/HCodecs-     0.5.1'
 Configuring HCodecs-0.5.1...
 clang: warning: argument unused during compilation: '-nopie' [-    Wunused-command-line-argument]
 Preprocessing library for HCodecs-0.5.1..
 Building library for HCodecs-0.5.1..
 <command line>: cannot satisfy -package-id random-1.1-   7T1TXpwb46H1j0av1OnVaD
     (use -v for more information)
 cabal: Leaving directory '/var/folders/dy/q51p3v595kbd8_wclmt80v700000gn/T/cabal-tmp-20742/HCodecs-  0.5.1'
 Failed to install Stream-0.4.7.2
 Build log ( /Users/Mo/.cabal/logs/ghc-8.4.3/Stream-0.4.7.2-     ES6rey5IgWg9tsXDghlP7Y.log ):
 cabal: Entering directory '/var/folders/dy/q51p3v595kbd8_wclmt80v700000gn/T/cabal-tmp-20743/Stream-  0.4.7.2'
 Warning: Stream.cabal:6:4: Tabs used as indentation at 6:4, 12:4,    13:4, 14:4,
 15:4, 16:4, 17:4
 Configuring Stream-0.4.7.2...
 clang: warning: argument unused during compilation: '-nopie' [-  Wunused-command-line-argument]
 Preprocessing library for Stream-0.4.7.2..
 Building library for Stream-0.4.7.2..
 <command line>: cannot satisfy -package-id QuickCheck-2.11.3-    4Q6LQ7mN6Tj8otrLuHN0se
(use -v for more information)
 cabal: Leaving directory   '/var/folders/dy/q51p3v595kbd8_wclmt80v700000gn/T/cabal-tmp-20743/Stream-    0.4.7.2'
 cabal: Error: some packages failed to install:
 Euterpea-2.0.6-LLo28S848YneLemh6QUkK depends on Euterpea-2.0.6 which   failed to
 install.
 HCodecs-0.5.1-BtnY8oBJJ5FGnsoQaqbvOm failed during the building phase.     The
 exception was:
 ExitFailure 1
 Stream-0.4.7.2-ES6rey5IgWg9tsXDghlP7Y failed during the building   phase. The
 exception was:
 ExitFailure 1
 arrows-0.4.4.2-GLke2GgDEro6Tzj3MGmTOB depends on arrows-0.4.4.2 which   failed
 to install.

编辑 3

下面有人建议,多个软件包被搞砸了,我应该尝试重新安装所有软件包(在一个命令中,即 cabal install random tf-random QuickCheck Euterpea --force-reinstalls

但是,如果我写 cabal install random tf-random QuickCheck Euterpea --force-reinstalls我收到以下代码:
 clang: warning: argument unused during compilation: '-nopie' [-   Wunused-command-line-argument]
 Resolving dependencies...
 Warning: The following packages are likely to be broken by the   reinstalls:
 QuickCheck-2.11.3
 Continuing even though the plan contains dangerous reinstalls.
 Downloading erf-2.0.0.0...
 Configuring random-1.1...
 Configuring erf-2.0.0.0...
 Building random-1.1...
 Building erf-2.0.0.0...
 Installed erf-2.0.0.0
 Installed random-1.1
 Downloading tf-random-0.5...
 Configuring tf-random-0.5...
 Building tf-random-0.5...
 Failed to install tf-random-0.5
Build log ( /Users/Mo/.cabal/logs/ghc-8.4.3/tf-random-0.5-  ADZoyzEXgHe6hyR0Bycce0.log ):
 cabal: Entering directory      '/var/folders/dy/q51p3v595kbd8_wclmt80v700000gn/T/cabal-tmp-21584/tf-   random-0.5'
 Configuring tf-random-0.5...
 clang: warning: argument unused during compilation: '-nopie' [-   Wunused-command-line-argument]
 Preprocessing library for tf-random-0.5..
Building library for tf-random-0.5..
 <command line>: cannot satisfy -package-id primitive-0.6.4.0-  9k41Y6ToOAE8KXK6VMGV2O
     (use -v for more information)
 cabal: Leaving directory   '/var/folders/dy/q51p3v595kbd8_wclmt80v700000gn/T/cabal-tmp-21584/tf-   random-0.5'
 cabal: Error: some packages failed to install:
 Euterpea-2.0.6-87WYqltNL8w8teqXOsc4TL depends on Euterpea-2.0.6 which    failed
 to install.
 HCodecs-0.5.1-DrGKEnNk6EBHti2goL6KP5 depends on HCodecs-0.5.1 which.  failed to
 install.
 QuickCheck-2.12.6.1-KuXpgimNOXzF2SmGPEs5LR depends on QuickCheck-  2.12.6.1
 which failed to install.
 Stream-0.4.7.2-FedzVSwUnWMDxlzmPNWt7x depends on Stream-0.4.7.2 which   failed
 to install.
 arrows-0.4.4.2-EGvZPpby4BcD99TcXDoCg4 depends on arrows-0.4.4.2 which.  failed
 to install.
 tf-random-0.5-ADZoyzEXgHe6hyR0Bycce0 failed during the building phase.   The
 exception was:
 ExitFailure 1

我该怎么做才能安装 Euterpea?

最佳答案

安装 Euterpea 软件包

这个答案使用 LTS 12.26,因为我已经验证它可以工作,但这应该适用于大多数 LTS 版本(有关详细信息,请参阅步骤 2 的底部)。

  • 创建一个新的 Stack 项目:
    stack new euter-test
    cd euter-test
    
  • 编辑 stack.yaml并将 LTS 设置为 12.26 和 extra-deps指定 LTS 中不存在但 Hackage 中存在的包的版本:
    resolver: lts-12.26
    ...
    extra-deps:
    - Euterpea-2.0.6
    - PortMidi-0.1.6.1
    - arrows-0.4.4.2
    - Stream-0.4.7.2
    - lazysmallcheck-0.6
    

    您在安装堆栈时遇到的错误(“PortMidi 必须匹配 ==0.1.6.1,但堆栈配置没有指定版本”)表明您正在使用的包需要特定版本的库,但包存储库(LTS 快照)不包含该库,因此您需要明确指定它。然后 Stack 会打印出缺少哪个库和版本,因此您可以继续尝试 stack build并添加库直到构建成功。

    我们在这里使用 LTS 12.26,但是通过添加 extra-deps如上所述的软件包,您应该能够使其在任何 LTS 上运行。
  • 编辑 package.yaml并添加 Euterpea到依赖项列表:
    dependencies:
    ...
    - Euterpea
    
  • app/Main.hs 中的一个简单测试:
    module Main where
    
    import Euterpea
    
    main :: IO ()
    main = play $ c 4 qn
    
  • 运行stack build :

    lazysmallcheck-0.6: download
    heap-1.0.4: download       
    heap-1.0.4: configure      
    HCodecs-0.5.1: download    
    PortMidi-0.1.6.1: download 
    heap-1.0.4: build          
    lazysmallcheck-0.6: configure
    lazysmallcheck-0.6: build  
    HCodecs-0.5.1: configure   
    HCodecs-0.5.1: build       
    PortMidi-0.1.6.1: configure
    heap-1.0.4: copy/register  
    lazysmallcheck-0.6: copy/register
    PortMidi-0.1.6.1: build                                          
    Stream-0.4.7.2: download                                     
    Stream-0.4.7.2: configure                                    
    Stream-0.4.7.2: build                                        
    Stream-0.4.7.2: copy/register                                
    PortMidi-0.1.6.1: copy/register                              
    arrows-0.4.4.2: download                                     
    arrows-0.4.4.2: configure                  
    arrows-0.4.4.2: build                      
    arrows-0.4.4.2: copy/register              
    HCodecs-0.5.1: copy/register               
    Euterpea-2.0.6: download    
    Euterpea-2.0.6: configure   
    Euterpea-2.0.6: build       
    Euterpea-2.0.6: copy/register
    Building all executables for `euter' once. After a successful build of all of them, only specified executables will be rebuilt.
    euter-0.1.0.0: configure (lib + exe)
    Configuring euter-0.1.0.0...
    euter-0.1.0.0: build (lib + exe)
    Preprocessing library for euter-0.1.0.0..
    Building library for euter-0.1.0.0..
    [1 of 2] Compiling Lib              ( src/Lib.hs, .stack-work/dist/x86_64-linux/Cabal-2.2.0.1/build/Lib.o )
    [2 of 2] Compiling Paths_euter      ( .stack-work/dist/x86_64-linux/Cabal-2.2.0.1/build/autogen/Paths_euter.hs, .stack-work/dist/x86_64-linux/Cabal-2.2.0.1/build/Paths_euter.o )
    Preprocessing executable 'euter-exe' for euter-0.1.0.0..
    Building executable 'euter-exe' for euter-0.1.0.0..
    [1 of 2] Compiling Main             ( app/Main.hs, .stack-work/dist/x86_64-linux/Cabal-2.2.0.1/build/euter-exe/euter-exe-tmp/Main.o )
    [2 of 2] Compiling Paths_euter      ( .stack-work/dist/x86_64-linux/Cabal-2.2.0.1/build/euter-exe/autogen/Paths_euter.hs, .stack-work/dist/x86_64-linux/Cabal-2.2.0.1/build/euter-exe/euter-exe-tmp/Paths_euter.o )
    Linking .stack-work/dist/x86_64-linux/Cabal-2.2.0.1/build/euter-exe/euter-exe ...
    
    euter-0.1.0.0: copy/register
    Installing library in <...>
    Installing executable euter-exe in <...>
    Registering library for euter-0.1.0.0..
    
  • 如果您正在运行 MIDI 合成器,则运行项目生成的可执行文件应该会发出声音:
    stack exec euter-test-exe
    


  • 疑难解答
  • 如果您收到类似 *** Exception: No MIDI outputs! 的错误,那么您没有运行 MIDI 合成器(见下文)。确保在后台运行它(例如在另一个终端中)。
  • 如果您没有收到错误但没有音频输出,请尝试运行 devices在 GHCI 中查看可用的输出,然后使用 playDev x而不是 play , 其中 x是合成器输入端口的 OutputDeviceID。例如:
    > devices
    Input devices:
      InputDeviceID 1   Midi Through Port-0
    Output devices:
      OutputDeviceID 0  Midi Through Port-0
      OutputDeviceID 2  Synth input port (25952:0)
    > playDev 2 $ c 4 qn
    
  • 如果你运行 devices并且看不到任何合成器输入端口,但是您在后台运行了流体合成器,那么您可能需要重新启动 ghci然后再试一次。


  • 运行 MIDI 合成器

    这是让 Fluidsynth 在 Debian 上运行的快速分步说明(沿途猜测 Mac 设置)。
  • 安装流体合成器:
    在 Debian 上是 sudo apt install fluidsynth , 在 mac 上可能是 brew install fluidsynth - 有很多关于如何做到这一点的文章,如果有疑问,只需谷歌即可。
  • 运行流体合成器:
    在使用 ALSA 的 Debian 上,这是
    fluidsynth -s -a alsa -m alsa_seq /usr/share/sounds/sf2/FluidR3_GM.sf2
    

    指示流体合成器在服务器模式下运行,使用 alsa作为音频驱动程序和alsa_seq作为 MIDI 驱动程序,并使用 soundfont FluidR3_GM.sf2 (应该作为流体合成器安装的一部分安装)。

    在 Mac 上,正确的命令行似乎是:
    fluidsynth -s -a coreaudio -m coremidi /usr/share/sounds/sf2/FluidR3_GM.sf2
    

    如果找不到 FluidR3_GM.sf2文件,那么它很可能已安装在不同的位置。作为最后的手段,您可以只下载一个 soundfont 文件并使用它,而不是 FluidSynth 提供的那个。

    运行这个之后,你应该会得到一个提示,也许还有一些警告,然后流体合成器就会运行。在使用 Euterpea 之前确保它正在运行,并在使用 Euterpea 时保持运行。
  • 关于haskell - 为计算机音乐应用程序和 Haskell 安装 Euterpea,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53977864/

    相关文章:

    haskell - 函数组合中的类型检查

    java - Spring集成Java DSL : Remote filter is not applied on handle method

    Groovy 删除字符串参数中的引号

    java - 从 Camel 中的 Exchange header 设置目录

    haskell - Euterpea异常:未找到MIDI输出设备

    list - 根据 Haskell 中的索引交换列表列表中的两个元素

    haskell - 用于更新树结构的透镜或箭头?

    haskell - 无法理解 GHC 有关歧义的投诉

    haskell - 为什么 `stack build` 会改变我的 .cabal 文件?