所以我想使用相对路径将声音文件加载到缓冲区中。 (我将我的东西保留在版本控制之下,并且不想对某人可能在其文件系统上克隆repo的位置做出任何假设。)
所以,我最初假设如果我提供了一个看似相对的路径,那么SC会把它解释为相对于正在执行的文件的位置:
Buffer.read(s, "Samples/HiHats1.hihat2.wav");
但SC无法找到该文件。所以我查了asAbsolutePath
并试了一下:
Buffer.read(s, "Samples/HiHats1.hihat2.wav".asAbsolutePath);
这不起作用,因为SC无法计算出我相对路径的绝对路径。
"Samples/HiHats1.hihat2.wav".asAbsolutePath
...实际上在我的文件系统上返回一个不存在的位置。乌拉!
任何人都可以就如何完成这项麻烦任务提出任何建议吗?
答案 0 :(得分:11)
SuperCollider可以很好地处理相对路径 - 就像许多软件一样,它相对于当前工作目录解析它们。通常这是相对于可执行文件而不是脚本文件,因此存在混淆。
您案例中当前的工作目录是什么?你可以通过运行找到
File.getcwd
(这是.asAbsolutePath
使用的。)cwd取决于你的操作系统 - 在某些平台上它并不是一个特别方便的默认设置。你不能完全依赖它。
在您的情况下,如果您希望相对于您的脚本或类的位置解析路径,那么您需要自己执行此操作。例如:
// Use the path of whatever file is currently executing:
var samplePath = thisProcess.nowExecutingPath.dirname +/+ "Samples/HiHats1.hihat2.wav";
// Use the path of the class file for the class you're coding
var samplePath = this.class.filenameSymbol.asString.dirname +/+ "Samples/HiHats1.hihat2.wav";