{"generators":[{"key":"numbers.integers","name":"Integers","tagline":"Whole numbers in any range, drawn without the bias everyone else ships.","module":"numbers","renderer":"text","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain"],"params":[{"name":"count","type":"int","label":"How many","default":10,"min":1,"max":1000,"step":1},{"name":"min","type":"int","label":"Minimum","default":1,"min":-1000000,"max":1000000,"step":1},{"name":"max","type":"int","label":"Maximum","default":100,"min":-1000000,"max":1000000,"step":1},{"name":"unique","type":"bool","label":"No repeats","default":false,"help":"Draw without replacement, like a lottery."},{"name":"sort","type":"enum","label":"Order","default":"none","options":{"none":"As drawn","asc":"Ascending","desc":"Descending"}}]},{"key":"numbers.dice","name":"Dice","tagline":"Full dice notation, rolled without the bias a modulo would introduce.","module":"numbers","renderer":"text","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain"],"params":[{"name":"notation","type":"string","label":"Notation","default":"4d6kh3","max":40,"help":"e.g. 3d6+2, 4d6kh3, 2d20kl1, 6d6!"},{"name":"rolls","type":"int","label":"How many rolls","default":6,"min":1,"max":100,"step":1}]},{"key":"numbers.gaussian","name":"Bell Curve","tagline":"The normal distribution by Box\u2013Muller, plotted as you draw it.","module":"numbers","renderer":"chart","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain"],"params":[{"name":"count","type":"int","label":"How many","default":500,"min":1,"max":5000,"step":1},{"name":"mu","type":"float","label":"Mean (\u03bc)","default":0,"min":-1000000,"max":1000000,"step":0.5},{"name":"sigma","type":"float","label":"Standard deviation (\u03c3)","default":1,"min":0.001,"max":1000000,"step":0.1},{"name":"clamp","type":"bool","label":"Truncate the tails","default":false,"help":"Redraw anything beyond the cut instead of keeping it. This is a truncated normal, not a normal \u2014 the shape changes."},{"name":"clamp_sigma","type":"float","label":"Cut at (\u03c3)","default":3,"min":1,"max":6,"step":0.5},{"name":"bins","type":"int","label":"Histogram bars","default":25,"min":4,"max":60,"step":1},{"name":"decimals","type":"int","label":"Decimal places","default":3,"min":0,"max":6,"step":1}]},{"key":"numbers.distribution","name":"Distribution Lab","tagline":"Poisson, Pareto, Zipf, Beta, Cauchy \u2014 sampled and plotted.","module":"numbers","renderer":"chart","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain"],"params":[{"name":"distribution","type":"enum","label":"Distribution","default":"poisson","options":{"poisson":"Poisson \u2014 arrivals in a fixed window","binomial":"Binomial \u2014 successes out of n tries","zipf":"Zipf \u2014 rank frequency, the long tail","exponential":"Exponential \u2014 waiting time","gamma":"Gamma \u2014 the sum of k waits","beta":"Beta \u2014 a proportion between 0 and 1","pareto":"Pareto \u2014 the 80\/20 power law","cauchy":"Cauchy \u2014 no mean, no variance"}},{"name":"count","type":"int","label":"How many","default":1000,"min":10,"max":5000,"step":1,"help":"Sampling noise falls as 1\/\u221an. At a hundred draws the bars wobble visibly around the curve; at five thousand they sit on it."},{"name":"lambda","type":"float","label":"Rate \u03bb","default":4,"min":0.01,"max":500,"step":0.5,"help":"Poisson: the mean number of events. Exponential: the arrival rate, so the mean wait is 1\/\u03bb."},{"name":"alpha","type":"float","label":"Shape \u03b1","default":2,"min":0.05,"max":50,"step":0.05,"help":"Pareto tail index, Gamma shape k, Beta\u2019s first shape, and Zipf\u2019s exponent s. Smaller is heavier-tailed."},{"name":"beta","type":"float","label":"Shape \u03b2","default":5,"min":0.05,"max":50,"step":0.05,"help":"Beta\u2019s second shape. \u03b1 = \u03b2 = 1 is the uniform distribution."},{"name":"scale","type":"float","label":"Scale","default":1,"min":0.01,"max":100,"step":0.1,"help":"Gamma\u2019s \u03b8, Cauchy\u2019s half-width \u03b3, and Pareto\u2019s minimum x_m \u2014 the point its tail starts from."},{"name":"trials","type":"int","label":"Trials n","default":40,"min":1,"max":500,"step":1,"help":"Binomial only. Capped at 500 because the sampler inverts the CDF, which costs about n\u00b7p steps a draw."},{"name":"p","type":"float","label":"Probability p","default":0.3,"min":0.001,"max":0.999,"step":0.01,"help":"Binomial only: the chance each try succeeds."},{"name":"support","type":"int","label":"Ranks N","default":100,"min":2,"max":2000,"step":1,"help":"Zipf only: how many ranks there are. Word frequency lists behave like this with s \u2248 1."},{"name":"bins","type":"int","label":"Histogram bars","default":30,"min":4,"max":60,"step":1},{"name":"decimals","type":"int","label":"Decimal places","default":3,"min":0,"max":6,"step":1}]},{"key":"numbers.decimals","name":"Decimals","tagline":"Floats in a range, at a precision you choose.","module":"numbers","renderer":"text","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain"],"params":[{"name":"count","type":"int","label":"How many","default":10,"min":1,"max":1000,"step":1},{"name":"min","type":"float","label":"Minimum","default":0,"min":-1000000,"max":1000000,"step":0.1},{"name":"max","type":"float","label":"Maximum","default":1,"min":-1000000,"max":1000000,"step":0.1},{"name":"precision","type":"int","label":"Decimal places","default":4,"min":0,"max":10,"step":1,"help":"The grid the draw lands on, not just how it is printed: two places between 0 and 1 means 101 possible values."},{"name":"unique","type":"bool","label":"No repeats","default":false,"help":"Draw without replacement from the grid the precision defines."},{"name":"sort","type":"enum","label":"Order","default":"none","options":{"none":"As drawn","asc":"Ascending","desc":"Descending"}}]},{"key":"numbers.coordinates","name":"Earth Points","tagline":"Uniform on a sphere \u2014 not the latitude bug everyone ships.","module":"numbers","renderer":"chart","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain"],"params":[{"name":"count","type":"int","label":"How many points","default":150,"min":1,"max":1000,"step":1},{"name":"show","type":"enum","label":"Show","default":"compare","options":{"compare":"Both, side by side","correct":"Correct only","naive":"The bug only"},"help":"Both sets are always generated. This only chooses what is plotted."},{"name":"decimals","type":"int","label":"Decimal places","default":4,"min":0,"max":6,"step":1,"help":"Four places is about 11 metres at the equator."}]},{"key":"numbers.lottery","name":"Lottery","tagline":"Mega-Sena, Powerball and EuroMillions \u2014 with the odds printed on them.","module":"numbers","renderer":"text","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain"],"params":[{"name":"game","type":"enum","label":"Game","default":"mega-sena","options":{"mega-sena":"Mega-Sena (6 from 60)","powerball":"Powerball (5 from 69 + 1 from 26)","euromillions":"EuroMillions (5 from 50 + 2 from 12)","custom":"Custom"}},{"name":"lines","type":"int","label":"Lines","default":5,"min":1,"max":20,"step":1},{"name":"pool","type":"int","label":"Custom: pool size","default":60,"min":2,"max":80,"step":1},{"name":"picks","type":"int","label":"Custom: numbers drawn","default":6,"min":1,"max":10,"step":1},{"name":"bonus_pool","type":"int","label":"Custom: bonus pool","default":0,"min":0,"max":50,"step":1},{"name":"bonus_picks","type":"int","label":"Custom: bonus drawn","default":0,"min":0,"max":3,"step":1}]},{"key":"numbers.coin","name":"Coin Flips","tagline":"Biased or fair, showing the longest run against the expected log\u2082 n.","module":"numbers","renderer":"text","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain"],"params":[{"name":"count","type":"int","label":"Flips","default":100,"min":1,"max":10000,"step":1},{"name":"bias","type":"float","label":"P(heads)","default":0.5,"min":0,"max":1,"step":0.01,"help":"A fair coin is 0.5. Bias it and watch the longest run of heads grow much faster than the head count does."},{"name":"style","type":"enum","label":"Faces","default":"ht","options":{"ht":"H \/ T","words":"Heads \/ Tails","binary":"1 \/ 0","circles":"\u25cf \/ \u25cb"}},{"name":"group","type":"int","label":"Group every","default":10,"min":0,"max":50,"step":1,"help":"Insert a space every n flips so the sequence can be read. Zero runs them together."}]},{"key":"numbers.uuid","name":"Identifiers","tagline":"UUID v4 and v7, ULID, NanoID \u2014 and what each one gives away.","module":"numbers","renderer":"text","version":1,"sensitive":true,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain"],"params":[{"name":"flavour","type":"enum","label":"Flavour","default":"v4","options":{"v4":"UUID v4 \u2014 122 random bits","v7":"UUID v7 \u2014 time-ordered","ulid":"ULID \u2014 time-ordered, base32","nanoid":"NanoID \u2014 short and URL-safe"}},{"name":"count","type":"int","label":"How many","default":8,"min":1,"max":200,"step":1},{"name":"moment","type":"string","label":"Clock (v7 and ULID)","default":"2026-01-01T00:00:00Z","max":32,"help":"These two carry a timestamp. It is a field rather than the real clock so the same seed keeps producing the same identifiers."},{"name":"spread","type":"int","label":"Milliseconds between them","default":250,"min":1,"max":60000,"step":1,"help":"Successive identifiers advance the clock by a random amount up to this, which is what makes the ordering visible."},{"name":"size","type":"int","label":"NanoID length","default":21,"min":8,"max":64,"step":1},{"name":"uppercase","type":"bool","label":"Uppercase hex","default":false,"help":"RFC 9562 says to emit lowercase and to accept either."}]},{"key":"numbers.password","name":"Passwords","tagline":"Random characters, with the entropy stated in bits instead of a green bar.","module":"numbers","renderer":"text","version":1,"sensitive":true,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain"],"params":[{"name":"length","type":"int","label":"Length","default":20,"min":6,"max":128,"step":1},{"name":"count","type":"int","label":"How many","default":5,"min":1,"max":50,"step":1},{"name":"lowercase","type":"bool","label":"Lowercase","default":true},{"name":"uppercase","type":"bool","label":"Uppercase","default":true},{"name":"digits","type":"bool","label":"Digits","default":true},{"name":"symbols","type":"bool","label":"Symbols","default":true},{"name":"avoid_ambiguous","type":"bool","label":"Avoid lookalikes","default":false,"help":"Drops I l 1 O 0 o, which get mistyped from a screen."}]},{"key":"numbers.bytes","name":"Raw Bytes","tagline":"The entropy itself, in hex, base64 or binary.","module":"numbers","renderer":"text","version":1,"sensitive":true,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain"],"params":[{"name":"count","type":"int","label":"How many bytes","default":32,"min":1,"max":1024,"step":1,"help":"16 bytes is an AES-128 key, 32 an AES-256 key. Both are more randomness than anything you own needs."},{"name":"encoding","type":"enum","label":"Encoding","default":"hex","options":{"hex":"Hexadecimal","base64":"Base64","base64url":"Base64 (URL-safe)","binary":"Binary (bits)","decimal":"Decimal (0\u2013255)","c_array":"C array"}},{"name":"uppercase","type":"bool","label":"Uppercase hex","default":false},{"name":"group","type":"int","label":"Group every","default":0,"min":0,"max":16,"step":1,"help":"Insert a space every n bytes. Zero is one unbroken string, which is what you want if you are about to paste it."}]},{"key":"numbers.prime","name":"Primes","tagline":"Miller\u2013Rabin, forty rounds, at the bit width you ask for.","module":"numbers","renderer":"text","version":1,"sensitive":true,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain"],"params":[{"name":"bits","type":"int","label":"Bit width","default":64,"min":8,"max":256,"step":1,"help":"A 2048-bit RSA key is two 1024-bit primes. This stops at 256 because bcmath does the modular exponentiation in software and the wait stops being interactive."},{"name":"count","type":"int","label":"How many","default":5,"min":1,"max":20,"step":1},{"name":"safe","type":"bool","label":"Safe primes only","default":false,"help":"p where (p\u22121)\/2 is also prime \u2014 what Diffie\u2013Hellman wants. Rarer by another factor of ln(p), so the width is capped at 128 bits when this is on."},{"name":"twin","type":"bool","label":"Prefer twins","default":false,"help":"Report whether p + 2 is also prime. Not a filter: twin primes thin out fast and searching for them at 64 bits would hang."},{"name":"format","type":"enum","label":"Show as","default":"decimal","options":{"decimal":"Decimal","hex":"Hexadecimal","both":"Decimal and hex"}}]},{"key":"numbers.timestamp","name":"Moments","tagline":"A random instant inside a window you define.","module":"numbers","renderer":"text","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain"],"params":[{"name":"count","type":"int","label":"How many","default":5,"min":1,"max":500,"step":1},{"name":"from","type":"string","label":"From (UTC)","default":"2000-01-01T00:00:00","max":32,"help":"YYYY-MM-DD, optionally with a time. Parsed strictly \u2014 \u201cnow\u201d and \u201cnext friday\u201d are rejected, because a generator that reads the clock cannot be replayed."},{"name":"to","type":"string","label":"To (UTC)","default":"2100-01-01T00:00:00","max":32},{"name":"granularity","type":"enum","label":"Round to the nearest","default":"second","options":{"second":"Second","minute":"Minute","hour":"Hour","day":"Day"}},{"name":"format","type":"enum","label":"Format","default":"iso8601","options":{"iso8601":"ISO 8601","unix":"Unix seconds","rfc2822":"RFC 2822","date":"Date only","human":"Readable"}},{"name":"sort","type":"enum","label":"Order","default":"none","options":{"none":"As drawn","asc":"Earliest first","desc":"Latest first"}}]},{"key":"words.passphrase","name":"Passphrase","tagline":"12.9 bits per word, from a list of 7,776 \u2014 and zero for the capital letters.","module":"words","renderer":"text","version":1,"sensitive":true,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain"],"params":[{"name":"words","type":"int","label":"Words","default":6,"min":4,"max":12,"step":1,"help":"Six words is 77.5 bits. Four is 51.7 \u2014 fine for a laptop login, not for a password manager."},{"name":"list","type":"enum","label":"Wordlist","default":"large","options":{"large":"EFF large \u2014 7,776 words (12.9 bits each)","short":"EFF short \u2014 1,296 words (10.3 bits each)"}},{"name":"separator","type":"enum","label":"Separator","default":"dash","options":{"dash":"Dash \u00b7 correct-horse","space":"Space \u00b7 correct horse","dot":"Dot \u00b7 correct.horse","underscore":"Underscore \u00b7 correct_horse","none":"None \u00b7 correcthorse"}},{"name":"capitalise","type":"bool","label":"Capitalise each word","default":false,"help":"Adds zero bits. It is a rule, and the attacker has the rule too."},{"name":"append_number","type":"bool","label":"Append a number","default":false,"help":"Adds 6.6 bits, because this one is actually drawn at random."}]},{"key":"words.pseudo","name":"Invented Words","tagline":"Order-n Markov chains over real vocabulary \u2014 noise at 2, plagiarism at 4.","module":"words","renderer":"text","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain"],"params":[{"name":"count","type":"int","label":"How many","default":12,"min":1,"max":60,"step":1},{"name":"order","type":"int","label":"Chain order","default":3,"min":2,"max":4,"step":1,"help":"2 is soup, 3 is pronounceable, 4 mostly regurgitates real words."},{"name":"min_length","type":"int","label":"Shortest","default":5,"min":3,"max":12,"step":1},{"name":"max_length","type":"int","label":"Longest","default":10,"min":4,"max":16,"step":1},{"name":"corpus","type":"enum","label":"Trained on","default":"large","options":{"large":"EFF large \u2014 7,776 words (12.9 bits each)","short":"EFF short \u2014 1,296 words (10.3 bits each)"}}]},{"key":"words.syllabic","name":"Name Forge","tagline":"Syllable grammars rather than a list lookup \u2014 elvish, nordic, latin, brand.","module":"words","renderer":"text","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain"],"params":[{"name":"count","type":"int","label":"How many","default":10,"min":1,"max":60,"step":1},{"name":"flavour","type":"enum","label":"Flavour","default":"elvish","options":{"elvish":"Elvish","nordic":"Nordic","brand":"Brand","latin":"Latin"}},{"name":"syllables","type":"int","label":"Syllables","default":3,"min":2,"max":4,"step":1},{"name":"capitalise","type":"bool","label":"Capitalise","default":true,"help":"These are names, so they start with a capital by default."}]},{"key":"words.brand","name":"Brand Names","tagline":"Two open syllables and a plausible domain \u2014 no registrar was consulted.","module":"words","renderer":"text","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain"],"params":[{"name":"count","type":"int","label":"How many","default":12,"min":1,"max":60,"step":1},{"name":"style","type":"enum","label":"Style","default":"brand","options":{"elvish":"Elvish","nordic":"Nordic","brand":"Brand","latin":"Latin"}},{"name":"tld","type":"enum","label":"Domain hint","default":"com","options":{"com":".com","io":".io","ai":".ai","co":".co","app":".app"},"help":"A pattern hint only. Nothing here checks whether it is registered."}]},{"key":"words.lorem","name":"Lorem","tagline":"Sentence lengths drawn log-normally, so it reads like prose and not like a list.","module":"words","renderer":"text","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain"],"params":[{"name":"paragraphs","type":"int","label":"Paragraphs","default":3,"min":1,"max":12,"step":1},{"name":"sentences","type":"int","label":"Sentences each","default":5,"min":1,"max":12,"step":1,"help":"Give or take one \u2014 paragraphs of identical length are the other tell of generated text."},{"name":"flavour","type":"enum","label":"Flavour","default":"latin","options":{"latin":"Latin \u00b7 the classical filler","tech":"Tech \u00b7 plausible engineering prose","markov":"Invented \u00b7 a language that never existed"}},{"name":"start_with_lorem","type":"bool","label":"Open with \"Lorem ipsum\"","default":true,"help":"Latin only. The opening everyone recognises as placeholder text."}]},{"key":"words.article","name":"Random Knowledge","tagline":"A Wikipedia summary you would never have gone looking for.","module":"words","renderer":"text","version":1,"sensitive":false,"reproducible":false,"uses_entropy":true,"formats":["application\/json","text\/plain"],"params":[{"name":"count","type":"int","label":"How many","default":3,"min":1,"max":10,"step":1},{"name":"with_extract","type":"bool","label":"Include the summary","default":true}]},{"key":"words.species","name":"Random Life","tagline":"A real species drawn from GBIF \u2014 twenty million names, one of them yours.","module":"words","renderer":"text","version":1,"sensitive":false,"reproducible":false,"uses_entropy":true,"formats":["application\/json","text\/plain"],"params":[{"name":"count","type":"int","label":"How many","default":5,"min":1,"max":12,"step":1},{"name":"with_lineage","type":"bool","label":"Show the lineage","default":true,"help":"Kingdom down to family, which is usually more surprising than the name."}]},{"key":"words.related","name":"Word Web","tagline":"Means-like, rhymes-with and sounds-like, via Datamuse.","module":"words","renderer":"text","version":1,"sensitive":false,"reproducible":false,"uses_entropy":true,"formats":["application\/json","text\/plain"],"params":[{"name":"word","type":"string","label":"Seed word","default":"ocean","max":40,"help":"One word works best. The relation is computed against this, so changing it fetches a new pool."},{"name":"relation","type":"enum","label":"Relation","default":"ml","options":{"ml":"Means like","rel_rhy":"Rhymes with","sl":"Sounds like","rel_bga":"Usually follows"}},{"name":"count","type":"int","label":"How many","default":8,"min":1,"max":25,"step":1},{"name":"with_score","type":"bool","label":"Show Datamuse\u2019s relevance score","default":true,"help":"Their ranking, not ours \u2014 printed so you can see that the ordering came from them and the choice came from the seed."}]},{"key":"words.identity","name":"Fictional People","tagline":"Names that hold together across a nationality.","module":"words","renderer":"text","version":1,"sensitive":false,"reproducible":false,"uses_entropy":true,"formats":["application\/json","text\/plain"],"params":[{"name":"count","type":"int","label":"How many","default":5,"min":1,"max":20,"step":1},{"name":"nationality","type":"enum","label":"Nationality","default":"any","options":{"any":"Any (mixed)","br":"Brazil","ca":"Canada","de":"Germany","dk":"Denmark","es":"Spain","fi":"Finland","fr":"France","gb":"United Kingdom","ie":"Ireland","in":"India","no":"Norway","nl":"Netherlands","nz":"New Zealand","tr":"Turkey","us":"United States"},"help":"Names and places come from the same locale, so the person holds together. Mixed draws each person from a random one."},{"name":"with_location","type":"bool","label":"Include where they live","default":true},{"name":"with_email","type":"bool","label":"Include an email address","default":true,"help":"Always on example.com, which RFC 2606 reserves precisely so that test data cannot reach a real inbox."},{"name":"with_age","type":"bool","label":"Include an age","default":true}]},{"key":"equations.arithmetic","name":"Mental Math","tagline":"Drills at a digit count and operation set you pick, and division always comes out even.","module":"equations","renderer":"math","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain"],"params":[{"name":"operations","type":"enum","label":"Operations","default":"all","options":{"add":"Addition","sub":"Subtraction","mul":"Multiplication","div":"Division","add_sub":"Addition and subtraction","mul_div":"Multiplication and division","all":"All four"}},{"name":"digits","type":"int","label":"Digits","default":2,"min":1,"max":4,"step":1,"help":"How large the operands get."},{"name":"count","type":"int","label":"How many","default":10,"min":1,"max":100,"step":1},{"name":"negatives","type":"bool","label":"Allow negatives","default":false,"help":"Lets a subtraction go below zero, and operands turn negative."}]},{"key":"equations.expression","name":"Expression Tree","tagline":"A probabilistic grammar grows the expression; you get the tree it grew from too.","module":"equations","renderer":"math","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain"],"params":[{"name":"depth","type":"int","label":"Maximum depth","default":3,"min":1,"max":6,"step":1,"help":"A hard cut. Expressions usually stop short of it."},{"name":"functions","type":"enum","label":"Function set","default":"trig","options":{"none":"Arithmetic only","roots":"Roots and absolute value","trig":"Trigonometry","full":"Everything"}},{"name":"variables","type":"int","label":"Variables","default":1,"min":0,"max":3,"step":1,"help":"Zero makes every expression a closed number."},{"name":"constants","type":"bool","label":"Allow \u03c0 and e","default":false},{"name":"show_value","type":"bool","label":"Evaluate it","default":true},{"name":"count","type":"int","label":"How many","default":3,"min":1,"max":40,"step":1}]},{"key":"equations.linear","name":"Linear Equations","tagline":"Built root-first, so the answer is always clean and never needs checking.","module":"equations","renderer":"math","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain"],"params":[{"name":"tier","type":"enum","label":"Difficulty","default":"two_step","options":{"one_step":"One step \u2014 x + b = c","two_step":"Two steps \u2014 ax + b = c","two_sided":"Both sides \u2014 ax + b = cx + d","brackets":"Brackets \u2014 a(x + b) = cx + d","mixed":"Mixed"}},{"name":"count","type":"int","label":"How many","default":8,"min":1,"max":50,"step":1},{"name":"integer_solutions","type":"bool","label":"Whole-number answers","default":true}]},{"key":"equations.quadratic","name":"Quadratics","tagline":"Integer, rational or surd roots \u2014 built from the roots, so they factor.","module":"equations","renderer":"math","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain"],"params":[{"name":"roots","type":"enum","label":"Root type","default":"integer","options":{"integer":"Integers","rational":"Fractions","surd":"Surds (irrational)","mixed":"Mixed"}},{"name":"monic","type":"bool","label":"Leading coefficient 1","default":false,"help":"Off lets the x\u00b2 term carry a coefficient."},{"name":"count","type":"int","label":"How many","default":6,"min":1,"max":50,"step":1}]},{"key":"equations.system","name":"Systems","tagline":"2\u00d72 and 3\u00d73, guaranteed to have one solution and to reach it without fractions.","module":"equations","renderer":"math","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain"],"params":[{"name":"size","type":"enum","label":"Size","default":"2","options":{"2":"2 \u00d7 2","3":"3 \u00d7 3"}},{"name":"count","type":"int","label":"How many","default":4,"min":1,"max":30,"step":1},{"name":"solution_range","type":"int","label":"Solutions within \u00b1","default":8,"min":2,"max":20,"step":1}]},{"key":"equations.calculus","name":"Calculus","tagline":"Derivatives and integrals per rule \u2014 the integrals exist because they were built backwards.","module":"equations","renderer":"math","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain"],"params":[{"name":"mode","type":"enum","label":"Mode","default":"derivative","options":{"derivative":"Differentiate","integral":"Integrate"}},{"name":"rule","type":"enum","label":"Rule","default":"mixed","options":{"power":"Power rule","product":"Product rule","quotient":"Quotient rule","chain":"Chain rule","trig":"Trigonometric","exp_log":"Exponential and logarithmic","mixed":"Mixed"}},{"name":"count","type":"int","label":"How many","default":6,"min":1,"max":40,"step":1}]},{"key":"equations.matrix","name":"Matrices","tagline":"Any, invertible, symmetric or positive-definite \u2014 constructed, not rejection-sampled.","module":"equations","renderer":"math","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain"],"params":[{"name":"kind","type":"enum","label":"Kind","default":"any","options":{"any":"Any entries","invertible":"Invertible (det \u00b11)","determinant":"A chosen determinant","symmetric":"Symmetric","spd":"Symmetric positive-definite"}},{"name":"rows","type":"int","label":"Rows","default":3,"min":2,"max":5,"step":1},{"name":"cols","type":"int","label":"Columns","default":3,"min":2,"max":5,"step":1,"help":"Ignored by the kinds that have to be square."},{"name":"determinant","type":"int","label":"Determinant","default":6,"min":-12,"max":12,"step":1},{"name":"range","type":"int","label":"Entries within \u00b1","default":6,"min":1,"max":9,"step":1},{"name":"count","type":"int","label":"How many","default":1,"min":1,"max":12,"step":1}]},{"key":"equations.identity","name":"True or False?","tagline":"A real identity \u2014 half of them subtly broken. You guess; the verdict is checked, not assumed.","module":"equations","renderer":"math","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain"],"params":[{"name":"topic","type":"enum","label":"Topic","default":"mixed","options":{"trig":"Trigonometric","log":"Logarithms and exponentials","mixed":"Mixed"}},{"name":"count","type":"int","label":"How many","default":4,"min":1,"max":30,"step":1},{"name":"explain","type":"bool","label":"Say what is wrong","default":true,"help":"Prints the correct form beside a false statement."}]},{"key":"equations.sequence","name":"Find the Pattern","tagline":"Arithmetic, geometric, quadratic or Fibonacci-like \u2014 with enough terms to be unambiguous.","module":"equations","renderer":"math","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain"],"params":[{"name":"kind","type":"enum","label":"Pattern","default":"mixed","options":{"arithmetic":"Arithmetic \u2014 constant difference","geometric":"Geometric \u2014 constant ratio","quadratic":"Quadratic \u2014 constant second difference","fibonacci":"Fibonacci-like \u2014 sum of the previous two","mixed":"Mixed"}},{"name":"terms","type":"int","label":"Terms shown","default":5,"min":4,"max":9,"step":1},{"name":"count","type":"int","label":"How many","default":5,"min":1,"max":40,"step":1}]},{"key":"patterns.perlin","name":"Perlin Noise","tagline":"Gradient noise, stacked into fractals and folded through itself.","module":"patterns","renderer":"canvas","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain","image\/png"],"params":[{"name":"width","type":"int","label":"Width","default":900,"min":200,"max":2048,"step":1},{"name":"height","type":"int","label":"Height","default":600,"min":200,"max":2048,"step":1},{"name":"scale","type":"float","label":"Zoom","default":3,"min":0.5,"max":16,"step":0.1,"help":"How many noise cells fit across the canvas."},{"name":"octaves","type":"int","label":"Detail (octaves)","default":5,"min":1,"max":9,"step":1,"help":"One octave is plain Perlin. Each one adds finer detail at half the strength."},{"name":"persistence","type":"float","label":"Roughness","default":0.5,"min":0.2,"max":0.85,"step":0.05,"help":"How much each finer octave contributes."},{"name":"lacunarity","type":"float","label":"Frequency step","default":2,"min":1.4,"max":3.2,"step":0.1},{"name":"variant","type":"enum","label":"Shape","default":"fbm","options":{"fbm":"Clouds","turbulence":"Smoke","ridged":"Ridges","billow":"Billows"}},{"name":"warp","type":"float","label":"Domain warp","default":0,"min":0,"max":1.2,"step":0.05,"help":"Folds the noise through a copy of itself. The single most dramatic control here."},{"name":"palette","type":"enum","label":"Colour","default":"golden","options":{"golden":"Golden angle","analogous":"Analogous","complementary":"Complementary","triadic":"Triadic","split":"Split complementary","viridis":"Viridis (perceptually uniform)","magma":"Magma (perceptually uniform)","mono":"Monochrome"}},{"name":"colours","type":"int","label":"Palette size","default":7,"min":2,"max":12,"step":1},{"name":"contours","type":"bool","label":"Banding","default":false,"help":"Quantise into flat bands instead of a smooth gradient."}]},{"key":"patterns.simplex","name":"Simplex Noise","tagline":"Fewer directional artefacts, cheaper in higher dimensions.","module":"patterns","renderer":"canvas","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain","image\/png"],"params":[{"name":"width","type":"int","label":"Width","default":900,"min":200,"max":2048,"step":1},{"name":"height","type":"int","label":"Height","default":600,"min":200,"max":2048,"step":1},{"name":"scale","type":"float","label":"Zoom","default":3,"min":0.5,"max":16,"step":0.1,"help":"How many lattice cells fit across the canvas."},{"name":"octaves","type":"int","label":"Detail (octaves)","default":5,"min":1,"max":9,"step":1,"help":"One octave is plain OpenSimplex2. Each one adds finer detail at half the strength."},{"name":"persistence","type":"float","label":"Roughness","default":0.5,"min":0.2,"max":0.85,"step":0.05},{"name":"lacunarity","type":"float","label":"Frequency step","default":2,"min":1.4,"max":3.2,"step":0.1},{"name":"variant","type":"enum","label":"Shape","default":"fbm","options":{"fbm":"Clouds","turbulence":"Smoke","ridged":"Ridges","billow":"Billows"}},{"name":"warp","type":"float","label":"Domain warp","default":0,"min":0,"max":1.2,"step":0.05,"help":"Folds the noise through a copy of itself."},{"name":"compare","type":"bool","label":"Compare with Perlin","default":false,"help":"Splits the canvas: OpenSimplex2 left, Perlin right, same seed and same settings. Perlin's square lattice shows as a faint grain along the axes."},{"name":"palette","type":"enum","label":"Colour","default":"viridis","options":{"golden":"Golden angle","analogous":"Analogous","complementary":"Complementary","triadic":"Triadic","split":"Split complementary","viridis":"Viridis (perceptually uniform)","magma":"Magma (perceptually uniform)","mono":"Monochrome"}},{"name":"colours","type":"int","label":"Palette size","default":7,"min":2,"max":12,"step":1},{"name":"contours","type":"bool","label":"Banding","default":false,"help":"Quantise into flat bands instead of a smooth gradient."}]},{"key":"patterns.worley","name":"Worley Cells","tagline":"Distance to the nth-nearest feature point.","module":"patterns","renderer":"canvas","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain","image\/png"],"params":[{"name":"width","type":"int","label":"Width","default":900,"min":200,"max":2048,"step":1},{"name":"height","type":"int","label":"Height","default":600,"min":200,"max":2048,"step":1},{"name":"density","type":"float","label":"Cells across","default":9,"min":2,"max":48,"step":0.5,"help":"Feature points are scattered one per grid cell, so this is both the cell count and the point count."},{"name":"feature","type":"enum","label":"Distance kept","default":"f2f1","options":{"f1":"Cells","f2":"Second nearest","f2f1":"Cracks (F\u2082\u2212F\u2081)","f1f2":"Veins (F\u2081\u00b7F\u2082)"}},{"name":"metric","type":"enum","label":"Distance metric","default":"euclidean","options":{"euclidean":"Euclidean (bubbles)","manhattan":"Manhattan (diamonds)","chebyshev":"Chebyshev (squares)","minkowski":"Minkowski-p (a slider between them)"}},{"name":"p","type":"float","label":"Minkowski p","default":3,"min":0.4,"max":8,"step":0.1,"help":"Only used by the Minkowski metric. p=1 is Manhattan, p=2 is Euclidean, and large p approaches Chebyshev."},{"name":"jitter","type":"float","label":"Scatter","default":1,"min":0,"max":1,"step":0.05,"help":"How far a point may stray from its cell centre. At 0 the grid is perfectly regular and you get a tiling."},{"name":"invert","type":"bool","label":"Invert","default":false},{"name":"palette","type":"enum","label":"Colour","default":"viridis","options":{"golden":"Golden angle","analogous":"Analogous","complementary":"Complementary","triadic":"Triadic","split":"Split complementary","viridis":"Viridis (perceptually uniform)","magma":"Magma (perceptually uniform)","mono":"Monochrome"}},{"name":"colours","type":"int","label":"Palette size","default":7,"min":2,"max":12,"step":1},{"name":"contours","type":"bool","label":"Banding","default":false,"help":"Quantise into flat bands instead of a smooth gradient."}]},{"key":"patterns.spectral","name":"Spectral Noise","tagline":"1\/f^\u03b2 synthesised in the frequency domain.","module":"patterns","renderer":"canvas","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain","image\/png"],"params":[{"name":"width","type":"int","label":"Width","default":900,"min":200,"max":2048,"step":1},{"name":"height","type":"int","label":"Height","default":600,"min":200,"max":2048,"step":1},{"name":"preset","type":"enum","label":"Colour of noise","default":"brown","options":{"custom":"Custom (use the slider)","white":"White \u2014 \u03b2 = 0","pink":"Pink \u2014 \u03b2 = 1","brown":"Brown \u2014 \u03b2 = 2","black":"Black \u2014 \u03b2 = 3","blue":"Blue \u2014 \u03b2 = -1","violet":"Violet \u2014 \u03b2 = -2"}},{"name":"beta","type":"float","label":"\u03b2","default":1,"min":-2.5,"max":4,"step":0.05,"help":"The exponent itself. 0 is white, 1 pink, 2 brown, \u22121 blue. Only read when the preset is Custom."},{"name":"contrast","type":"float","label":"Contrast","default":2.5,"min":0.6,"max":4,"step":0.1,"help":"Where the palette's ends are pinned, in standard deviations. A spectral field is Gaussian, so it has tails rather than bounds \u2014 stretching to the extremes would leave the whole picture in the middle third of the ramp."},{"name":"zoom","type":"float","label":"Zoom","default":1,"min":1,"max":12,"step":0.25,"help":"Magnifies the same field. At 1 you see every octave the raster can hold, which for pink noise is mostly grain; wind it up and the low frequencies take over. A 1\/f field is scale-free, so this is a real zoom and not a blur."},{"name":"palette","type":"enum","label":"Colour","default":"magma","options":{"golden":"Golden angle","analogous":"Analogous","complementary":"Complementary","triadic":"Triadic","split":"Split complementary","viridis":"Viridis (perceptually uniform)","magma":"Magma (perceptually uniform)","mono":"Monochrome"}},{"name":"colours","type":"int","label":"Palette size","default":7,"min":2,"max":12,"step":1},{"name":"contours","type":"bool","label":"Banding","default":false,"help":"Quantise into flat bands. On a brown field this draws something very close to a contour map, because that is what a brown field is."}]},{"key":"patterns.automaton","name":"Elementary Automata","tagline":"All 256 rules, including the one that is a PRNG.","module":"patterns","renderer":"canvas","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain","image\/png"],"params":[{"name":"width","type":"int","label":"Width","default":900,"min":200,"max":2048,"step":1},{"name":"height","type":"int","label":"Height","default":600,"min":200,"max":2048,"step":1},{"name":"preset","type":"enum","label":"Rule","default":"r30","options":{"custom":"Custom (use the slider)","r30":"Rule 30 \u2014 chaotic","r110":"Rule 110 \u2014 Turing-complete","r90":"Rule 90 \u2014 Sierpi\u0144ski","r150":"Rule 150 \u2014 nested XOR","r184":"Rule 184 \u2014 traffic"}},{"name":"rule","type":"int","label":"Rule number","default":30,"min":0,"max":255,"step":1,"help":"Every rule is one byte: bit i is what the neighbourhood with binary value i becomes. Only used when the preset is Custom."},{"name":"start","type":"enum","label":"First row","default":"centre","options":{"centre":"A single live cell","random":"Random, at a density"},"help":"One cell shows the rule's own geometry; a random row shows what it does to noise."},{"name":"density","type":"float","label":"Start density","default":0.5,"min":0.02,"max":0.98,"step":0.02,"help":"Only used by the random first row."},{"name":"cell","type":"int","label":"Cell size","default":3,"min":1,"max":16,"step":1,"help":"Pixels per cell. Smaller means more generations on screen."},{"name":"wrap","type":"bool","label":"Wrap edges","default":true,"help":"Off, the world has walls and the pattern reflects off them."},{"name":"palette","type":"enum","label":"Colour","default":"mono","options":{"golden":"Golden angle","analogous":"Analogous","complementary":"Complementary","triadic":"Triadic","split":"Split complementary","viridis":"Viridis (perceptually uniform)","magma":"Magma (perceptually uniform)","mono":"Monochrome"}}]},{"key":"patterns.life","name":"Life","tagline":"Conway from a random soup, with a density control.","module":"patterns","renderer":"canvas","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain","image\/png"],"params":[{"name":"width","type":"int","label":"Width","default":900,"min":200,"max":2048,"step":1},{"name":"height","type":"int","label":"Height","default":600,"min":200,"max":2048,"step":1},{"name":"preset","type":"enum","label":"Rule","default":"conway","options":{"conway":"Conway \u2014 B3\/S23","highlife":"HighLife \u2014 B36\/S23","replicator":"Replicator \u2014 B1357\/S1357","serviettes":"Serviettes \u2014 B234\/S","daynight":"Day & Night \u2014 B3678\/S34678","maze":"Maze \u2014 B3\/S12345","coral":"Coral \u2014 B3\/S45678","custom":"Custom (type a rule)"}},{"name":"rule","type":"string","label":"Custom rule","default":"B3\/S23","max":24,"help":"B\/S notation: the neighbour counts that cause a birth, then the counts a live cell survives. Only read when the preset is Custom."},{"name":"cell","type":"int","label":"Cell size","default":4,"min":1,"max":16,"step":1,"help":"Pixels per cell. Small cells mean a large world and more room for structure to travel."},{"name":"density","type":"float","label":"Soup density","default":0.38,"min":0.02,"max":0.98,"step":0.01,"help":"The fraction of cells alive at generation zero. Conway is liveliest around a third; the edges of this slider are where a rule shows what it does when starved or flooded."},{"name":"generations","type":"int","label":"Generations","default":240,"min":1,"max":900,"step":1},{"name":"mode","type":"enum","label":"Draw","default":"exposure","options":{"exposure":"Long exposure (the whole run)","state":"Final generation only"}},{"name":"palette","type":"enum","label":"Colour","default":"magma","options":{"golden":"Golden angle","analogous":"Analogous","complementary":"Complementary","triadic":"Triadic","split":"Split complementary","viridis":"Viridis (perceptually uniform)","magma":"Magma (perceptually uniform)","mono":"Monochrome"}},{"name":"colours","type":"int","label":"Palette size","default":6,"min":2,"max":12,"step":1}]},{"key":"patterns.reaction","name":"Reaction\u2013Diffusion","tagline":"Gray\u2013Scott, run until the pattern stops moving.","module":"patterns","renderer":"canvas","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain","image\/png"],"params":[{"name":"width","type":"int","label":"Width","default":900,"min":200,"max":2048,"step":1},{"name":"height","type":"int","label":"Height","default":600,"min":200,"max":2048,"step":1},{"name":"preset","type":"enum","label":"Pattern","default":"coral","options":{"mitosis":"Mitosis \u2014 dividing cells","coral":"Coral growth","solitons":"Solitons","labyrinth":"Labyrinth","spots":"Pulsating spots","custom":"Custom (use the sliders)"}},{"name":"feed","type":"float","label":"Feed rate F","default":0.035,"min":0.005,"max":0.09,"step":0.001,"help":"Only used when the preset is Custom. Most of this range is a field that dies within a few hundred steps \u2014 that is the honest shape of the parameter space."},{"name":"kill","type":"float","label":"Kill rate k","default":0.065,"min":0.03,"max":0.075,"step":0.001,"help":"Only used when the preset is Custom."},{"name":"grid","type":"int","label":"Grid","default":192,"min":96,"max":288,"step":1,"help":"The simulation runs on a square grid and is sampled up to the canvas, so this is detail, not size."},{"name":"steps","type":"int","label":"Steps","default":3200,"min":200,"max":12000,"step":1,"help":"How long the reaction runs. Capped against the grid size so a slider drag cannot lock the tab."},{"name":"du","type":"float","label":"Diffusion of u","default":1,"min":0.2,"max":1.2,"step":0.05},{"name":"dv","type":"float","label":"Diffusion of v","default":0.5,"min":0.1,"max":0.7,"step":0.05},{"name":"seeds","type":"int","label":"Seed patches","default":14,"min":1,"max":60,"step":1,"help":"The initial disturbance. Everything on screen grows out of these."},{"name":"palette","type":"enum","label":"Colour","default":"magma","options":{"golden":"Golden angle","analogous":"Analogous","complementary":"Complementary","triadic":"Triadic","split":"Split complementary","viridis":"Viridis (perceptually uniform)","magma":"Magma (perceptually uniform)","mono":"Monochrome"}},{"name":"colours","type":"int","label":"Palette size","default":6,"min":2,"max":12,"step":1},{"name":"contours","type":"bool","label":"Banding","default":false},{"name":"invert","type":"bool","label":"Invert","default":false}]},{"key":"patterns.truchet","name":"Truchet Tiles","tagline":"Random tile orientation. Instant beauty, ten lines of code.","module":"patterns","renderer":"canvas","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain","image\/png"],"params":[{"name":"width","type":"int","label":"Width","default":900,"min":200,"max":2048,"step":1},{"name":"height","type":"int","label":"Height","default":600,"min":200,"max":2048,"step":1},{"name":"tiles","type":"int","label":"Tiles across","default":14,"min":3,"max":72,"step":1},{"name":"set","type":"enum","label":"Tile set","default":"arcs","options":{"arcs":"Quarter arcs","diagonals":"Diagonals","triangles":"Triangles","mixed":"Mixed (a set per tile)"}},{"name":"weight","type":"float","label":"Line weight","default":0.2,"min":0.02,"max":0.7,"step":0.02,"help":"As a fraction of a tile. Past about 0.5 the lines meet and the negative space becomes the pattern \u2014 worth pushing."},{"name":"colouring","type":"enum","label":"Ink","default":"diagonal","options":{"flat":"One ink","diagonal":"Graded across the canvas","tile":"A colour per tile"}},{"name":"palette","type":"enum","label":"Colour","default":"golden","options":{"golden":"Golden angle","analogous":"Analogous","complementary":"Complementary","triadic":"Triadic","split":"Split complementary","viridis":"Viridis (perceptually uniform)","magma":"Magma (perceptually uniform)","mono":"Monochrome"}},{"name":"colours","type":"int","label":"Palette size","default":6,"min":2,"max":12,"step":1}]},{"key":"patterns.poisson","name":"Blue Noise","tagline":"Poisson-disk beside uniform random \u2014 the difference is the lesson.","module":"patterns","renderer":"canvas","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain","image\/png"],"params":[{"name":"width","type":"int","label":"Width","default":900,"min":200,"max":2048,"step":1},{"name":"height","type":"int","label":"Height","default":600,"min":200,"max":2048,"step":1},{"name":"mode","type":"enum","label":"Show","default":"compare","options":{"compare":"Both, side by side","blue":"Blue noise only","uniform":"Uniform random only"}},{"name":"radius","type":"float","label":"Minimum separation","default":17,"min":5,"max":90,"step":0.5,"help":"In pixels. No two blue-noise points are ever closer than this; the uniform panel gets the same number of points and no such promise."},{"name":"candidates","type":"int","label":"Candidates per point","default":30,"min":4,"max":60,"step":1,"help":"Bridson's k. Each accepted point gets this many attempts at a neighbour before it is retired. Low values leave gaps."},{"name":"dot","type":"float","label":"Dot size","default":3,"min":0.6,"max":12,"step":0.2},{"name":"colouring","type":"enum","label":"Colour dots by","default":"nearest","options":{"nearest":"Distance to nearest neighbour","flat":"Flat"},"help":"The measurement that separates the two panels: blue noise has almost none of it, uniform random has all of it."},{"name":"palette","type":"enum","label":"Colour","default":"magma","options":{"golden":"Golden angle","analogous":"Analogous","complementary":"Complementary","triadic":"Triadic","split":"Split complementary","viridis":"Viridis (perceptually uniform)","magma":"Magma (perceptually uniform)","mono":"Monochrome"}},{"name":"colours","type":"int","label":"Palette size","default":7,"min":2,"max":12,"step":1}]},{"key":"patterns.voronoi","name":"Voronoi","tagline":"Cells from random sites, coloured so no two neighbours match.","module":"patterns","renderer":"canvas","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain","image\/png"],"params":[{"name":"width","type":"int","label":"Width","default":900,"min":200,"max":2048,"step":1},{"name":"height","type":"int","label":"Height","default":600,"min":200,"max":2048,"step":1},{"name":"sites","type":"int","label":"Cells","default":90,"min":4,"max":220,"step":1},{"name":"colouring","type":"enum","label":"Colour cells by","default":"cell","options":{"cell":"Identity (no two neighbours alike)","area":"Area"}},{"name":"edges","type":"float","label":"Border thickness","default":1.6,"min":0,"max":8,"step":0.2,"help":"A border is where the nearest and second-nearest sites are equally far away. Zero draws none."},{"name":"dots","type":"bool","label":"Mark the sites","default":false,"help":"The point each cell grew from."},{"name":"palette","type":"enum","label":"Colour","default":"golden","options":{"golden":"Golden angle","analogous":"Analogous","complementary":"Complementary","triadic":"Triadic","split":"Split complementary","viridis":"Viridis (perceptually uniform)","magma":"Magma (perceptually uniform)","mono":"Monochrome"}},{"name":"colours","type":"int","label":"Palette size","default":8,"min":3,"max":12,"step":1}]},{"key":"patterns.maze","name":"Mazes","tagline":"DFS, Kruskal and Wilson side by side \u2014 algorithm as bias.","module":"patterns","renderer":"canvas","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain","image\/png"],"params":[{"name":"width","type":"int","label":"Width","default":900,"min":200,"max":2048,"step":1},{"name":"height","type":"int","label":"Height","default":600,"min":200,"max":2048,"step":1},{"name":"algorithm","type":"enum","label":"Algorithm","default":"compare","options":{"compare":"All three, side by side","dfs":"Randomised DFS","kruskal":"Kruskal","wilson":"Wilson's"}},{"name":"cell","type":"int","label":"Cell size","default":18,"min":8,"max":64,"step":1,"help":"In pixels. Grown automatically if the grid would otherwise be too large to carve."},{"name":"wall","type":"float","label":"Wall thickness","default":0.18,"min":0.04,"max":0.5,"step":0.02,"help":"As a fraction of a cell."},{"name":"colouring","type":"enum","label":"Colour the floor by","default":"depth","options":{"depth":"Distance from the corner","plain":"Flat"},"help":"Distance is where the bias becomes visible: DFS stretches one long gradient, the other two spread outwards."},{"name":"palette","type":"enum","label":"Colour","default":"viridis","options":{"golden":"Golden angle","analogous":"Analogous","complementary":"Complementary","triadic":"Triadic","split":"Split complementary","viridis":"Viridis (perceptually uniform)","magma":"Magma (perceptually uniform)","mono":"Monochrome"}},{"name":"colours","type":"int","label":"Palette size","default":8,"min":2,"max":12,"step":1}]},{"key":"patterns.lsystem","name":"L-Systems","tagline":"Stochastic rewrite rules: plants, snowflakes, dragon curves.","module":"patterns","renderer":"canvas","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain","image\/png"],"params":[{"name":"width","type":"int","label":"Width","default":900,"min":200,"max":2048,"step":1},{"name":"height","type":"int","label":"Height","default":600,"min":200,"max":2048,"step":1},{"name":"preset","type":"enum","label":"System","default":"plant","options":{"plant":"Plant (stochastic)","koch":"Koch snowflake","dragon":"Dragon curve","sierpinski":"Sierpi\u0144ski triangle"}},{"name":"iterations","type":"int","label":"Iterations","default":0,"min":0,"max":14,"step":1,"help":"Zero uses the preset's own depth. Each iteration rewrites every symbol at once, so the string grows geometrically."},{"name":"angle","type":"float","label":"Turn angle","default":0,"min":0,"max":180,"step":0.5,"help":"Zero uses the preset's own angle. The single most dramatic control here \u2014 a plant at 90\u00b0 is a lattice."},{"name":"stochastic","type":"float","label":"Randomness","default":1,"min":0,"max":1,"step":0.05,"help":"How freely the branching rules choose between their alternatives, and how much the turns and internodes wander. Only the plant has alternatives; the other three are textbook figures and ignore this."},{"name":"thickness","type":"float","label":"Line weight","default":2,"min":0.4,"max":6,"step":0.1},{"name":"palette","type":"enum","label":"Colour","default":"viridis","options":{"golden":"Golden angle","analogous":"Analogous","complementary":"Complementary","triadic":"Triadic","split":"Split complementary","viridis":"Viridis (perceptually uniform)","magma":"Magma (perceptually uniform)","mono":"Monochrome"}},{"name":"colours","type":"int","label":"Palette size","default":7,"min":2,"max":12,"step":1}]},{"key":"patterns.wfc","name":"Wave Function Collapse","tagline":"Overlapping model, min-entropy heuristic, backtracking.","module":"patterns","renderer":"canvas","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain","image\/png"],"params":[{"name":"width","type":"int","label":"Width","default":960,"min":200,"max":2048,"step":1},{"name":"height","type":"int","label":"Height","default":640,"min":200,"max":2048,"step":1},{"name":"sample","type":"enum","label":"Sample","default":"knot","options":{"knot":"Knot","maze":"Maze","rooms":"Rooms","circuit":"Circuit","weave":"Weave","blossoms":"Blossoms"}},{"name":"n","type":"int","label":"Window size (N)","default":3,"min":2,"max":3,"step":1,"help":"How much context a pattern carries. N = 2 knows only which pairs of cells may touch and produces something loose; N = 3 knows whole corners, and is where the output starts looking authored."},{"name":"symmetry","type":"enum","label":"Symmetry","default":"8","options":{"1":"None \u2014 the sample as drawn","2":"Mirrored","4":"All four rotations","8":"Rotations and mirrors"},"help":"Which transforms of each pattern are also admitted. More symmetry means a richer output from the same sample, and a larger pattern set to propagate through."},{"name":"tiles","type":"int","label":"Cells across","default":74,"min":8,"max":140,"step":1,"help":"Measured across the long side. The solve is cells \u00d7 patterns \u00d7 adjacency, so this is the control that decides whether the render is instant or merely fast."},{"name":"palette","type":"enum","label":"Colour","default":"viridis","options":{"golden":"Golden angle","analogous":"Analogous","complementary":"Complementary","triadic":"Triadic","split":"Split complementary","viridis":"Viridis (perceptually uniform)","magma":"Magma (perceptually uniform)","mono":"Monochrome"}},{"name":"grain","type":"float","label":"Grain","default":0.01,"min":0,"max":0.06,"step":0.002}]},{"key":"patterns.walk","name":"Random Walks","tagline":"Brownian, self-avoiding and L\u00e9vy \u2014 the fat tail is visible.","module":"patterns","renderer":"canvas","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain","image\/png"],"params":[{"name":"width","type":"int","label":"Width","default":1100,"min":200,"max":2048,"step":1},{"name":"height","type":"int","label":"Height","default":620,"min":200,"max":2048,"step":1},{"name":"mode","type":"enum","label":"Walk","default":"compare","options":{"compare":"All three, side by side","brownian":"Brownian only","levy":"L\u00e9vy flight only","saw":"Self-avoiding only"}},{"name":"walkers","type":"int","label":"Walkers","default":22,"min":1,"max":160,"step":1,"help":"Each one is an independent walk and is never reused."},{"name":"steps","type":"int","label":"Steps each","default":2600,"min":20,"max":20000,"step":1},{"name":"tail","type":"float","label":"L\u00e9vy tail \u03b1","default":1.35,"min":1.05,"max":3,"step":0.05,"help":"The Pareto exponent. Below 2 the variance is infinite and the walk is dominated by its rare huge jumps; above 2 the central limit theorem takes back over and it becomes Brownian again."},{"name":"spread","type":"float","label":"Coverage","default":0.85,"min":0.2,"max":1.6,"step":0.05,"help":"How much of the frame a typical walk should reach. Step length is solved backwards from this and each mode's own scaling exponent, so all three fill the frame the same amount however many steps you ask for."},{"name":"start","type":"enum","label":"Start from","default":"centre","options":{"centre":"The centre of the panel","scattered":"Anywhere"}},{"name":"alpha","type":"float","label":"Line alpha","default":0.11,"min":0.01,"max":0.9,"step":0.005,"help":"Per-segment opacity. A walk that crosses its own path a thousand times is drawn out of the overlap, so this wants to stay low."},{"name":"line","type":"float","label":"Line width","default":1.2,"min":0.4,"max":4,"step":0.1},{"name":"glow","type":"bool","label":"Additive blending","default":true},{"name":"background","type":"enum","label":"Ground","default":"ink","options":{"ink":"Ink","paper":"Paper","palette":"From the palette"}},{"name":"palette","type":"enum","label":"Colour","default":"golden","options":{"golden":"Golden angle","analogous":"Analogous","complementary":"Complementary","triadic":"Triadic","split":"Split complementary","viridis":"Viridis (perceptually uniform)","magma":"Magma (perceptually uniform)","mono":"Monochrome"}},{"name":"colours","type":"int","label":"Palette size","default":6,"min":2,"max":12,"step":1},{"name":"grain","type":"float","label":"Grain","default":0.016,"min":0,"max":0.08,"step":0.002}]},{"key":"patterns.dla","name":"Diffusion-Limited Aggregation","tagline":"Dendritic crystals, grown one sticky particle at a time.","module":"patterns","renderer":"canvas","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain","image\/png"],"params":[{"name":"width","type":"int","label":"Width","default":880,"min":200,"max":2048,"step":1},{"name":"height","type":"int","label":"Height","default":800,"min":200,"max":2048,"step":1},{"name":"seed_shape","type":"enum","label":"Grow from","default":"point","options":{"point":"A single seed in the middle","line":"A seeded floor (a forest of spires)"}},{"name":"particles","type":"int","label":"Particles","default":7000,"min":200,"max":40000,"step":1,"help":"Every one of them is walked until it touches, which is the entire cost of the render. The run ends at this count or when the cluster reaches the edge of its lattice, whichever comes first \u2014 and the finished cluster is then fitted to the frame, so fewer particles means a chunkier crystal rather than a smaller one."},{"name":"cell","type":"int","label":"Lattice","default":2,"min":1,"max":10,"step":1,"help":"The lattice the crystal grows on, as a divisor of the canvas. A finer lattice grows a cluster with finer branches, and costs a great deal more walking: halving this roughly triples the render."},{"name":"stickiness","type":"float","label":"Stickiness","default":1,"min":0.02,"max":1,"step":0.02,"help":"The chance a particle freezes when it touches. Below 1 it can work its way into the crevices before committing, which thickens the branches and pushes the fractal dimension towards 2 \u2014 frost at one end of this slider, sponge at the other."},{"name":"glow","type":"float","label":"Glow","default":0.05,"min":0,"max":0.3,"step":0.005,"help":"A wide, faint halo under every particle, added rather than painted. Haloes overlap where the cluster is dense, so the trunk lights up and a lone tip does not."},{"name":"background","type":"enum","label":"Ground","default":"ink","options":{"ink":"Ink","paper":"Paper","palette":"From the palette"}},{"name":"palette","type":"enum","label":"Colour","default":"viridis","options":{"golden":"Golden angle","analogous":"Analogous","complementary":"Complementary","triadic":"Triadic","split":"Split complementary","viridis":"Viridis (perceptually uniform)","magma":"Magma (perceptually uniform)","mono":"Monochrome"}},{"name":"colours","type":"int","label":"Palette size","default":7,"min":2,"max":12,"step":1},{"name":"grain","type":"float","label":"Grain","default":0.014,"min":0,"max":0.08,"step":0.002}]},{"key":"images.flowfield","name":"Flow Field","tagline":"Thousands of particles advected through fractal noise.","module":"images","renderer":"canvas","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain","image\/png"],"params":[{"name":"width","type":"int","label":"Width","default":1200,"min":256,"max":2048,"step":1},{"name":"height","type":"int","label":"Height","default":750,"min":256,"max":2048,"step":1},{"name":"particles","type":"int","label":"Particles","default":1500,"min":100,"max":2500,"step":1,"help":"Each one traces a single trail and is never reused."},{"name":"trail","type":"int","label":"Trail length","default":190,"min":10,"max":420,"step":1,"help":"Steps before a particle runs out. Long trails cross the whole canvas; short ones read as brushwork."},{"name":"step","type":"float","label":"Step length","default":1.6,"min":0.4,"max":6,"step":0.1,"help":"Pixels advanced per step. Small steps hug the field, large ones cut across it."},{"name":"scale","type":"float","label":"Field zoom","default":2.2,"min":0.4,"max":9,"step":0.1,"help":"How many noise cells fit across the canvas."},{"name":"octaves","type":"int","label":"Detail (octaves)","default":4,"min":1,"max":7,"step":1},{"name":"turns","type":"float","label":"Angular range","default":1,"min":0.2,"max":3,"step":0.05,"help":"How many full turns the noise maps onto. Below 1 the flow stays combed in one direction; above 2 it knots."},{"name":"alpha","type":"float","label":"Line alpha","default":0.2,"min":0.01,"max":0.8,"step":0.005,"help":"Per-segment opacity. The picture is the overlap, so this wants to stay low."},{"name":"line","type":"float","label":"Line width","default":1.1,"min":0.4,"max":4,"step":0.1},{"name":"glow","type":"bool","label":"Additive blending","default":true,"help":"Trails add their light together instead of painting over each other. On a dark ground this is the whole look."},{"name":"background","type":"enum","label":"Ground","default":"ink","options":{"ink":"Ink","ground":"Site ground","paper":"Paper","palette":"From the palette"}},{"name":"palette","type":"enum","label":"Colour","default":"golden","options":{"golden":"Golden angle","analogous":"Analogous","complementary":"Complementary","triadic":"Triadic","split":"Split complementary","viridis":"Viridis (perceptually uniform)","magma":"Magma (perceptually uniform)","mono":"Monochrome"}},{"name":"colours","type":"int","label":"Palette size","default":6,"min":2,"max":12,"step":1},{"name":"grain","type":"float","label":"Grain","default":0.018,"min":0,"max":0.08,"step":0.002,"help":"Per-pixel noise over the finished render. A little of it is the difference between generative and computer-made."}]},{"key":"images.blob","name":"Superformula","tagline":"One equation: starfish, gears, leaves, sea urchins.","module":"images","renderer":"canvas","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain","image\/png"],"params":[{"name":"width","type":"int","label":"Width","default":900,"min":256,"max":2048,"step":1},{"name":"height","type":"int","label":"Height","default":900,"min":256,"max":2048,"step":1},{"name":"clusters","type":"int","label":"Specimens","default":5,"min":1,"max":9,"step":1,"help":"The first one is the subject and runs off the edges of the frame; the rest are companions settled around it, each an independent draw of m, n\u2081, n\u2082 and n\u2083."},{"name":"rings","type":"int","label":"Bands","default":5,"min":1,"max":14,"step":1,"help":"Concentric copies of the same shape, shrinking inwards and walking the palette as they go. Few and opaque reads as a body; many and thin reads as a scribble."},{"name":"symmetry","type":"int","label":"Symmetry (m)","default":0,"min":0,"max":16,"step":1,"help":"Below 3, the seed draws m per shape \u2014 the surprise-me setting. Above it, every shape is pinned to the same fold count."},{"name":"morph","type":"float","label":"Morph","default":0.3,"min":0,"max":1.5,"step":0.02,"help":"How far n\u2081, n\u2082 and n\u2083 drift between the outer band and the innermost one. At zero the bands are concentric copies."},{"name":"twist","type":"float","label":"Twist","default":0,"min":0,"max":2,"step":0.01,"help":"Rotation accumulated from band to band, in turns. A little offsets the lobes; past a tenth or so the bands stop lining up and the shape turns into interference."},{"name":"spread","type":"float","label":"Scatter","default":0.5,"min":0,"max":1,"step":0.02,"help":"How far the companions sit from the subject. At zero they crowd into it; at one they stand clear of it."},{"name":"fill","type":"float","label":"Fill opacity","default":0.92,"min":0,"max":1,"step":0.01,"help":"Zero leaves pure outlines. Near one, each band covers the one outside it and the specimen reads as a solid."},{"name":"line","type":"float","label":"Outline width","default":1,"min":0,"max":8,"step":0.1,"help":"Zero leaves pure fills."},{"name":"background","type":"enum","label":"Ground","default":"ink","options":{"ink":"Ink","ground":"Site ground","paper":"Paper","palette":"From the palette"}},{"name":"palette","type":"enum","label":"Colour","default":"golden","options":{"golden":"Golden angle","analogous":"Analogous","complementary":"Complementary","triadic":"Triadic","split":"Split complementary","viridis":"Viridis (perceptually uniform)","magma":"Magma (perceptually uniform)","mono":"Monochrome"}},{"name":"colours","type":"int","label":"Palette size","default":6,"min":2,"max":12,"step":1},{"name":"grain","type":"float","label":"Grain","default":0.016,"min":0,"max":0.08,"step":0.002}]},{"key":"images.identicon","name":"Identicon","tagline":"A deterministic avatar from a hash. Same input, same face.","module":"images","renderer":"canvas","version":1,"sensitive":false,"reproducible":true,"uses_entropy":false,"formats":["application\/json","text\/plain","image\/png"],"params":[{"name":"input","type":"string","label":"Input","default":"randomly","max":96,"help":"Anything at all \u2014 a username, an email, a commit hash. This, and nothing else, decides what you get."},{"name":"size","type":"int","label":"Size","default":512,"min":128,"max":1024,"step":1},{"name":"cells","type":"int","label":"Grid","default":5,"min":3,"max":9,"step":1,"help":"A 5\u00d75 grid mirrored down the middle needs only 15 bits, which is why identicons were 5\u00d75 long before anyone had bits to spare."},{"name":"shape","type":"enum","label":"Cell shape","default":"auto","options":{"auto":"From the hash","square":"Square","circle":"Circle","triangle":"Triangle","diamond":"Diamond"}},{"name":"two_tone","type":"bool","label":"Two tone","default":true,"help":"A second hue, 50\u00b0 along, for roughly half the live cells."},{"name":"padding","type":"float","label":"Padding","default":0.14,"min":0,"max":0.35,"step":0.01},{"name":"gap","type":"float","label":"Cell gap","default":0.06,"min":0,"max":0.4,"step":0.01},{"name":"background","type":"enum","label":"Ground","default":"tint","options":{"tint":"Tinted","paper":"Paper","ink":"Ink"}},{"name":"grain","type":"float","label":"Grain","default":0.012,"min":0,"max":0.08,"step":0.002}]},{"key":"images.circles","name":"Circle Packing","tagline":"Grow until collision, keep what fits.","module":"images","renderer":"canvas","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain","image\/png"],"params":[{"name":"width","type":"int","label":"Width","default":1100,"min":256,"max":2048,"step":1},{"name":"height","type":"int","label":"Height","default":760,"min":256,"max":2048,"step":1},{"name":"attempts","type":"int","label":"Darts thrown","default":26000,"min":500,"max":90000,"step":1,"help":"Candidate points tried. Most of the late ones land inside a circle that already exists and are thrown away; the ones that survive are what fills the gaps."},{"name":"min_radius","type":"float","label":"Smallest circle","default":3,"min":1,"max":40,"step":0.5,"help":"Candidates that cannot grow this large are discarded. Raise it and the gaps between the big circles stay open."},{"name":"max_radius","type":"float","label":"Largest circle","default":95,"min":8,"max":320,"step":1},{"name":"gap","type":"float","label":"Gap","default":2.5,"min":0,"max":24,"step":0.5,"help":"Clear space kept between circles. At zero they touch exactly, which is the true packing and reads as denser than it is."},{"name":"style","type":"enum","label":"Draw as","default":"mixed","options":{"filled":"Filled","rings":"Outlined","nested":"Nested rings","mixed":"Mixed fill and outline"}},{"name":"weight","type":"float","label":"Stroke weight","default":0.14,"min":0.03,"max":0.5,"step":0.01,"help":"As a fraction of each circle's own radius, so a large circle is drawn more boldly than a small one rather than the same."},{"name":"colouring","type":"enum","label":"Colour by","default":"field","options":{"radius":"By size","field":"By a noise field","order":"By arrival order"}},{"name":"background","type":"enum","label":"Ground","default":"ink","options":{"ink":"Ink","ground":"Site ground","paper":"Paper","palette":"From the palette"}},{"name":"palette","type":"enum","label":"Colour","default":"golden","options":{"golden":"Golden angle","analogous":"Analogous","complementary":"Complementary","triadic":"Triadic","split":"Split complementary","viridis":"Viridis (perceptually uniform)","magma":"Magma (perceptually uniform)","mono":"Monochrome"}},{"name":"colours","type":"int","label":"Palette size","default":6,"min":2,"max":12,"step":1},{"name":"grain","type":"float","label":"Grain","default":0.014,"min":0,"max":0.08,"step":0.002}]},{"key":"images.mondrian","name":"Mondrian","tagline":"Recursive subdivision, split at U(0.3, 0.7).","module":"images","renderer":"canvas","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain","image\/png"],"params":[{"name":"width","type":"int","label":"Width","default":900,"min":256,"max":2048,"step":1},{"name":"height","type":"int","label":"Height","default":900,"min":256,"max":2048,"step":1},{"name":"cut_min","type":"float","label":"Cut range, low","default":0.3,"min":0.02,"max":0.5,"step":0.01,"help":"Where along a rectangle a cut may fall. Push this to 0.02 and the composition shreds into slivers; push it to 0.5 and every cut lands in the middle, which is a grid."},{"name":"threshold","type":"float","label":"Stop below","default":0.035,"min":0.002,"max":0.25,"step":0.002,"help":"A rectangle smaller than this fraction of the canvas is left whole. The single strongest control over how busy the result is."},{"name":"squareness","type":"float","label":"Cut the long side","default":0.78,"min":0,"max":1,"step":0.02,"help":"How often a cut crosses the longer side. At 1 every rectangle is pushed towards square; at 0 the composition drifts into long bands."},{"name":"fill","type":"float","label":"Painted cells","default":0.34,"min":0,"max":1,"step":0.02,"help":"The fraction that get a colour rather than staying paper. Mondrian used very few, and a canvas that is mostly colour stops reading as a composition and starts reading as a quilt."},{"name":"stroke","type":"float","label":"Line weight","default":9,"min":0,"max":30,"step":0.5,"help":"The gutter between cells, in pixels. The lines are not drawn \u2014 they are the ground showing through."},{"name":"background","type":"enum","label":"Lines","default":"ink","options":{"ink":"Ink","ground":"Site ground","paper":"Paper","palette":"From the palette"}},{"name":"paper","type":"bool","label":"Unpainted cells are white","default":true,"help":"Off, the unpainted cells take the palette's lightest stop instead, which keeps the whole composition inside one colour scheme."},{"name":"palette","type":"enum","label":"Colour","default":"triadic","options":{"golden":"Golden angle","analogous":"Analogous","complementary":"Complementary","triadic":"Triadic","split":"Split complementary","viridis":"Viridis (perceptually uniform)","magma":"Magma (perceptually uniform)","mono":"Monochrome"}},{"name":"colours","type":"int","label":"Palette size","default":5,"min":2,"max":10,"step":1},{"name":"grain","type":"float","label":"Grain","default":0.012,"min":0,"max":0.08,"step":0.002}]},{"key":"images.gradient","name":"Mesh Gradient","tagline":"Random control points, dithered to kill the banding.","module":"images","renderer":"canvas","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain","image\/png"],"params":[{"name":"width","type":"int","label":"Width","default":1200,"min":256,"max":2048,"step":1},{"name":"height","type":"int","label":"Height","default":800,"min":256,"max":2048,"step":1},{"name":"stops","type":"int","label":"Control points","default":10,"min":2,"max":18,"step":1,"help":"Each one holds a colour and pulls the field towards it."},{"name":"blend","type":"enum","label":"Blend","default":"soft","options":{"soft":"Gaussian (soft wash)","sharp":"Shepard (stained glass)"}},{"name":"falloff","type":"float","label":"Softness","default":0.42,"min":0.18,"max":1.8,"step":0.02,"help":"The Gaussian width, measured in the typical spacing between control points rather than in pixels \u2014 so adding points does not also change how soft the blend is."},{"name":"power","type":"float","label":"Shepard exponent","default":2.6,"min":1,"max":8,"step":0.1,"help":"Only used by the stained-glass blend. Higher values flatten the cell interiors and tighten the boundaries between them."},{"name":"warp","type":"float","label":"Domain warp","default":0.18,"min":0,"max":0.6,"step":0.01,"help":"Displaces each pixel through a noise field before the blend is evaluated. The isolines stop being circles and start folding around each other, which is what makes a gradient look poured rather than computed."},{"name":"warp_scale","type":"float","label":"Warp zoom","default":2.2,"min":0.4,"max":8,"step":0.1},{"name":"dither","type":"float","label":"Dither","default":1,"min":0,"max":4,"step":0.1,"help":"Ordered dither amplitude, in output levels. One level is the right answer; zero is there so you can see the banding it prevents."},{"name":"palette","type":"enum","label":"Colour","default":"split","options":{"golden":"Golden angle","analogous":"Analogous","complementary":"Complementary","triadic":"Triadic","split":"Split complementary","viridis":"Viridis (perceptually uniform)","magma":"Magma (perceptually uniform)","mono":"Monochrome"}},{"name":"colours","type":"int","label":"Palette size","default":7,"min":2,"max":12,"step":1},{"name":"grain","type":"float","label":"Grain","default":0.006,"min":0,"max":0.06,"step":0.002,"help":"Film grain over the finished render, on top of the dither. The two do different jobs: the dither hides quantisation, the grain gives the surface a texture."}]},{"key":"images.spray","name":"Particle Spray","tagline":"A Gaussian mixture with k random components.","module":"images","renderer":"canvas","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain","image\/png"],"params":[{"name":"width","type":"int","label":"Width","default":1200,"min":256,"max":2048,"step":1},{"name":"height","type":"int","label":"Height","default":800,"min":256,"max":2048,"step":1},{"name":"components","type":"int","label":"Components","default":5,"min":1,"max":10,"step":1,"help":"How many Gaussians the mixture is made of. One is a fuzzy dot; the interest is entirely in how several overlap."},{"name":"particles","type":"int","label":"Particles","default":450000,"min":5000,"max":900000,"step":1,"help":"Samples drawn from the mixture. The image is their density, so this is a grain control as much as a quantity one."},{"name":"spread","type":"float","label":"Component size","default":0.12,"min":0.02,"max":0.6,"step":0.01,"help":"The typical standard deviation, as a fraction of the short side."},{"name":"anisotropy","type":"float","label":"Elongation","default":3.4,"min":1,"max":9,"step":0.1,"help":"The most a component's two axes may differ. At 1 every component is a circular blur; above 3 they become strokes with a direction, which is what stops the result looking like spilt milk."},{"name":"alpha","type":"float","label":"Particle alpha","default":0.11,"min":0.004,"max":0.3,"step":0.002,"help":"Per-particle opacity. The picture is the accumulation, so this wants to stay low."},{"name":"radius","type":"float","label":"Particle size","default":1,"min":0.3,"max":4,"step":0.05},{"name":"glow","type":"bool","label":"Additive blending","default":true,"help":"Particles add their light together instead of painting over each other. On a dark ground this is the whole look."},{"name":"drift","type":"float","label":"Halo drift","default":0.16,"min":0,"max":0.5,"step":0.01,"help":"How far along the palette a particle travels as it lands further from its component's centre \u2014 so a core is one colour and its halo another."},{"name":"background","type":"enum","label":"Ground","default":"ink","options":{"ink":"Ink","ground":"Site ground","paper":"Paper","palette":"From the palette"}},{"name":"palette","type":"enum","label":"Colour","default":"magma","options":{"golden":"Golden angle","analogous":"Analogous","complementary":"Complementary","triadic":"Triadic","split":"Split complementary","viridis":"Viridis (perceptually uniform)","magma":"Magma (perceptually uniform)","mono":"Monochrome"}},{"name":"colours","type":"int","label":"Palette size","default":7,"min":2,"max":12,"step":1},{"name":"grain","type":"float","label":"Grain","default":0.012,"min":0,"max":0.08,"step":0.002}]},{"key":"images.tiles","name":"Glyph Grid","tagline":"A random glyph and rotation per cell.","module":"images","renderer":"canvas","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain","image\/png"],"params":[{"name":"width","type":"int","label":"Width","default":1000,"min":256,"max":2048,"step":1},{"name":"height","type":"int","label":"Height","default":1000,"min":256,"max":2048,"step":1},{"name":"tiles","type":"int","label":"Tiles across","default":12,"min":2,"max":64,"step":1,"help":"Measured across the long side, so a landscape canvas gets square cells rather than stretched ones."},{"name":"set","type":"enum","label":"Glyphs","default":"all","options":{"all":"Everything","curves":"Curves only","lines":"Lines only","solids":"Solids only"},"help":"Curves alone read as plumbing, lines alone as a circuit diagram, solids alone as a quilt. All three together is the busiest and usually the best."},{"name":"weight","type":"float","label":"Stroke weight","default":0.17,"min":0.03,"max":0.5,"step":0.01,"help":"As a fraction of a cell. Past about 0.35 the strokes meet their neighbours and the negative space becomes the pattern."},{"name":"density","type":"float","label":"Filled cells","default":0.82,"min":0.05,"max":1,"step":0.02,"help":"How often a cell gets a glyph at all. The empty ones are what give the grid somewhere to breathe."},{"name":"panel","type":"float","label":"Coloured panels","default":0.22,"min":0,"max":1,"step":0.02,"help":"How often a cell gets a filled ground under its glyph. These clump into fields and give the composition a scale larger than one tile."},{"name":"panel_alpha","type":"float","label":"Panel opacity","default":0.5,"min":0.05,"max":1,"step":0.05},{"name":"background","type":"enum","label":"Ground","default":"paper","options":{"ink":"Ink","ground":"Site ground","paper":"Paper","palette":"From the palette"}},{"name":"palette","type":"enum","label":"Colour","default":"split","options":{"golden":"Golden angle","analogous":"Analogous","complementary":"Complementary","triadic":"Triadic","split":"Split complementary","viridis":"Viridis (perceptually uniform)","magma":"Magma (perceptually uniform)","mono":"Monochrome"}},{"name":"colours","type":"int","label":"Palette size","default":6,"min":2,"max":12,"step":1},{"name":"grain","type":"float","label":"Grain","default":0.012,"min":0,"max":0.08,"step":0.002}]},{"key":"images.strata","name":"Strata","tagline":"Band heights from a Dirichlet draw, colours walking a palette.","module":"images","renderer":"canvas","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain","image\/png"],"params":[{"name":"width","type":"int","label":"Width","default":1000,"min":256,"max":2048,"step":1},{"name":"height","type":"int","label":"Height","default":1300,"min":256,"max":2048,"step":1},{"name":"bands","type":"int","label":"Bands","default":22,"min":2,"max":70,"step":1},{"name":"concentration","type":"float","label":"Dirichlet \u03b1","default":0.85,"min":0.15,"max":6,"step":0.05,"help":"Below 1, a few bands take almost everything and the rest are hairlines. At 1 the heights are as unstructured as heights can be. Above 3 they all converge on the same thickness, which is a colour chart rather than a cliff."},{"name":"roughness","type":"float","label":"Boundary wander","default":0.05,"min":0,"max":0.3,"step":0.005,"help":"How far a boundary strays from its nominal height, as a fraction of the canvas. Zero draws a bar chart; this is the single control that makes it rock."},{"name":"frequency","type":"float","label":"Wander scale","default":2.6,"min":0.3,"max":12,"step":0.1,"help":"How many undulations fit across the canvas."},{"name":"octaves","type":"int","label":"Boundary detail","default":4,"min":1,"max":7,"step":1,"help":"Octaves in the noise displacing each boundary. One is a smooth wave; more adds the fine crumbling of a real edge."},{"name":"tilt","type":"float","label":"Tilt","default":0.05,"min":0,"max":0.35,"step":0.005,"help":"A linear slope added to each boundary, drawn independently per band \u2014 so the stack shears the way tilted bedding does."},{"name":"shade","type":"float","label":"Within-band shading","default":0.07,"min":-0.25,"max":0.25,"step":0.005,"help":"How far along the palette a band travels between its own top and bottom. Flat fills read as coloured strips; a gradient reads as a surface with light on it."},{"name":"walk","type":"float","label":"Colour step","default":0.11,"min":0.01,"max":0.5,"step":0.01,"help":"How far the colour moves between one band and the next. Small steps keep neighbouring layers related, which is what makes the stack read as one formation."},{"name":"background","type":"enum","label":"Ground","default":"ink","options":{"ink":"Ink","ground":"Site ground","paper":"Paper","palette":"From the palette"}},{"name":"palette","type":"enum","label":"Colour","default":"magma","options":{"golden":"Golden angle","analogous":"Analogous","complementary":"Complementary","triadic":"Triadic","split":"Split complementary","viridis":"Viridis (perceptually uniform)","magma":"Magma (perceptually uniform)","mono":"Monochrome"}},{"name":"colours","type":"int","label":"Palette size","default":8,"min":2,"max":12,"step":1},{"name":"grain","type":"float","label":"Grain","default":0.02,"min":0,"max":0.1,"step":0.002,"help":"Film grain over the finished render. Strata want more of it than most things here \u2014 flat coloured areas are exactly where 8-bit output shows its seams."}]},{"key":"audio.noise","name":"Noise Colours","tagline":"White, pink, brown, blue, violet \u2014 and perceptually flat grey.","module":"audio","renderer":"audio","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain","audio\/wav"],"params":[{"name":"colour","type":"enum","label":"Colour","default":"pink","options":{"white":"White","pink":"Pink","brown":"Brown \/ red","blue":"Blue","violet":"Violet","grey":"Grey"},"help":"A colour is a spectral slope. The measured slope is printed under the waveform."},{"name":"duration","type":"float","label":"Length (seconds)","default":10,"min":2,"max":30,"step":1,"help":"Kept short on purpose \u2014 with Loop on, the buffer is crossfaded into itself and plays forever."},{"name":"loop","type":"bool","label":"Loop","default":true,"help":"Seamless: the tail is crossfaded onto the head, so there is no click at the seam."},{"name":"filter","type":"enum","label":"Filter","default":"none","options":{"none":"None (hear the colour itself)","lowpass":"Low pass (warmer, further away)","highpass":"High pass (thinner, airier)","bandpass":"Band pass (a narrow window)"}},{"name":"cutoff","type":"float","label":"Cutoff (Hz)","default":1200,"min":60,"max":16000,"step":20},{"name":"resonance","type":"float","label":"Resonance (Q)","default":0.7,"min":0.4,"max":8,"step":0.1,"help":"Above about 4 the filter starts to ring, which turns noise into a pitch."},{"name":"movement","type":"float","label":"Movement","default":0.3,"min":0,"max":1,"step":0.05,"help":"How far the cutoff drifts over the loop. A little of this is the difference between a hiss and something that sounds like weather."},{"name":"volume","type":"float","label":"Volume (dBFS)","default":-12,"min":-36,"max":0,"step":1,"help":"Where the mix sits before the master limiter. 0 dBFS is full scale; everything starts 12 dB below it."}]},{"key":"audio.rhythm","name":"Euclidean Rhythm","tagline":"k onsets spread as evenly as possible across n steps \u2014 which is most of the world\u2019s rhythms.","module":"audio","renderer":"audio","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain","audio\/wav"],"params":[{"name":"k","type":"int","label":"Onsets (k)","default":3,"min":1,"max":16,"step":1,"help":"How many hits. k=3, n=8 is the tresillo; the panel names the pattern whenever it recognises one."},{"name":"n","type":"int","label":"Steps (n)","default":8,"min":2,"max":16,"step":1},{"name":"rotation","type":"int","label":"Rotation","default":0,"min":0,"max":15,"step":1,"help":"Which step becomes the downbeat. Same onsets, different rhythm \u2014 this is what separates the cinquillo from the son clave."},{"name":"layers","type":"int","label":"Layers","default":3,"min":1,"max":4,"step":1,"help":"Layer one is yours. The rest draw their own k and n, which is where the polyrhythm comes from."},{"name":"tempo","type":"float","label":"Tempo (BPM)","default":110,"min":50,"max":200,"step":1},{"name":"bars","type":"int","label":"Bars","default":4,"min":1,"max":16,"step":1},{"name":"swing","type":"float","label":"Swing","default":0,"min":0,"max":0.6,"step":0.05,"help":"Delays every second step. At 0.33 the steps land in triplet time, which is where swing comes from."},{"name":"kit","type":"enum","label":"Kit","default":"acoustic","options":{"acoustic":"Acoustic (skins and metal)","electronic":"Electronic (long-tailed 808)","wood":"Wood (claves and blocks)"}},{"name":"volume","type":"float","label":"Volume (dBFS)","default":-12,"min":-36,"max":0,"step":1,"help":"Where the mix sits before the master limiter. 0 dBFS is full scale; everything starts 12 dB below it."}]},{"key":"audio.melody","name":"Melody","tagline":"Random walk, Markov, or the 1\/f kind that sounds written \u2014 on a scale that cannot clash.","module":"audio","renderer":"audio","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain","audio\/wav"],"params":[{"name":"scale","type":"enum","label":"Scale","default":"pentatonic_major","options":{"pentatonic_major":"Major pentatonic (can\u2019t sound wrong)","pentatonic_minor":"Minor pentatonic (blues)","major":"Major (Ionian)","minor":"Natural minor (Aeolian)","dorian":"Dorian (jazzy minor)","phrygian":"Phrygian (dark, Spanish)","lydian":"Lydian (dreamy)","mixolydian":"Mixolydian (bluesy)","blues":"Blues","whole_tone":"Whole tone (unresolved)","hirajoshi":"Hirajoshi (Japanese)"},"help":"The one control that decides whether random notes sound musical. Pentatonic has no semitone in it to clash with."},{"name":"root","type":"enum","label":"Root","default":"C","options":{"C":"C","C#":"C\u266f \/ D\u266d","D":"D","D#":"D\u266f \/ E\u266d","E":"E","F":"F","F#":"F\u266f \/ G\u266d","G":"G","G#":"G\u266f \/ A\u266d","A":"A","A#":"A\u266f \/ B\u266d","B":"B"}},{"name":"octave","type":"int","label":"Octave","default":4,"min":2,"max":5,"step":1,"help":"Octave 4 is middle C."},{"name":"range","type":"int","label":"Range (octaves)","default":2,"min":1,"max":3,"step":1},{"name":"method","type":"enum","label":"Method","default":"walk","options":{"walk":"Bounded random walk (contour)","uniform":"Uniform (aimless, on purpose)","markov":"Markov chain over folk tunes","voss":"1\/f \u2014 the Voss melody"},"help":"Switch between these on the same seed. Uniform is aimless, the walk has contour, Markov has phrasing, 1\/f sits where real music sits."},{"name":"order","type":"int","label":"Markov order","default":2,"min":1,"max":2,"step":1,"help":"Only used by the Markov method. Order 1 is a word salad of intervals; order 2 starts quoting whole phrases."},{"name":"bars","type":"int","label":"Bars","default":8,"min":1,"max":16,"step":1},{"name":"tempo","type":"float","label":"Tempo (BPM)","default":100,"min":50,"max":180,"step":1},{"name":"rate","type":"enum","label":"Note length","default":"1","options":{"0.5":"Half notes","1":"Quarter notes","2":"Eighth notes","4":"Sixteenth notes"}},{"name":"rests","type":"float","label":"Rests","default":0.15,"min":0,"max":0.5,"step":0.05,"help":"How often a note is left out. A melody with no silence in it has no phrases in it."},{"name":"engine","type":"enum","label":"Engine","default":"fm","options":{"fm":"FM (bells, electric piano)","additive":"Additive (organ, glassy)","subtractive":"Subtractive (classic synth)","sine":"Sine (the shape of the notes, and nothing else)"}},{"name":"volume","type":"float","label":"Volume (dBFS)","default":-12,"min":-36,"max":0,"step":1,"help":"Where the mix sits before the master limiter. 0 dBFS is full scale; everything starts 12 dB below it."}]},{"key":"audio.pluck","name":"Plucked Strings","tagline":"Karplus\u2013Strong: fill a delay line with pure noise and a guitar comes out.","module":"audio","renderer":"audio","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain","audio\/wav"],"params":[{"name":"scale","type":"enum","label":"Scale","default":"pentatonic_minor","options":{"pentatonic_major":"Major pentatonic (can\u2019t sound wrong)","pentatonic_minor":"Minor pentatonic (blues)","major":"Major (Ionian)","minor":"Natural minor (Aeolian)","dorian":"Dorian (jazzy minor)","phrygian":"Phrygian (dark, Spanish)","lydian":"Lydian (dreamy)","mixolydian":"Mixolydian (bluesy)","blues":"Blues","whole_tone":"Whole tone (unresolved)","hirajoshi":"Hirajoshi (Japanese)"}},{"name":"root","type":"enum","label":"Root","default":"A","options":{"C":"C","C#":"C\u266f \/ D\u266d","D":"D","D#":"D\u266f \/ E\u266d","E":"E","F":"F","F#":"F\u266f \/ G\u266d","G":"G","G#":"G\u266f \/ A\u266d","A":"A","A#":"A\u266f \/ B\u266d","B":"B"}},{"name":"octave","type":"int","label":"Octave","default":3,"min":1,"max":5,"step":1},{"name":"range","type":"int","label":"Range (octaves)","default":2,"min":1,"max":3,"step":1},{"name":"density","type":"int","label":"Notes per bar","default":4,"min":1,"max":12,"step":1},{"name":"bars","type":"int","label":"Bars","default":8,"min":1,"max":16,"step":1},{"name":"tempo","type":"float","label":"Tempo (BPM)","default":92,"min":50,"max":180,"step":1},{"name":"sustain","type":"float","label":"Sustain","default":0.55,"min":0,"max":1,"step":0.05,"help":"How much of the loop survives each lap. Past about 0.9 the string stops being a string and becomes a drone."},{"name":"brightness","type":"float","label":"Brightness","default":0.6,"min":0,"max":1,"step":0.05,"help":"Where the string is plucked. Near the bridge is bright and thin; over the fretboard is round and dark."},{"name":"spread","type":"float","label":"Stereo spread","default":0.7,"min":0,"max":1,"step":0.05,"help":"How far across the image the notes are placed. Strings recorded close are never all in the same spot."},{"name":"chords","type":"float","label":"Double stops","default":0.18,"min":0,"max":0.6,"step":0.02,"help":"How often two strings are struck at once."},{"name":"volume","type":"float","label":"Volume (dBFS)","default":-12,"min":-36,"max":0,"step":1,"help":"Where the mix sits before the master limiter. 0 dBFS is full scale; everything starts 12 dB below it."}]},{"key":"audio.chord","name":"Chord Progressions","tagline":"A functional-harmony transition matrix, not a random draw \u2014 so it sounds written.","module":"audio","renderer":"audio","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain","audio\/wav"],"params":[{"name":"root","type":"enum","label":"Key","default":"C","options":{"C":"C","C#":"C\u266f \/ D\u266d","D":"D","D#":"D\u266f \/ E\u266d","E":"E","F":"F","F#":"F\u266f \/ G\u266d","G":"G","G#":"G\u266f \/ A\u266d","A":"A","A#":"A\u266f \/ B\u266d","B":"B"}},{"name":"mode","type":"enum","label":"Mode","default":"major","options":{"major":"Major","minor":"Minor"}},{"name":"octave","type":"int","label":"Octave","default":3,"min":2,"max":4,"step":1},{"name":"bars","type":"int","label":"Bars","default":8,"min":4,"max":16,"step":1,"help":"One chord per bar. The last two are the cadence and are not drawn from the chain."},{"name":"tempo","type":"float","label":"Tempo (BPM)","default":84,"min":40,"max":140,"step":1},{"name":"voicing","type":"enum","label":"Voicing","default":"close","options":{"close":"Close (root position)","open":"Open (drop-2)","seventh":"Sevenths","spread":"Spread (bass + triad)"}},{"name":"instrument","type":"enum","label":"Instrument","default":"pad","options":{"pad":"Pad (slow, glassy)","piano":"Electric piano (FM)","organ":"Organ (additive)","strings":"Strings (bowed, detuned)"}},{"name":"sevenths","type":"bool","label":"Sevenths","default":false,"help":"Adds the fourth chord tone. Turns a hymn into something closer to jazz without changing a single root."},{"name":"bass","type":"bool","label":"Bass note","default":true},{"name":"volume","type":"float","label":"Volume (dBFS)","default":-12,"min":-36,"max":0,"step":1,"help":"Where the mix sits before the master limiter. 0 dBFS is full scale; everything starts 12 dB below it."}]},{"key":"audio.drone","name":"Drone","tagline":"Detuned partials, beating slowly against each other.","module":"audio","renderer":"audio","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain","audio\/wav"],"params":[{"name":"root","type":"enum","label":"Root","default":"A","options":{"C":"C","C#":"C\u266f \/ D\u266d","D":"D","D#":"D\u266f \/ E\u266d","E":"E","F":"F","F#":"F\u266f \/ G\u266d","G":"G","G#":"G\u266f \/ A\u266d","A":"A","A#":"A\u266f \/ B\u266d","B":"B"}},{"name":"octave","type":"int","label":"Octave","default":2,"min":1,"max":4,"step":1,"help":"Low is the point. A drone an octave up stops being a floor and starts being a note."},{"name":"partials","type":"int","label":"Partials","default":5,"min":2,"max":10,"step":1,"help":"Harmonics above the root: f, 2f, 3f and so on. Each one is a pair of sines, slightly apart."},{"name":"beating","type":"float","label":"Beat rate (Hz)","default":0.4,"min":0.05,"max":8,"step":0.05,"help":"How often each pair swells, in beats per second. Under 1 Hz it breathes; past 4 it turns into a rattle."},{"name":"movement","type":"float","label":"Movement","default":0.4,"min":0,"max":1,"step":0.05,"help":"How far the partials drift in level and the filter in cutoff over the piece. At zero it is completely static, which is its own kind of useful."},{"name":"tilt","type":"float","label":"Brightness","default":0.45,"min":0,"max":1,"step":0.05,"help":"How much of the upper harmonics survives. Dark is a cello section; bright is an organ with every stop out."},{"name":"spread","type":"float","label":"Stereo spread","default":0.8,"min":0,"max":1,"step":0.05,"help":"The two halves of each beating pair are placed on opposite sides, so the swell moves across the image instead of sitting in the middle."},{"name":"duration","type":"float","label":"Length (seconds)","default":30,"min":8,"max":90,"step":1},{"name":"volume","type":"float","label":"Volume (dBFS)","default":-12,"min":-36,"max":0,"step":1,"help":"Where the mix sits before the master limiter. 0 dBFS is full scale; everything starts 12 dB below it."}]},{"key":"audio.bleep","name":"UI Sounds","tagline":"Success, error, notify, coin \u2014 as a downloadable pack.","module":"audio","renderer":"audio","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain","audio\/wav"],"params":[{"name":"category","type":"enum","label":"Category","default":"mixed","options":{"mixed":"Mixed pack (one of each)","success":"Success \u2014 rising, short, bright","error":"Error \u2014 falling, buzzy, blunt","notify":"Notify \u2014 a single struck bell","coin":"Coin \u2014 the arcade pickup"}},{"name":"count","type":"int","label":"Sounds in the pack","default":6,"min":1,"max":16,"step":1},{"name":"root","type":"enum","label":"Key","default":"C","options":{"C":"C","C#":"C\u266f \/ D\u266d","D":"D","D#":"D\u266f \/ E\u266d","E":"E","F":"F","F#":"F\u266f \/ G\u266d","G":"G","G#":"G\u266f \/ A\u266d","A":"A","A#":"A\u266f \/ B\u266d","B":"B"},"help":"Interface sounds share a room with each other. Pinning them to one key is why a set feels like a set."},{"name":"octave","type":"int","label":"Octave","default":5,"min":3,"max":6,"step":1,"help":"High is the point: small speakers roll off below about 500 Hz, so a bleep an octave down is a bleep nobody hears."},{"name":"brightness","type":"float","label":"Brightness","default":0.5,"min":0,"max":1,"step":0.05,"help":"Moves the waveform from a pure sine towards a square. Sine is soft and modern; square is a games console."},{"name":"length","type":"float","label":"Length","default":0.5,"min":0.2,"max":1,"step":0.05,"help":"Scales every sound. Short is confident \u2014 an interface sound that outlasts the action it confirms feels slow."},{"name":"volume","type":"float","label":"Volume (dBFS)","default":-12,"min":-36,"max":0,"step":1,"help":"Where the mix sits before the master limiter. 0 dBFS is full scale; everything starts 12 dB below it."}]},{"key":"audio.ambient","name":"Generative Ambient","tagline":"A mood preset that evolves and never repeats.","module":"audio","renderer":"audio","version":1,"sensitive":false,"reproducible":true,"uses_entropy":true,"formats":["application\/json","text\/plain","audio\/wav"],"params":[{"name":"mood","type":"enum","label":"Mood","default":"glacier","options":{"glacier":"Glacier \u2014 high, cold, slow","dusk":"Dusk \u2014 warm, low, close","rainfall":"Rainfall \u2014 a floor you can hear through","orbit":"Orbit \u2014 floating, unresolved"}},{"name":"root","type":"enum","label":"Root","default":"D","options":{"C":"C","C#":"C\u266f \/ D\u266d","D":"D","D#":"D\u266f \/ E\u266d","E":"E","F":"F","F#":"F\u266f \/ G\u266d","G":"G","G#":"G\u266f \/ A\u266d","A":"A","A#":"A\u266f \/ B\u266d","B":"B"}},{"name":"duration","type":"float","label":"Length (seconds)","default":60,"min":20,"max":150,"step":5,"help":"Bounded on purpose: the browser renders every sample before it plays anything. Loop it and the fades hide the seam."},{"name":"density","type":"float","label":"Notes per minute","default":14,"min":0,"max":60,"step":1,"help":"How often a single note falls over the pads. Zero leaves the chords and the floor alone, which is the version to work to."},{"name":"bed","type":"float","label":"Floor","default":1,"min":0,"max":2,"step":0.05,"help":"Scales the noise layer. Past 1 the piece becomes weather with chords in it rather than the other way round."},{"name":"spread","type":"float","label":"Stereo spread","default":0.7,"min":0,"max":1,"step":0.05},{"name":"movement","type":"float","label":"Movement","default":0.5,"min":0,"max":1,"step":0.05,"help":"How far the filter over the floor drifts across the piece. It is most of what makes the thing sound alive rather than held."},{"name":"volume","type":"float","label":"Volume (dBFS)","default":-12,"min":-36,"max":0,"step":1,"help":"Where the mix sits before the master limiter. 0 dBFS is full scale; everything starts 12 dB below it."}]}]}