#node #directed-graph #signal #flow #model #within #allowing

no-std graphity

在有向图中建模节点之间的信号流

3个版本 (稳定)

2.0.0 2021年1月3日
1.0.0 2020年12月30日
0.0.1 2020年8月5日

#38 in #allowing

GPL-3.0-or-later

94KB
2K SLoC

Graphity

在有向图中建模节点之间的信号流。这个库旨在用于(但不仅限于)声音应用,其中音频信号将在生成和编辑它的各个节点之间流动。

文档

该库与#[no_std]兼容,允许在例如嵌入式环境中使用。然而,请注意,它需要带有alloc软件包的全局分配器。

使用方法

将以下内容添加到您的Cargo.toml

[dependencies]
graphity = "2.0"

然后您需要

  1. 通过实现Node特质来定义您的节点。
  2. 使用提供的宏生成一个包含这些节点的图类型。
  3. 实例化图,添加节点,使用边连接它们。
  4. 触发tick操作,这将推动信号通过图。

在此示例中,我们将使用3种节点类型,并按照以下方式连接它们

|  [1]   [2]  Generators are outputting their value
|    \   /
|     [+]     Sum adds the two inputs together
|      |
V     [3]     Echo prints its input on the stdout

以下片段说明了如何通过该库建模此类图。您可以在examples/中找到完整的代码。

impl Node<i32> for Echo {
    ...
}

impl Node<i32> for Generator {
   ...
}

impl Node<i32> for Sum {
   ...
}

graphity!(
    Graph<i32>;
    Generator = {Generator, GeneratorConsumer, GeneratorProducer},
    Sum = {Sum, SumConsumer, SumProducer},
    Echo = {Echo, EchoConsumer, EchoProducer},
);

fn main() {
    let mut graph = Graph::new();

    let one = graph.add_node(Generator(1));
    let two = graph.add_node(Generator(2));
    let sum = graph.add_node(Sum::default());
    let echo = graph.add_node(Echo::default());

    graph.must_add_edge(
        one.producer(GeneratorProducer),
        sum.consumer(SumConsumer::In1),
    );
    graph.must_add_edge(
        two.producer(GeneratorProducer),
        sum.consumer(SumConsumer::In2),
    );
    graph.must_add_edge(
        sum.producer(SumProducer),
        echo.consumer(EchoConsumer)
    );

    graph.tick();
}

您可以在文档中找到详细示例和完整的API解释。

如果您喜欢通过阅读文档来修改代码,请查看并尝试包含的示例

cargo run --example graph

许可证

Gazpatcho是在通用公共许可证版本3的条款下分发的。有关详细信息,请参阅LICENSE

变更日志

阅读CHANGELOG.md了解每个版本引入的更改。

依赖项

~1MB
~13K SLoC