Developing with Portamos

Portamos is published to GitHub Packages and can be used as a library in your own Java projects. The artifact requires Java 21 or later.

Dependency

Gradle (Kotlin DSL)

repositories {
    maven {
        url = uri("https://maven.pkg.github.com/fredrik-rambris/portamos")
        credentials {
            username = providers.gradleProperty("gpr.user").orNull ?: System.getenv("GITHUB_ACTOR")
            password = providers.gradleProperty("gpr.key").orNull ?: System.getenv("GITHUB_TOKEN")
        }
    }
}

dependencies {
    implementation("dev.rambris:portamos:0.0.1-beta.29")
}

Maven


<repositories>
    <repository>
        <id>github-portamos</id>
        <url>https://maven.pkg.github.com/fredrik-rambris/portamos</url>
    </repository>
</repositories>

<dependency>
<groupId>dev.rambris</groupId>
<artifactId>portamos</artifactId>
<version>0.0.1-beta.29</version>
</dependency>

GitHub Packages requires authentication even for public packages. Add your GitHub username and a personal access token (with read:packages scope) to ~/.m2/settings.xml or Gradle’s gradle.properties.


Working with banks

Reading a bank

AmosBank.read(Path) dispatches automatically to the correct reader based on the bank magic and name header:

import dev.rambris.amigaamos.bank.AmosBank;
import dev.rambris.amigaamos.bank.SampleBank;

AmosBank bank = AmosBank.read(Path.of("Samples.Abk"));

if(bank instanceof
SampleBank samples){
        for(
var sample :samples.

samples()){
        System.out.

printf("%s  %d Hz  %d bytes%n",
       sample.name(),sample.

frequencyHz(),sample.

data().length);
        }
        }

Writing a bank

Each bank type has a corresponding writer. Retrieve it from the bank itself via bank.writer():

import dev.rambris.amigaamos.bank.AmosBank;
import dev.rambris.amigaamos.bank.SampleBank;

AmosBank bank = AmosBank.read(Path.of("Samples.Abk"));
// ... modify the bank model ...
bank.

writer().

write(bank, Path.of("Samples-modified.Abk"));

Or get the bytes directly (useful when embedding banks in a .AMOS file):

byte[] bankBytes = bank.writer().toBytes(bank);

Working with AMOS program files

Detokenizing a binary to ASCII

import dev.rambris.amigaamos.tokenizer.Tokenizer;
import dev.rambris.amigaamos.tokenizer.model.AmosFile;

Tokenizer tokenizer = new Tokenizer();
AmosFile program = tokenizer.decode(Path.of("Program.AMOS"));

// Print as ASCII source
List<String> lines = tokenizer.print(program);
lines.

forEach(System.out::println);

// Or write directly to a file
tokenizer.

print(program, Path.of("Program.Asc"));

Tokenizing ASCII source to binary

import dev.rambris.amigaamos.tokenizer.Tokenizer;
import dev.rambris.amigaamos.tokenizer.model.AmosFile;

Tokenizer tokenizer = new Tokenizer();
AmosFile program = tokenizer.parse(Path.of("Program.Asc"));

byte[] binary = tokenizer.encode(program);
Files.

write(Path.of("Program.AMOS"),binary);

Using third-party extension definitions

Tokenizer tokenizer = new Tokenizer()
        .withoutDefinition("music")                      // drop built-in Music extension
        .withDefinition(Path.of("definitions/amcaf.json")); // load AMCAF instead

AmosFile program = tokenizer.decode(Path.of("Program.AMOS"));

IFF support

Adding portamos to your project also registers IFF ILBM and IFF 8SVX providers into the standard Java ImageIO and javax.sound.sampled APIs automatically via the Java SPI mechanism — no extra configuration required.

See the IFF library page for details.


Table of contents


Portamos is open-source software licensed under the Apache 2.0 License.

This site uses Just the Docs, a documentation theme for Jekyll.