BabelWires is a framework for data format conversion applications.
Its user interface is based on the dataflow paradigm: nodes representing input files, output files and data processors can be wired together to define how data should flow from input to output, being transformed along the way. In flexibility and expressive power, it lies somewhere between command-line utilities (which tend to be quite fixed in functionality) and code (which is highly flexible, but unavailable to many people). It encourages the development of generic conversion software in contrast to bespoke format-specific applications.
The BabelWires framework has no domain specific code, but provides the bulk of the domain agnostic code needed to construct this kind of application.
The defining use-case is SeqWires, which supports the conversion of music sequence data between music sequencer formats. Here's a screenshot of SeqWires:
The framework provides:
- A type system for representing and manipulating structured data. Includes support for:
- Primitive types such as IntType and StringType.
- Compound types such as RecordType and ArrayType.
- Abstractions for source and target formats (SourceFileFormat and TargetFileFormat)
- Plugins register factory functions to add support for new formats.
- An abstraction for processing data (Processor)
- A registry of factory functions is used to provide an expandable set of processing nodes.
- A data structure describing a graph of wired nodes (Project).
- With the exception of some processors, which are internally multithreaded, BabelWires is essentially a single-threaded application.
- With a view to future proofing, the UI accesses the Project strictly through scoped objects (AccessModelScope and ModifyModelScope). This should make it straightforward to multithread if required.
- A version-aware serialization system for project files.
- All serializable classes and factory functions declare a version.
- Every representable component of the system is associated with a universally unique identifier (UUID). (This ensures there is no ambiguity when data is serialized and deserialized in different contexts).
- A Qt-based user interface for manipulating projects
- The core data management layer, which includes formats and processors, has no dependency on the UI code or Qt.
- Generic support for defining maps of key value pairs between values (MapValue)
- These kinds of maps are very common in data transformation.
- A first-class concept of failure
- This allows the project to cope with structural changes to imported data.
Here's a screenshot of the MapEditor defining a map between two types:
The current status is "not totally stable". There has been a significant refactor where the core representation of data has switched from hierarchies of Features to Values of Types. The motivation is to allow compound data to be manipulated directly.
BabelWires is intended to be cross platform but given the limited time I have available, quality is inconsistent:
Platform | Build | Unit Tests | UI |
---|---|---|---|
GNU/Linux | Verified by CI | Verified by CI | Functional |
Windows | Verified by CI | Verified by CI | Needs work |
Mac OS | Manual | Manual | Needs work |
BabelWires is under active development, but please do not expect development to be rapid. My focus is on fundimetals.
Clone recursively to ensure submodules are populated:
git clone --recurse-submodules https://github.com/Malcohol/BabelWires.git
BabelWires is licensed under the GPLv3. See the LICENSE file.
BabelWires uses a customized version of the Nodeeditor project for its GUI. My fork with the customizations is here, and that libary (and my customizations) are licensed under the BSD 3-Clause License.