All Projects → vmchale → Madlang

vmchale / Madlang

Licence: other
Madlang is a language for generative literature

Programming Languages

haskell
3896 projects
language
365 projects

Projects that are alternatives of or similar to Madlang

Weir
A system for making generative systems
Stars: ✭ 451 (+925%)
Mutual labels:  generative-art
Snek
See https://github.com/inconvergent/weir instead
Stars: ✭ 696 (+1481.82%)
Mutual labels:  generative-art
Awesome Creative Coding
Creative Coding: Generative Art, Data visualization, Interaction Design, Resources.
Stars: ✭ 8,696 (+19663.64%)
Mutual labels:  generative-art
Code Package P5.js
Code package of the book: Generative Design – Creative Coding for the Web with JavaScript in p5.js
Stars: ✭ 547 (+1143.18%)
Mutual labels:  generative-art
Nodebox
Node-based data application for visualization and generative design
Stars: ✭ 647 (+1370.45%)
Mutual labels:  generative-art
Arbitrary Image Stylization Tfjs
Arbitrary style transfer using TensorFlow.js
Stars: ✭ 822 (+1768.18%)
Mutual labels:  generative-art
Solving Sol
Implement Sol LeWitt's instructions in JavaScript.
Stars: ✭ 417 (+847.73%)
Mutual labels:  generative-art
Linearx Font
Procedurally generated fonts
Stars: ✭ 41 (-6.82%)
Mutual labels:  generative-art
Party Mode
An experimental music visualizer using d3.js and the web audio api.
Stars: ✭ 690 (+1468.18%)
Mutual labels:  generative-art
Worlds2
Building Virtual Reality Worlds using Three.js
Stars: ✭ 34 (-22.73%)
Mutual labels:  generative-art
Cartoongan Tensorflow
Generate your own cartoon-style images with CartoonGAN (CVPR 2018), powered by TensorFlow 2.0 Alpha.
Stars: ✭ 587 (+1234.09%)
Mutual labels:  generative-art
Differential Line
a generative algorithm
Stars: ✭ 606 (+1277.27%)
Mutual labels:  generative-art
Curv
a language for making art using mathematics
Stars: ✭ 853 (+1838.64%)
Mutual labels:  generative-art
Glisp
A Lisp-based Design Tool Bridging Graphic Design and Computational Arts
Stars: ✭ 519 (+1079.55%)
Mutual labels:  generative-art
Awesome Generative Art
Awesome generative art
Stars: ✭ 980 (+2127.27%)
Mutual labels:  generative-art
Pts
A library for visualization and creative-coding
Stars: ✭ 4,628 (+10418.18%)
Mutual labels:  generative-art
Flutter particle clock
The Grand Prize-winning entry of the #FlutterClock challenge.
Stars: ✭ 771 (+1652.27%)
Mutual labels:  generative-art
Komposto.org
komposto.org is a sketchbook of self-modifying programs.
Stars: ✭ 41 (-6.82%)
Mutual labels:  generative-art
Sofloo Spot
Click Randomize
Stars: ✭ 37 (-15.91%)
Mutual labels:  generative-art
Rapping Neural Network
Rap song writing recurrent neural network trained on Kanye West's entire discography
Stars: ✭ 951 (+2061.36%)
Mutual labels:  generative-art

Madlang DSL for generating random text

Windows build status Build Status Hackage

This is the Madlang DSL for generating text. You specify a template, and Madlang will create randomized text from the template.

Madlang is an interpreted language, written in Haskell. Madlang can be used as an EDSL for Haskell or using the command-line interpreter.

Madlang is intended to explore computational creativity and provide an easy way to get started with generative literature.

Installation

Binary Releases

Head over to the releases page and grab a binary for your platform.

Cabal

If you do not see you platform listed, you will have to install from source. Download cabal and GHC. Then:

 $ cabal update
 $ cabal new-install madlang

You may need to add $HOME/.local/bin to your PATH. To do so:

 $ echo 'export PATH=$HOME/.local/bin:$PATH' >> $HOME/.bashrc
 $ source $HOME/.bashrc

Tutorial

The smallest program possible in Madlang is simply a return declaration, viz.

:return
    1.0 "heads"
    1.0 "tails"

The :return tells us this that this will be the final value when run, while the numbers in front of the strings denote relative weights. Save this as gambling.mad, and run

 $ madlang run gambling.mad
 heads

Now let's try something a little more complicated:

:define person
    1.0 "me"
    1.0 "you"

:return
    1.0 "The only one of us walking out of this room alive is going to be " person "."

A bit more sinister, perhaps. The :define statement there declares a new identifier, which we can later reference. Save this as fate.mad and run:

 $ madlang run fate.mad
 The only one of us walking out of this room alive is going to be you.

We can also refer to another identifier within a :define block.

:define coin
    1.0 "heads"
    1.0 "tails"

:define realisticCoin
    1.0 coin
    0.03 "on its side"

:return realisticCoin

In addition to identifiers, we can also define categories. Categories are just groups of identifiers. We can define one like so:

:define color
    1.0 "yellow"
    1.0 "blue"

:define texture
    1.0 "soft"
    1.0 "scratchy"
    1.0 "dimpled"

:category adjective
    | color
    | texture

:return
    1.0 adjective

Then, when we can adjective, it will pick one of "yellow", "blue",… "dimpled" with equal probability.

Finally, one of the most powerful features of madlang is the ability to include libraries in a file. Open the following and save it as gambling.mad:

:library

:define coin
    1.0 "heads"
    1.0 "tails"

Then, open the following and save it in the same directory as realistic-gambling.mad:

:include gambling.mad

:define realisticGambling
    1.0 gambling-coin
    0.03 "on its side"

:return
    1.0 realisticGambling

Then run it with:

 $ madlang run realistic-gambling.mad

madlang comes with several libraries prepackaged. You can install them for the current user with:

 $ madlang install

Try this out:

:include colors.mad

:define weirdDog
    1.0 colors-color "dog"

:return
    1.0 "On my walk today I saw a " weirdDog "."

EDSL

You can use Madlang as a Haskell EDSL, generating values of type RandTok. This can be done a couple ways. One is to use the file embedder:

randomText :: RandTok
randomText = $(madFile "mad-src/some-bot.mad")

While the other is to use the madlang quasi-quoter:

randomText :: RandTok
randomText = [madlang|
:include adjectives.mad

:return
    1.0 "I am feeling very " adjectives-adjective " today."
|]

You can then transform this into a random text file with:

generateText :: IO Text
generateText = run randomText

Examples

There is a Shakespearean insult generator available to test out at my site. For a look at using Madlang as an EDSL, check out my recursion scheme generator

Tooling

Vim

There is a vim plugin available here.

Project Templates

There is a project template bundled with pi, which you can install with

 $ curl -LSfs https://japaric.github.io/trust/install.sh | sh -s -- --git vmchale/project-init

and invoke with

 $ pi new madlang story

There is also a templated project here that can be invoked via

pi git vmchale/https://github.com/vmchale/madlang-miso story

Manpages

You can view documentation for madlang on Linux, Mac, or BSD by typing:

 $ man madlang

Contributions

Guide

Contributions, bug reports, and feature requests are emphatically welcome. Please see the CONTRIBUTING.md guide for more specific details.

Release Naming

Releases are named using the releases.mad file found here. You will need to install the standard libraries using

 $ madlang install

before running

 $ just name
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].